pms的启动在 SystemServer.java中的run()方法
系统服务分三种
**1 引导服务 **
主要包括Installer(辅助启动其他服务的服务),AMS,PMS,LightsService,DisplayManagerService,SensorService等。
2 核心服务
主要包括BatteryService,UsageStatsService(应用统计服务,统计系统中各个应用的使用情况),CachedDeviceStateService(监控设备状态比如屏幕开关,是否在充电),BugreportManagerService(bug上传服务)等。
3 其他服务
顾名思义就是可以延迟启动的服务,这些服务都是异步启动的,主要包括WindowManagerService,VibratorService,InputMethodService等。
主要来看下PMS的启动代码,代码存在于SystemServer.java中
// 系统代码中很多地方出现WatchDog,他是个运行在SystemServer中的线程
// 它主要用来检测系统关键服务是否挂了,还有一个是定时检测线程的消息队列是否长时间处于工作状态,因为线程有可能阻塞了,这些线程包括SystemServer中的 main Thread, UIThread,IoThread,DisplayThread等
try {
Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
// main方法中主要实例化PMS,并将其注册到ServiceManager中
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
} finally {
Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
}
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceEnd();
PMS构造方法中逻辑比较多,关键性的主要有:
1 注册系统应用的ShareUserId,系统应用间共享数据
2 初始化SystemConfig,主要是获取系统配置信息
3 创建PackageHandler,PackageDexOptimizer,并将PackageHandler添加到WatchDog进行监控
# *PackageDexOptimizer中的任务主要由Installer执行,读取Dex文件到/data/dalvik-cache中*
# *启动PackageHandler中的消息循坏,执行app的安装,卸载,更新等*
4 扫描system分区,服务于系统app的更新机制,执行系统APK的安装流程
5 扫描data分区,如果系统OTA后第一次启动会删除data分区下缓存,执行普通APK的安装流程
6 将上述两步扫描到的信息回写到Package.xml中,并且更新到PMS中的mSettings变量中