您的位置:首页 > 其它

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

2017-09-27 18:09 411 查看

问题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方法

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐