apk安装流程
参考:APK安装流程
点击安装的话,简单来说分为四步:
-
1)将APK的信息通过IO流的形式写入到PackageInstaller.Session中(内存上的拷贝)。
-
2)调用PackageInstaller.Session的commit方法,将APK的信息交由PKMS处理。
-
3)拷贝APK(在在handleReturnCode中的mArgs.copyApk(调用doCopyApk)中去拷贝apk里面的文件和so等)
-
4)最后进行安装(processPendingInstall做真正的安装(installPackagesTracedLI去解析apk,安装、校验等))
最后的installPackagesTracedLI安装过程分四个阶段:
-
准备,分析当前安装状态,解析包 并初始校验: 在 preparePackageLI() 内使用 PackageParser2.parsePackage() 解析AndroidManifest.xml,获取四大组件等信息;使用ParsingPackageUtils.getSigningDetails() 解析签名信息;重命名包最终路径 等。
-
扫描,根据准备阶段解析的包信息上下文 进一步解析: 确认包名真实;根据解析出的信息校验包有效性(是否有签名信息等);搜集apk信息——PackageSetting、apk的静态库/动态库信息等。
-
核对,验证扫描后的包信息,确保安装成功:主要就是覆盖安装的签名匹配验证。
-
提交,在commitPackagesLocked函数中提交扫描的包、更新系统状态:添加 PackageSetting 到 PMS 的 mSettings、添加 AndroidPackage 到 PMS 的 mPackages 、添加 秘钥集 到系统、应用的权限添加到 mPermissionManager、四大组件信息添加到 mComponentResolver 。这是唯一可以修改系统状态的地方,并且要对所有可预测的错误进行检测。
apk拷贝:PackageManagerService.installStage---doHandleMessage---startCopy(handleStartCopy(含检验apk完整性)与handleReturnCode(里面调用processPendingInstall进行真正安装))---copyApk---doCopyApk
apk安装:processPendingInstall---processInstallRequestsAsync---installPackagesTracedLI---installPackagesLI
installd: 真正的安装命令是由该进程处理。
路径:frameworks/native/cmds/installd/installd.cpp
POST_INSTALL:消息处理中会发送安装完成的广播;
installPackageWithVerification 检查权限等,
普通应用App安装目录
1、 /data/app:用户App程序安装的目录。安装时Apk会被拷贝至此目录
2.1.2 dex、odex保存目录:
/data/dalvik-cache:App安装的时候会将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,当然,ART–Android Runtime的可执行文件格式为oat,启用ART时,系统会执行dex文件转换至oat文件)
2.1.3 用户数据目录:
/data/data:存放应用程序的数据,无论是系统App还是普通App,App产生的用户数据都存放在/data/data/包名/目录下。
2.1.4 App注册表目录
/data/system :该目录下几个比较重要的文件是:
1、packages.xml文件,类似于Windows的注册表。这个文件是在解析apk时由writeLP()创建的,里面记录了系统的permissions,以及每个apk的name,codePath,flags,ts,version,uesrid等信息,这些信息主要通apk的AndroidManifest.xml解析获取,解析完apk后将更新信息写入这个文件并保存到flash,下次开机直接从里面读取相关信息添加到内存相关列表中。当有apk升级,安装或删除时会更新这个文件。
这个文件在PKMS的启动过程中会被映射成为PKMS中的Settings数据结构,并且在后续的PKMS启动中会围绕着该数据结构进行频繁的操作。
对于一个完整的APK,Android称其为Monolithic;对于拆分后的APK,Android称其为Cluster。