[置顶] 源码阅读---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方法
相关文章推荐
- Android 6.0 AMS分析的第二条线:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互等知识;
- Android系统源码阅读(15):Android 应用进程的启动
- [置顶] Activity启动流程源码分析(应用中)
- [置顶] 源码阅读---AMS与Activity启动流程
- Service启动过程and新进程创建全过程源码分析
- Android Application Launch [ 创建进程--〉绑定App-->启动Activity/Start Service/...]
- [置顶] 源码阅读---Activity生命周期控制
- android源码解析(十六)-->应用进程Context创建流程
- 创建你的第一个安卓应用4 - 第四课 - 启动另外一个activity
- [Chrome源码阅读] 理解Chrome导航网址的流程及render进程启动模式
- [置顶] Activity启动流程源码分析(Launcher中)
- android 启动新 app 的activity 新进程的创建
- 第一个(应用的)组件启动时,(系统)创建主进程(包名)+主线程,Application对象 (一个应用所有组件默认运行在同一个进程)
- android N进程启动流程(一)(捕获输入事件、准备创建activity、焦点切换)
- 从应用启动看Activity的创建过程
- [置顶] nginx源码阅读(五).worker进程的工作循环
- android N进程启动流程(二)(上一个activity的暂停、进程启动、绑定进程与创建application)
- Android系统源码阅读(3):子Activity在进程内的启动过程
- startActivity -进程不在->创建进程->ActivityThread.main->启动主线程消息循环
- [置顶] 源码阅读--package管理与应用安装