目录
1.PackageManagerService 功能
负责系统中Package的管理,应用程序的安装、卸载、信息查询等。
PackageManagerService构造函数
PackageDexOptimizer:dex优化
OnPermissionChangeListeners:权限变化监听器
SystemConfig:实例化时,会去解析权限配置文件等 (修改默认运行时权限:/system/etc/default-permissions/)
mSystemPermissions:存系统权限;
mAvailableFeatures:存系统特征
mDefaultPermissionPolicy:默认权限
mIsUpgrade:判断是否是升级了
PackageParser.parsePackage (在scanDirLI中由parallelPackageParser.submit调用。会扫描/system,vendor,oem,)
把除开机向导的apk的一些优先级设置为0;
updateAllSharedLibrariesLPw:更新共享库路径;
updatePermissionsLPw(null, null, StorageManager.UUID_PRIVATE_INTERNAL, updateFlags); 汇总并更新和 Permission 相关的信息,如果SDK版本更新了,需要重新获取权限;
主要内容
扫描前准备:初始化一些后期需要用到的数组等;
SharedUserSetting 存应用权限相关信息
第一阶段:XML文件扫描 (解析的数据用/data/system/packages.xml存储应用权限信息,/data/system/packages.list存储包名等简要信息)
解析这里的文件 /system/etc/permissions (在SystemConfig 构造函数中调用readPermissionsFromXml解析权限)
readLPw 生成一些备份文件
第二阶段:扫描系统中的 APK,并对apk做解析
调用scanDirLI 扫描目录、parsePackage 解析apk中的资源
第三阶段:将第二阶段收集的信息再集中整理一次,比如将有些信息保存到文件中。
updatePermissionsLPw //汇总并更新和 Permission 相关的信息,
mSettings.writeLPr()//将信息写到 package.xml、package.list 及 package-stopped.xml 文件中
readLPw()会扫描下面5个文件
1) "/data/system/packages.xml"
2) "/data/system/packages-backup.xml"
3) "/data/system/packages.list"
4) "/data/system/packages-stopped.xml"
5) "/data/system/packages-stopped-backup.xml"
简单的作用描述如下:
-
packages.xml:PKMS 扫描完目标文件夹后会创建该文件。当系统进行程序安装、卸载和更新等操作时,均会更新该文件。该文件保存了系统中与 package 相关的一些信息。
-
packages.list:描述系统中存在的所有非系统自带的 APK 的信息。当这些程序有变动时,PKMS 就会更新该文件。
-
packages-stopped.xml:从系统自带的设置程序中进入应用程序页面,然后在选择强制停止(ForceStop)某个应用时,系统会将该应用的相关信息记录到此文件中。也就是该文件保存系统中被用户强制停止的 Package 的信息。
scanPackageLI:
非系统 Package
dexopt
优化会监听 /system/framework, /system/app, /data/app, /data/app-private
========
apk安装流程
参考:APK安装流程
点击安装的话,简单来说分为四步:
-
1)将APK的信息通过IO流的形式写入到PackageInstaller.Session中。
-
2)调用PackageInstaller.Session的commit方法,将APK的信息交由PKMS处理。
-
3)拷贝APK
-
4)最后进行安装
apk拷贝:PackageManagerService.installStage---doHandleMessage---startCopy(handleStartCopy与handleReturnCode(里面调用processPendingInstall进行真正安装))---copyApk---doCopyApk
apk安装:processPendingInstall---processInstallRequestsAsync---installPackagesTracedLI---installPackagesLI---
installd: 真正的安装命令是由该进程处理。
路径:frameworks/native/cmds/installd/installd.cpp
POST_INSTALL:消息处理中会发送安装完成的广播;
installPackageWithVerification 检查权限等,
主要类说明:
IPackageManager--ActivityThread.getPackageManager---PackageManagerService
queryIntentServicesInternal 最终在PackageManagerService中执行。
给应用配置默认权限:Android 给 app默认权限(不弹窗申请权限),