PackageManagerService启动流程

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变量中

你可能感兴趣的:(PackageManagerService启动流程)