【Android-PKMS】APK安装过程

 

【从一个APK安装另一个APK】

首先是从context获得PackageManager句柄,然后调用installPackage()进行安装

ContextImpl.java::getPackageManager()
  pm = ActivityThread.java::getPackageManager(){
    //最终获得PackageManagerService服务
    ServiceManager.getService("package");
  }
  new ApplicationPackageManager.java:ApplicationPackageManager(pm)
}

 ContextImpl::getPackageManager()获得的是ApplicationPackageManager实例,ApplicationPackageManager通过构造函数传入的pm句柄访问PackageManagerService的部分接口。

ApplicationPackageManager.java::installPackage(){
  ApplicationPackageManager.java::installCommon(){
    PackageManagerService.java::installPackageAsUser(){
      PackageManagerService.java::PackageHandler.doHandleMessage(INIT_COPY)
      //MCS=Media Contain Service 
      PackageManagerService.java::PackageHandler.doHandleMessage(MCS_BOUND)
        //拷贝安装
        PackageManagerService.java::HandlerParams.startCopy(){
          PackageManagerService.java::InstallParams.startCopy(){
            //拷贝
            PackageManagerService.java::InstallParams.handleStartCopy(){
              DefaultContainerService.java::getMinimalPackageInfo(){
                PackageHelper.resolveInstallLocation(){
                  //决定目标安装位置
              }}
              PackageManagerService.java::FileInstallArgs.copyApk(){
                PackageManagerService.java::FileInstallArgs.doCopyApk(){
                  DefaultContainerService.java::copyPackage(){
                    DefaultContainerService.java::copyPackageInner(){
                      DefaultContainerService.java::copyFile(){
                        Streams.copy(in, out);
            }}}}}}
            //安装
            PackageManagerService.java::InstallParams.handleReturnCode(){
              PackageManagerService.java::processPendingInstall(){
                mHandler.post(new Runnable()){:
                //安装前准备
                PackageManagerService.java::InstallArgs.doPreInstall()
                //执行安装
                PackageManagerService.java::installPackageTracedLI(){
                  PackageManagerService.java::installPackageLI(){
                    PackageParser.parsePackage()
                    //if replace: 替换安装
                    PackageManagerService.java::replacePackageLIF()
                    //else : 新包安装
                    PackageManagerService.java::installNewPackageLIF(){
                      //扫描Package
                      PackageManagerService.java::scanPackageTracedLI(){
                        PackageManagerService.java::scanPackageLI(){
                          PackageManagerService.java::scanPackageLI(){
                            PackageManagerService.java::scanPackageInternalLI()
                      }}}}
                      //把Package更新到Settings里
                      PackageManagerService.java::updateSettingsLI(){                     
                        PackageManagerService.java::updateSettingsInternalLI(){
                          //更新apk的权限
                          PackageManagerService.java::updatePermissionsLPw()
                          //再次把已安装apk的信息写入/data/system/package.xml
                          Settings.java::writeLPr()
                      }}
                }}
                //安装收尾
                PackageManagerService.java::doPostInstall()
            }}
}}}}}

 要点:

  • PKMS的一个安装入口:PackageManagerService.java::installPackageAsUser()

【adb install】

Pm.java::main(){
  Pm.java::run(){
    Pm.java::runInstall(){
      final InstallParams params = makeInstallParams();
      //打开一个Session
      Pm.java::doCreateSession(){
        PackageInstaller.java::createSession(){
          PackageInstallerService.java::createSession(){
            PackageInstallerService.java::createSessionInternal(){
              PackageInstallerSession.java::PackageInstallerSession(){
        }}}}
      //把要安装的APK写入Session
      Pm.java::doWriteSession(){
        PackageInstaller.java::openSession(){
          PackageInstallerService.java::openSession(){
            PackageInstallerService.java::openSessionInternal(){
              PackageInstallerSession.java::open(){
        }}}
        out = PackageInstaller.java::openWrite(){
          PackageInstallerSession.java::openWrite(){
            PackageInstallerSession.java::openWriteInternal(){
              new RevocableFileDescriptor.java::RevocableFileDescriptor()
          }}
          ParcelFileDescriptor.java::AutoCloseOutputStream()
        }
        while(1){
           in.read(buffer) //从inPath中读取
           out.write(buffer) //写入out
      }}
      //提交:告诉PKMS开始安装
      Pm.java::doCommitSession(){
        PackageInstaller.java::Session.commit(){
          PackageInstallerSession.java::commit(){
            mHandler.obtainMessage(MSG_COMMIT).sendToTarget()
            PackageInstallerSession.java::commitLocked(){
              PackageManagerService.java::installStage(){
                mHandler.sendMessage(INIT_COPY);//往后过程与上节部分重叠
      }}}}}
}}}

要点:

  • adb install会创建一个新进程,从pm.main函数开始执行
  • 先创建与PackageInstallerService的连接
  • PKMS的另一个安装入口:PackageManagerService.java::installStage()

 

 

未完待续……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值