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状态更新;