Android 应用和进程

April 20, 2016

Android

在 Android 开发中,默认情况下,一个 App 对应的就是一个进程,但实际上,在一个 App 中可以存在多个进程,多个 App 也可以共享一个进程。

下面是官方文档中对 <application>、<activity> 和 <service> 标签中 android:process 属性的描述:

The name of the process in which the activity should run. Normally, all components of an application run in a default process name created for the application and you do not need to use this attribute. But if necessary, you can override the default process name with this attribute, allowing you to spread your app components across multiple processes.
If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the activity runs in that process. If the process name begins with a lowercase character, the activity will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage.

The <application> element's process attribute can set a different default process name for all components.

默认情况下,咱们在做 Android 开发中,如果没有特别去指定进程的话,所有的 Activity 和所有的 Service 都是运行在默认进程下的,而且是同一个进程。

在 manifest 文件中的 <application> 标签,<activity> 标签和 <service> 标签都有一个 android:process 属性,而默认情况下,咱们是不为这个属性赋值的,在这种情况下,所有的组件运行在同一个进程中。

如果我们为 <application> 标签添加 android:process 属性,并且赋值,那么当前 App 的进程名就被赋值为指定的名字,<application> 下的所有 <activity> 和 <service> 如果没有对 android:process 赋值的话,都运行在和 <application> 相同的进程下。

如果我们为某个 <activity> 或者 <service> 的 android:process 属性赋值,那么该组件就运行在被定义的进程下。在官方文档中是这样说明的,如果 android:process 属性的值是一个以冒号(:)开头的值,那么这个进程是当前这个 App 私有的进程。如果 android:process 属性的值是一个以小写字母开头的值,那么这个进程是全局共享的,这样多个不同的应用可以分享一个进程。

这里有两个需要理解的,一个是私有和共享。私有表示这个进程为当前这个 App 独享,其他 App 无权访问,所以不大需要考虑权限保护的问题。而如果是共享的,表明这个进程将会为其他的 App 提供服务,其他的 App 有可能是一个开发者的多个不同的应用,也可能是不同开发者的应用。在这种情况下,就需要做好对访问权限的控制和保护了。

另外一个需要注意的是,官方文档中之说明了 android:process 需要以小写字母开头,而没有强调 android:process 如果不以冒号(:)开头,那么就必须以包名 + 进程名字的。比如的应用的包名为 com.company.app ,那么 android:process="com.company.app.download" 是合法的,而 android:process="download" 是不合法的。当然 android:process=":download" 也是合法的,但是意思就不一样了。

在 Android 中,所有应用的进程都是由 Zygote 进程 fork 出来的,也就是所有的应用的进程的父进程都是 Zygote 进程,不管这个 App 里有多少个进程,是以冒号(:)开头的,还是以小写字母开头的,都是 Zygote 的子进程,一个 App 的多个进程之间没有父子关系。

Zygote 的父进程是 /init 进程,是 linux 系统的启动进程,linux 系统上所有进程的根进程。

--- EOF ---

添加新评论