深入解析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广播。