深入解析AMS启动

AMS由system_server的ServerThread线程创建,在创建时有四个非常重要的过程:

1.调用AMS的main函数,得到一个context对象

1 context = ActivityManagerService.main(factoryTest);

2.调用setSystemProcess函数,这样可以把system_server进程加到AMS中作统一管理

1 ActivityManagerService.setSystemProcess();

3.调用installSystemProviders函数,把SettingProvider放到system_server进程中来运行

1 ActivityManagerService.installSystemProviders()

4.AMS准备好之后,启动systemReady线程来整个系统的启动

1 ActivityManagerService.self().systemReady(new Runable() {
2     public void run() {
3       startSystemUi(contextF);//启动systemUI,准备状态栏
4       ...
5       Watchdog.getInstance().start();//启动Watchdog
6       ...//调用其他服务的systemReady函数
7    }

AMS的main函数主要的工作是:

1.创建AMS对象;

2.创建一个供system_server进程使用的Android运行环境。这个比较隐晦,这个Android运行环境主要包括两个类成员:ActivityThread 和 ContextImpl 。

其中Activitythread 就是大名鼎鼎的进程的主线程了,ContextImpl 代表的是一个上下文环境,通过它们的类成员可以简单的知道它们的作用。

ActivityThread
---------------
-mSystemContext: ContextImpl
-mLooper: Looper // 消息循环
-mServices: HashMap<IBinder,Service> //用于保存Service
-mInitialApplication: Application
-mAllApplications: ArrayList<Application> //用于保存Application
-mActivites: HashMap<IBinder,ActivityClientRecord> //保存ActivityClientRecord
ContextImpl
--------------
-mResources: Resources
-mPackageInfo : LoadedApk 
-mMainThread: ActivityThread
-mDatabaseDir: File
-mFileDir: File

对于ContextImpl ,其成员变量表明它和资源、APK文件有关


AMS的setSystemProcess函数

setSystemProcess函数主要的工作是

1.注册AMS、MemBinder(内存信息)、GraphicsBinder(硬件加速信息)、CpuBinder、PermissionController(权限控制)等服务到ServiceManager中.

2.根据PackageManagerService返回的ApplicationInfo初始化Android运行环境,并创建一个代表system_server进程的ProcessRecord,从此,system_server进程也并入AMS的管理范围内了。

installSystemProviders函数

其实这个函数就是用于启动SettingProvider,并把其并入到system_server 所在进程中,由于system_server进程已经加载了framework-res.apk,现在又要加载SettingProviders.apk,这里是同一个进程加载两个apk的情形,两者uid都是“system”。因为system_server进程中很多Service都依赖Settings数据库,放在同一进程中可以降低进程间通信带来的效率损失。

AMS的systemReady分析

systemReady函数主要负责启动整个系统,包括一些准备工作,内容很多,大概有这么几步:

1.发送并处理与PRE_BOOT_COMPLETED广播相关的事情

2.杀死哪些在AMS还未启动完毕就先启动的应用进程,这些进程是APK所在的java进程,而不是Native 进程

3.从Setting数据库中获取配置信息,主要是debug_app、wait_for_debugger、always_finish_activities、font_scale

4.调用systemReady设置的回调对象goingCallback的run函数,这个函数主要是启动systemUIService,启动watchdog等

5.启动那些声明了persistent的APK。

6.启动桌面,发送BOOT_COMPLETED广播。

posted @ 2015-04-29 21:51  Simba.Chen  阅读(1165)  评论(0编辑  收藏  举报