应用程序进程简介
要想启动一个应用程序,首先要保证这个应用程序所需要的应用进程已经启动。AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求 Zygote 进程启动需要的应用程序进程。在应用程序进程创建的过程中除了获取虚拟机实例外,还创建了 Binder 线程池和消息循环,这样运行在进程中的应用程序就可以方便地使用 Binder 进行进程间通信以及处理消息了
应用进程启动过程介绍
应用程序进程创建过程分为两个部分来讲解,分别是 AMS 发送启动应用程序进程请求,以及 Zygote 接收请求并创建应用程序进程
AMS发送启动应用程序进程请求
AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
statrtProcessLocked
int uid = app.uid: 获取要创建的应用程序进程的用户ID
if(ArrayUtils.isEmpty(permGids)){...}
...
gids[2] = UserHandle.getUserGid(UserHandle.getUserId(uid)): 对用户组ID(gids) 进行创建和赋值
if(entryPoint == null) entryPoint = "android.app.ActivityThread": 这个值是应用程序进程主线程的类名
stratResult = Process.start(entryPoint, app.processName, uid,uid,gids,debugFlags,mountExternal,app.info.targetSdkVersion,seInfo,requiredAbi,instructionSet,app.info.dataDir,invokeWith,entryPointArgs): 启动应用程序进程,将得到的应用程序进程用户ID 和 用户组ID传进去
在 Process 的 start 方法中只调用了 ZygoteProecess 的 start 方法,其中 ZygoteProcess 类用于保持与 Zygote 进程的通信状态
ZygoteProcess 的 start 方法调用了 startViaZygote 方法
ArrayList<String> argsForZygote = new ArrayList<String>(): 创建字符串列表 argsForZygote, 并将启动应用进程的启动参数保存在 argsForZygote 中,方法的最后会调用 zygoteSendArgsAndGetResult 方法
zygoteSendArgsAndGet