android系统启动流程
3.2 ActivityManagerService之setSystemProcess
回顾下ActivityManagerService在systemserver中的第二个动作:
下面看下setSystemProcess的实现
Context.ACTIVITY_SERVICE在
\\frameworks\\base\\core\\java\\android\\content\\Context.java中的定义:
则其他地方可以通过ServiceManager.getService(\或
Context.ACTIVITY_SERVICE*/)来使用ActivityManagerService的单例mSelf。
另外framework-res.apk的包名是android,可以查看\\frameworks\\base\\core\\res\\下的Android.mk和AndroidManifest.xml。
11 / 41
android系统启动流程
3.3. ActivityManagerService之setWindowManager
回顾下ActivityManagerService在systemserver中的第4个动作: (第三个动作是installSystemProviders,偏离主题太远,跳过)
这样一来ActivityManagerService和ActivityStackSupervisor都得到了全局WindowManagerService的实例.
3.4 ActivityManagerService之systemready
回顾下ActivityManagerService在systemserver中的第5个动作:
systemready方法在ActivityManagerService的main方法中调用startRunning的时候被调用了一次,但是并没有执行,所以真正执行systemready还是要按看这里。 下面分析systemready的具体实现
12 / 41
android系统启动流程
3.4.1 启动所有Persistent属性的APK
进入\\frameworks\\base\\services\\java\\com\\android\\server\\pm\\PackageManagerService.java:
这个函数将遍历所有apk,具备Persistent属性,且当前不是安全模式启动,或者这个apk同时是system属性,就会被load加入list列表
13 / 41
android系统启动流程
回到ActivityManagerService.java看下addAppLocked如何拉起这些apk的进程:
3.4.2 启动launcher
调用mStackSupervisor.resumeTopActivitiesLocked();真正开始启动luancher. 注意如果luancher具备了persistent属性,则显然luancher的进程已经先于activity的调用被拉起来了。
这里产生了一个问题:
mStackSupervisor.resumeTopActivitiesLocked()这个动作在拉起所有persistent属性的apk之后,如果luancher也具备这个属性,是不是意味着luancher的进程一定会先于后面这个动作先启动?
答案是不一定,这里先解答一下。启动进程的startProcessLocked是通过socket通讯去通知底层zygote进程创建子进程,而这个通知发出后,该函数就直接返回了,连执行结果都不需要等待,所以下面到底何时能创建这个子进程,要看子进程有多少,排在第几位,何时socket得到响应。所以不排除,真正启动luancher进程的动作比后面这个mStackSupervisor.resumeTopActivitiesLocked要慢。
14 / 41
android系统启动流程
4 ActivityStackSupervisor启动launcher
相关源代码路径:
\\frameworks\\base\\services\\java\\com\\android\\server\\am\\ActivityStackSupervisor.java
\\frameworks\\base\\services\\java\\com\\android\\server\\am\\ ActivityStack.java
4.1首先回顾一下ActivityStackSupervisor实例的初始化
1) ActivityStackSupervisor实例构造:
systemserver调用ActivityManagerService的main,后者在最后创建了ActivityStackSupervisor实例 ActivityManagerService.main
ActivityStackSupervisor的构造函数:
这里ActivityStackSupervisor在构造时记录了ActivityManagerService创建的service实例,全局context,和looper.
2) setWindowManager设置窗口管理
systemserver自己创建了WindowManagerService实例:
systemserver调用ActivityManagerService的setWindowManager,后者则内部调用了ActivityStackSupervisor的setWindowManager ActivityManagerService. setWindowManager:
ActivityStackSupervisor. setWindowManager:
注意这里不仅仅是记录了这个全局的WindowManagerService,还创建了一个home属性的activity栈空间,mHomeStack,并加入到mStacks,但这里仅仅是mStacks这个
15 / 41