源码阅读---Activity启动中应用进程的创建

问题1

追踪Activity启动流程的过程中,在StartSpecificActivityLocked方法中如果应用进程没有启动的话会去先启动进程。对于同一个应用中的Activity跳转,不特殊指定(使用android:process属性)的话是不会走这一流程,但在Launcher启动应用时会创建进的进程。另一种情况:一个应用APP1启动另一个应用APP2中的Activity,不指定NEW_TASK和lanchMode的情况下,activity会共用当前Task,那会共用进程吗?

这里写图片描述

可以看到两个Activity处于不同的进程中ProcessRecord{13b9c682 1986:org.buddha.wise/u0a128}和ProcessRecord{2bcd90f6 1907:com.example.seedinwind.mystudy/u0a129}

在StartSpecificActivityLocked中

ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);
if (app != null && app.thread != null) {
   ....
   return;
}      
mService.startProcessLocked(r.processName,r.info.applicationInfo, true,0,"activity",r.intent.getComponent(), false, false, true);          

当app != null && app.thread != null时会走创建进程的流程。获取app时,会用到r.processName,看一下ActivityRecord的构造

if ((aInfo.flags&ActivityInfo.FLAG_MULTIPROCESS) !=     0&& _caller != null&& (aInfo.applicationInfo.uid == Process.SYSTEM_UID|| aInfo.applicationInfo.uid == _caller.info.uid)) {
                processName = _caller.processName;
            } else {
                processName = aInfo.processName;
            }

当被启动的系统应用或要启动的应用与被启动的是有相同的uid(而且Activity在Manifest文件设置了MultiProcess属性)才会与当前进程有相同的进程名称,上面例子对应的进程名称和进程uid分别是org.buddha.wise/u0a128和com.example.seedinwind.mystudy/u0a129,所以会为APP2启动新的进程。

问题2

使用android:process属性,指定进程是怎么实现的?

这里写图片描述

这里写图片描述

需要注意的是当一个应用对应多个进程时,Application对象会创建多次,因为进程创建后会与应用端进行绑定操作,期间会创建Application对象

可以看到启动了两个进程,都对应相同的uid–u0a129,这里因为Activity设置了android:process属性更改了进程名,所以会启动一个新的进程。默认不设置时进程名与应用包名一致。以下是processName属性的定义

ComponentInfo

/**
* The name of the process this component should run    *in.
* From the "android:process" attribute or, if not *set, the same
* as <var>applicationInfo.processName</var>.
*/
public String processName;

ApplicationInfo

 /**
     * The name of the process this application should run in.  From the
     * "process" attribute or, if not set, the same as
     * <var>packageName</var>.
     */
public String processName;

但是如果是同时设置了multiProcess属性,这个Activity不会重启一个新的进程:
这里写图片描述

进程创建与应用启动流程

1.创建进程:创建ProcessRecord对象并保存到相应数据结构。调用本地方法启动进程
2.在进程启动后,主线程会执行ActivityThread中的main方法(类似于java中的main函数,这是应用的入口)。这里会启动主线程的消息循环,创建ActivityThread对象并调用attach()方法,这里会通过Binder机制调用WMS的attachApplication与之前创建的ProcessRecord进行关联,并异步回调ActivityThread的bindApplication方法。如果进程正在启动Activity会调用ActivityStackSupervisor的attachApplicationLocked方法处理Activity的生命周期流程
3.ActivityThread.bindApplication触发应用端的初始化工作,包括初始化上下文环境–创建ContextImpl,创建Instrumentation对象,创建Application对象并调用期onCreate方法

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值