Android进阶解密读书笔记(三)—— 应用程序进程启动过程

应用程序进程简介

要想启动一个应用程序,首先要保证这个应用程序所需要的应用进程已经启动。AMS 在启动应用程序时会检查这个应用程序需要的应用程序进程是否存在,不存在就会请求 Zygote 进程启动需要的应用程序进程。在应用程序进程创建的过程中除了获取虚拟机实例外,还创建了 Binder 线程池和消息循环,这样运行在进程中的应用程序就可以方便地使用 Binder 进行进程间通信以及处理消息了

应用进程启动过程介绍

应用程序进程创建过程分为两个部分来讲解,分别是 AMS 发送启动应用程序进程请求,以及 Zygote 接收请求并创建应用程序进程

AMS发送启动应用程序进程请求

AMS 会通过调用 startProcessLocked 方法向 Zygote 进程发送请求

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

  1. statrtProcessLocked

    1. int uid = app.uid: 获取要创建的应用程序进程的用户ID

    2. if(ArrayUtils.isEmpty(permGids)){...}

      ...

      gids[2] = UserHandle.getUserGid(UserHandle.getUserId(uid)): 对用户组ID(gids) 进行创建和赋值

    3. if(entryPoint == null) entryPoint = "android.app.ActivityThread": 这个值是应用程序进程主线程的类名

    4. stratResult = Process.start(entryPoint, app.processName, uid,uid,gids,debugFlags,mountExternal,app.info.targetSdkVersion,seInfo,requiredAbi,instructionSet,app.info.dataDir,invokeWith,entryPointArgs): 启动应用程序进程,将得到的应用程序进程用户ID 和 用户组ID传进去

  2. 在 Process 的 start 方法中只调用了 ZygoteProecess 的 start 方法,其中 ZygoteProcess 类用于保持与 Zygote 进程的通信状态

  3. ZygoteProcess 的 start 方法调用了 startViaZygote 方法

    1. ArrayList<String> argsForZygote = new ArrayList<String>(): 创建字符串列表 argsForZygote, 并将启动应用进程的启动参数保存在 argsForZygote 中,方法的最后会调用 zygoteSendArgsAndGetResult 方法

    2. zygoteSendArgsAndGet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值