PackageManagerService学习总结

目录

1.PackageManagerService 功能

PackageManagerService构造函数

主要内容

readLPw()会扫描下面5个文件

dexopt

apk安装流程



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"

简单的作用描述如下:

  1. packages.xml:PKMS 扫描完目标文件夹后会创建该文件。当系统进行程序安装、卸载和更新等操作时,均会更新该文件。该文件保存了系统中与 package 相关的一些信息。

  2. packages.list:描述系统中存在的所有非系统自带的 APK 的信息。当这些程序有变动时,PKMS 就会更新该文件。

  3. 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(在在handleReturnCode中的mArgs.copyApk(调用doCopyApk)中去拷贝apk里面的文件和so等)

  • 4)最后进行安装(processPendingInstall做真正的安装(installPackagesTracedLI去解析apk,安装、校验等))

最后的installPackagesTracedLI安装过程分四个阶段:

  1. 准备,分析当前安装状态,解析包 并初始校验: 在 preparePackageLI() 内使用 PackageParser2.parsePackage() 解析AndroidManifest.xml,获取四大组件等信息;使用ParsingPackageUtils.getSigningDetails() 解析签名信息;重命名包最终路径 等。

  2. 扫描,根据准备阶段解析的包信息上下文 进一步解析: 确认包名真实;根据解析出的信息校验包有效性(是否有签名信息等);搜集apk信息——PackageSetting、apk的静态库/动态库信息等。

  3. 核对,验证扫描后的包信息,确保安装成功:主要就是覆盖安装的签名匹配验证。

  4. 提交,在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 检查权限等,


 

主要类说明:

IPackageManager--ActivityThread.getPackageManager---PackageManagerService
queryIntentServicesInternal 最终在PackageManagerService中执行。

给应用配置默认权限:Android 给 app默认权限(不弹窗申请权限),

 Android权限之底层实现概览

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值