【笔记】 APP Install 流程 相关 简略

1.点击安装:
  1 . 发送Intent(Intent.ACTION_VIEW)
  2 . /package/app/PackageInstaller/ 中的PackageInstallActivity 响应这个Intent
  
  
  
  
  
  
  
  
  
  
  
  PKMS 中的流程:
  PackageManager.installPackage
  1.->PKMS.installPackage
  2.->PKMS.installPackageAsUser
    --(1) 传下userId,所以可以检查当前user 在当前进程下是否有安装权限
    --(2) 检查进程的callingUid 为SHELL_UID 或者ROOT_UID ,就是adb 上安装的,会添加PackageManager.INSTALL_FROM_ADB 的标志位
    --(3) new 一个InstallParams对象(后续apk安装流程就以这个对象为处理单位),installFlags 传进去
    --(4) 创建一个“INIT_COPY”的msg,携带InstallParams对象 ,发送到PackageHandler 来处理

  3.-> PackageHandler.INIT_COPY
    --处理INIT_COPY消息: 主要就是处理DefaultContainerService 这个服务,这个服务的主要作用就是后续apk 源文件的一些copy操作需要以来它
    --(1) 调用connectToService去绑定DefaultContainerService
    --(2) 把之前传下来的InstallParams 放到mPendingInstalls 这个ArrayList 中,它是专门存放需要安装的APK 的InstallParams的数组
  
  4.-> PackageHandler.sendMsg(MCS_BOUND)
  
  5.-> PackageHandler.MCS_BOUND
  
  6.-> PKMS.mPendingInstalls[0].startCopy()
     -- >尝试调用 4 次 HandlerParams.handleStartCopy()
           -- (1).主要通过DefaultContainerService的服务来处理apk 源文件的复制相关,空间是否足够,路径合法等
           -- (2).创建InstallArgs对象,调用InstallArgs.copyApk() 
           -- (3).DefaultContainerService.copyPackage 把apk原始文件copy 到 /data/app 下, 且命名为“base.apk”
           
     --> 调用HandleParams.handleReturnCode()
          -- (1) .通过Handler post 一个消息,异步处理
          -- (2) .此异步消息中调用installPackageLI()
                    (2.1) : 加上SCAN_NEW_INSTALL 的flags ,后续scanPackageDirtyLI () 中会根据这个标志为来判断是否需要dex优化:
                     ------- 1.因为开机流程中中是 scaDirLI-->scanPackageDirtyLI ,所以正常开机时是不会进行dex优化的;
                     ------- 2.第一次开机时进行扫描会加上 force_dex 的flags,PKMS 初始化时就会强制进行扫描;                  
                    (2.2) : 此函数中会调用PackageParser.parsePackage() , 主要就是解析apk 的AndroidManifest.xml 中的信息,生成一个PackageParser.package 对象:
                     ------- 1.PKMS 中,各个pkg 对应的信息都是 PackageParser.package 这个类进行记录的,后续apk信息相关的处理,就是对pkg对应的PackageParser.package 对象 的处理>
                     ------- 2.调用PackageDexOptimizer 进行dex文件的优化相关操作()
        
   
   7.-->PKMS.scanPackageDirtyLI()
          --(1) . activity,service , permission 相关

          --(2) .  forceDex 和 SCAN_NEW_INSTALL 这两个flags 处理是否需要dex
      
   8 .--> PackageHandler.msg(POST_INSTALL) 
       发送ACTION_PACKAGE_ADDED广播,launcher 等通知pkg状态更新;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章