多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
PKMS作为系统的核心服务,由SystemServer创建,相关代码如下: **SystemServer.java** ~~~ ......//ServerThread的run函数 /* 4.0新增的一个功能,即设备加密(encrypting the device),该功能由 系统属性vold.decrypt指定。这部分功能比较复杂,本书暂不讨论。 该功能对PKMS的影响就是通过onlyCore实现的,该变量用于判断是否只扫描系统库 (包括APK和Jar包) */ StringcryptState = SystemProperties.get("vold.decrypt"); booleanonlyCore = 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); booleanfirstBoot = 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函数,它是核心函数,此处单独用一节进行分析。