【Android-PKMS】启动分析

【注】

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目录
发布了106 篇原创文章 · 获赞 27 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/menghaocheng/article/details/104135400