【注】
PKMS=PackageManagerService
PMS=PowerManagerService
PKMS负责Android系统中Package的安装、升级、卸载、查询功能。
【PKMS的启动】
PKMS作为系统的核心服务,由SystemServer创建
按函数的嵌套调用关系化简PKMS的启动流程
SystemServer.java::run(){ //P0:SystemServer入口系统
SystemServer.java::startBootstrapServices(){ //P11:启动boot阶段服务
PackageManagerService.java::main(){ //P12:PKMS的入口函数(静态)
m = new PackageManagerService() //P13:调用PKMS的构造函数
ServiceManager.java::addService("package", m) //P14:添加“package"服务
pmn = m.new PackageManagerNative() //P15:调用PKMS Native构造函数
ServiceManager.java::addService("package_native", pmn) //P16:添加“package_native”服务
}}
SystemServer.java::startOtherServices(){ //P21:启动其他服务
OtaDexoptService.java::main(mSystemContext, mPackageManagerService); //P22:启动OTA服务
PackageManagerService.java::updatePackagesIfNeeded(); //P23:更新Packages
PackageManagerService.java::performFstrimIfNeeded() //P24:
PackageManagerService.java::systemReady(); //P25:宣告准备就绪
ActivityManagerService::systemReady(){ //P26:AMS宣告准备就绪
PackageManagerService.java::waitForAppDataPrepared() //P27:等待App的数据
}}}
其中P13:调用PKMS的构造函数比较长,主要工作是:
- 前期准备
- 扫描Packages
【PackageManagerService构造函数】
PackageManagerService.java::PackageManagerService(){
//P1.1:扫描etc/sysconfig /etc/permissions等目录中的xml文件,提取权限、特性等系统配置
SystemConfig.java::getInstance(){
SystemConfig.java::SystemConfig(){
SystemConfig.java::readPermissions(){
SystemConfig.java::readPermissions(){
SystemConfig.java::readPermissionsFromXml(){
//解析"group"/"permission"/"assign-permission"/"library"/"feature"等
}}}}}
//P1.2:扫描系统Package目录:/system/frameword /system/priv-app /system/app system/vendor/app
//oem/app,普通模式下还要扫描非系统Package目录:/data/app /data/priv-app
PackageManagerService.java::scanDirTracedLI(){
PackageManagerService.java::scanDirLI(){
//P3:提取Package的信息,完成私有财产的公有化改造
PackageManagerService.java::scanPackageLI(){
//P4.1:解析Package
PackageParser::parsePackage(){
PackageParser::parsePackage(){
PackageParser::parseClusterPackage(){
PackageParser::parseClusterPackageLite()
PackageParser::parseSplitApk(){
//解析指定APK的AndroidManifest.xml文件
parser = AssetManager.java::openXmlResourceParser("AndroidManifest.xml")
PackageParser::parseSplitApk(parser ){
PackageParser::parseSplitApplication(){
//解析AndroidManifest.xml中声明的 "activity"、"receiver"、"service"、
//"provider"、"activity-alias"、"meta-data"、"uses-static-library"、
//"uses-library"等
}}}}}}
//P4.2:扫描Package
PackageManagerService.java::scanPackageLI(){
PackageManagerService.java::scanPackageInternalLI() //扫描父Package
PackageManagerService.java::scanPackageLI(){ //扫描子Package
PackageManagerService.java::scanPackageLI(){
PackageManagerService.java::scanPackageDirtyLI(){
PackageManagerService.java::commitPackageSettings(){
}}}}
}}}}}
要点:
- 扫描/etc/sysconfig、/etc/permission目录,提取权限、特性配置
- 扫描/system/framework、/system/priv-app、/system/app、/system/vendor/app等系统目录,提取Package信息
- 普通模式下扫描/data/app、/data/priv-app目录