今天总结下 Android 多进程运行机制以及 IPC 介绍,内容如下:
- Android 中的进程
- Android IPC 介绍
- 开启多进程模式
- Android 多进程运行机制
Android 中的进程#
首先进程可以理解为独立运行的程序,当某个程序启动时,系统将会为该程序创建一个进程,并为其分配所需的系统资源,同时将该进程添加到进程就绪队列中,进程调动程序负责运行哪一个进程。
Android 中的应用程序可以为一个进程,也可以配置成多进程,每个进程都在自己独立的空间中运行,Android 为每个进程分配一个虚拟机,不同的虚拟机在内存分配上有不同的地址空间,不同的进程自然涉及到进程间通信。
Android 中的进程如下:
- 前台进程:可与用户直接交互或与前台绑定的 Service 所在的进程;
- 可见进程:用户可见但是不可点击;
- 服务进程:后台执行的 Service 所在的进程;
- 后台进程:相对于前台进程而言的进程;
- 空进程:理解为一种缓存意义上的进程,系统随时可以选择回收空进程。
其优先级为前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程。
Android IPC 介绍#
IPC (Inter-Process Communication) 指的是进程间通信或跨进程通信,任何一个操作系统都需要相应的 IPC 机制来完成进程间通信,如 Windows 上可以通过剪切板、管道等来完成进程间通信,Linux 上可以通过信道、共享内存、信号量来进行进程间通信 Android 虽然基于 Linux,但是为了适应移动端的特点,专门提供了一种进程间通信方式 Binder,所以说到 Android 中的 IPC 机制,一般指的就是 Android 中的 Binder 机制。
IPC 使用场景:
- 某些应用自身需要采用多进程模式,如在 Android 中对一个应用获取的最大内存做了限制,为了使自己的应用获取更多内存空间而将一些模块放在独立进程中,此时模块之间的交互就需要进程间通信来完成;
- 应用本身需要跨进程与其他应用交互,无论是使用 ContentProvider 还是 AIDL 都属于 IPC 的范畴,如在 Android 机顶盒 IPTV 中间件中就有大量使用。
注意:Android 对应用内存的限制不同厂商不同,默认分配的初始内存是 16M,具体配置在 system/build.prop 文件中。
开启多进程模式#
Android 中开启多进程是在四大组件中配置 android:process
属性来开启多进程,配置时可以配置成私有进程和全局进程,如下:
<!--私有进程-->
<!--com.manu.progress:remote-->
<activity
android:name="com.manu.process.SampleActivity"
android:process=":remote"/>
<!--全局进程-->
<!--com.manu.remote-->
<activity
android:name="com.manu.process.SampleActivity"
android:process="com.manu.remote"/>
如果配置成私有进程,则其他应用的组件不可与其跑在同一个进程中,如果配置全局进程,则可以将两个应用设置成相同的 ShareUID 将两个应用的组件运行在同一个进程中,除此之外这两个应用的签名也得相同,这样将可将两个应用的组件运行在同一进程中,且可以共享私有数据如 data 目录等。
那么怎么将两个应用的组件配置在同一进程呢?
- 两个应用设置相同的 ShareUID
- 两个应用的两个组件的进程设置成进程名相同的全局进程
- 两个应用签名相同
测试过程中发现,如果一个进程已经启动了,在启动一个配置同一进程的组件时,第二个应用程序会异常退出,这一点还需阅读源码进一步了解原因.
- 怎么将两个应用的组件配置在同一进程呢?
Android 多进程运行机制#
Android 为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本,也就是说在两个进程中存在着同一个类的两个副本,这两个类互不干扰,修改一个不会影响另一个,这就导致了一个问题,即运行在不同进程中的四大组件,只要它们之间通过内存来共享数据,都会共享失败,多进程造成的问题如下:
- 静态成员和单例模式完全失效
多进程中在着一个类的多个副本,修改互不影响,自然无法生效;
- 线程同步机制完全失效
线程同步机制锁住的不是一个对象,自然无法生效;
- SharePreference 的可靠性下降
SharePreference 虽然可以设置 MODE_MULTI_PROCESS 支持多进程,但是并不推荐使用,因为在某些版本上不生效,在 API 23 之后已被废弃,所以使用 MODE_MULTI_PROCESS 支持 SharePreference 多进程是不靠谱的,解决方案是使用 ContentProvider 作为中间层来使的 SharePreferences 来支持多进程。
具体就是其他进程通过 ContentProvider 来访问另一个进程,而数据是存储在 SharePreference 中的,可通过 Contentprovider 实现增删查改来对数据进行操作。
- Application 多次创建
当一个组件运行到一个新的进程时,创建进程的过程实际上就是一个应用启动的过程,自然会使得 Application 多次创建,可以这样理解为运行在同一进程中的组件是属于同一个虚拟机和同一个 Application 的,不同进程中的组件属于多个虚拟机和 Application。
Application 的 onCreate 方法一般用来初始化操作,如果多次调用 Application 的 onCreate 方法,为避免出错,可根据进程名判断再进行相关初始化。
上文是对 Android 多进程运行机制及 IPC 的介绍,Android 中 IPC 方式实现方式有 Bundle、文件传输、AIDL、Messenger、ContentProvider 等方式,这部分内容将在后续进行整理和分享。