android系统启动流程
可见systemsever的工作基本都是在ServerThread内完成的.
其中我们所需要关注的是ActivityManagerService,正是这个类的启动,最终完成了launcher的启动;下面接着分析ActivityManagerService在ServerThread内的5个主要步骤。
3 ActivityManagerService工作内容分析
这个分析,对应其在ServerThread内的5个步骤,重点是其如何systemReady完成launcher的启动。
从上面systemserver的分析可以看到,systemserver最后也调用了ActivityManagerService的systemReady,那么systemReady到底 是如何启动launcher的? 源代码路径:
\\frameworks\\base\\services\\java\\com\\android\\server\\am\\ActivityManagerService.java
6 / 41
android系统启动流程
3.1 ActivityManagerService之main
回顾下ActivityManagerService在systemserver中的第一个动作:
下面进入ActivityManagerService的main方法:
ActivityManagerService的main方法完成以下几个事情:
3.1.1创建ActivityManagerService实例
ActivityManagerService实例是通过AThread这个内部类创建的;这里我们看下AThread是如何创建这个实例的。
AThread是在其run方法中创建的ActivityManagerService实例,AThread. start被执行的时候,run方法就被调用,从而完成创建ActivityManagerService实例。
7 / 41
android系统启动流程
ActivityManagerService在创建了实例后,self函数就直接返回该实例:
3.1.2 创建ActivityThread实例,获取全局Context
调用ActivityThread类的systemMain创建ActivityThread实例,再调用getSystemContext获得context
\\frameworks\\base\\core\\java\\android\\app\\ActivityThread.java
这个context是ActivityThread下的全局context,所有的上下文都继承于此。
8 / 41
android系统启动流程
扩展一:为什么这里要创建一个ActivityThread线程?
ActivityThread类故名思议是处理activity生命周期内的活动的线程,
ActivityManagerService运行在systemserver进程内,为什么需要创建ActivityThread线程? 实际上systemserver.java下有一个startSystemUi,这个函数本身启动一个service处理了很多系统级的临时弹出消息,这些有一部分也处理为activity,他们的运行同样需要ActivityThread;同时其他aitivity的一些善后的工作也需要ActivityManagerService来处理;所以这个systemserver进程就需要 这么一个ActivityThread线程,换句话说,这个线程放在systemsever内创建也是可以的。ActivityManagerService实际需要的是ActivityThread下的全局conntext(即getSystemContext的结果).
扩展二: ActivityThread类是如何工作的? 这个知识点较多,放到后面再分析..
但是这里需要提前讲一下的是ActivityThread的基本原理和意义:
ActivityThread是所有应用层activity启动时所创建的进程所启动的专门管理activity生命周期事务的线程;有一个activity运行 就有一个进程,就有一个ActivityThread;
ActivityThread有一个main方法,这是app层activity创建该线程的入口,最后通过attach方法进行回调,通知上层进程和线程都创建起来了(你可以显示了)。 而ActivityManagerService是通过systemMain来创建的线程,进程则不需要创建了,因位他本来就是zygote拉起的systemserver进程的一部分。
可见,本质上是一样的,只是ActivityManagerService和app层activity创建线程的入口不同,权限不同。
以上其实就是所谓的android运行时环境,把进程的处理放在后台,普通java程序员根本不需要知道进程概念,只需要知道android环境就够了。
9 / 41
android系统启动流程
3.1.3创建ActivityStackSupervisor实例
记录到mStackSupervisor,ActivityStackSupervisor是启动launcher的直接起点,放到
后面讲.
3.1.4调用startRunning
这里的systemReady(null)不会被执行. ,这里完成初始化的参数值得注意: mTopComponent:栈顶Component为空 mTopAction:栈顶动作是: Intent.ACTION_MAIN mTopData:栈顶activity数据为空
10 / 41