4.2 初识PackageManagerService
PKMS作为系统的核心服务,由SystemServer创建,相关代码如下:
[—>SystemServer.java]
……//ServerThread的run函数
/*
Android 4.0新增的一个功能,即设备加密(encrypting the device),该功能由
系统属性vold.decrypt指定。这部分功能比较复杂,本书暂不讨论。
该功能对PKMS的影响就是通过onlyCore实现的,该变量用于判断是否只扫描系统库
(包括APK和Jar包)
*/
String cryptState=SystemProperties.get("vold.decrypt");
boolean onlyCore=false;
//ENCRYPTING_STATE的值为trigger_restart_min_framework
if(ENCRYPTING_STATE.equals(cryptState)){
……
onlyCore=true;
}else if(ENCRYPTED_STATE.equals(cryptState)){
……//ENCRYPTED_STATE的值为1
onlyCore=true;
}
//①调用PKMS的main函数,第二个参数用于判断是否为工厂测试,我们不讨论这种情况,
//假定onlyCore的值为false
pm=PackageManagerService.main(context,
factoryTest!=SystemServer.FACTORY_TEST_OFF, onlyCore);
boolean firstBoot=false;
try{
//判断本次是否为初次启动。当Zygote或SystemServer退出时,init会再次启动
//它们,所以这里的firstBoot是指开机后的第一次启动
firstBoot=pm.isFirstBoot();
}
……
try{
//②做dex优化。dex是Android上针对Java字节码的一种优化技术,可提高运行效率
pm.performBootDexOpt();
}
……
try{
pm.systemReady();//③通知系统进入就绪状态
}
……
}//run函数结束
以上代码中共有4个关键调用,分别是:
PKMS的main函数。这个函数是PKMS的核心,稍后会重点分析它。
isFirstBoot、performBootDexOpt和systemReady。这3个函数比较简单。学完本章后,读者可完全自行分析它们,故这里不再赘述。
首先分析PKMS的main函数,它是核心函数,此处单独用一节进行分析。