Android Framework | 一种新型的应用启动机制:USAP

本文分析基于Android R前言一说到应用启动,估计大伙儿就会想到zygote进程。确实,正如其中文释义“受精卵”一样,其主要的作用就是孵化出一个又一个的应用进程。传统的应用启动模式由system_server中的AMS接收请求,之后通过socket告知zygote,让其完成fork动作,这样新进程便创建出来。不过从Android Q(10)开始,Google引入了一种新的机制:USAP(Unspecialized App Process)。通过prefork的方式提前创建好一批进程,当有应用
摘要由CSDN通过智能技术生成

本文分析基于Android R

前言

一说到应用启动,估计大伙儿就会想到zygote进程。确实,正如其中文释义“受精卵”一样,其主要的作用就是孵化出一个又一个的应用进程。

传统的应用启动模式由system_server中的AMS接收请求,之后通过socket告知zygote,让其完成fork动作,这样新进程便创建出来。不过从Android Q(10)开始,Google引入了一种新的机制:USAP(Unspecialized App Process)。通过prefork的方式提前创建好一批进程,当有应用启动时,直接将已经创建好的进程分配给它,从而省去了fork的动作,因此可以提升性能。

这种机制在AOSP的源码中默认是关闭的,但估计很多手机厂家已经提前尝鲜了。

目录

1. USAP进程的工作流程

当开启USAP的功能后,zygote会维护一个进程池,其中最多可容纳10个USAP进程。以下是根据图示罗列的详细工作流程。

  1. Zygote首先会fork出10个进程,将其加入到进程池中。被创建出来的USAP进程并不会执行具体逻辑,而是等待socket通信的到来。不过有一个细节,在等待socket通信之前,USAP进程会提升调度优先级,这样如果应用需要启动时,它能以最快的速度响应。
635  private static Runnable usapMain(LocalServerSocket usapPoolSocket,
636                                  FileDescriptor writePipe) {
637     final int pid = Process.myPid();
638     Process.setArgV0(Process.is64Bit() ? "usap64" : "usap32");
639  
640     LocalSocket sessionSocket = null;
641     DataOutputStream usapOutputStream = null;
642     Credentials peerCredentials = null;
643     ZygoteArguments args = null;
644  
645     // Change the priority to max before calling accept so we can respond to new spec
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值