androidfrmework11-12-pkms

学习笔记,整理中;做应用用到的概率小。做room需要很懂。

面:


自己思路整理:

开机的时候会把所有APP安装一遍,packagemanageservice.main构造函数很耗时 ;扫描耗时;dex优化耗时。
静态广播在开机的时候pkms构造函数就扫描了,在package再进行的注册。
静默安装需要厂商签名,智能安装有密码就没意义。

apk安装步骤:

  1. 把apk的信息通过io流的形式写入到PackageInstaller.Session中
  2. 调用PackageInstaller.Session的commit方法,把apk的信息交给PKMS处理
  3. 进行apk的copy操作

PKMS7步骤

  • SystemServer.startBootstrapServices函数中启动PKMS服务
  1. 启动 Installer服务
    mSystemServiceManager.startService(Installer.class);
  2. 获取设备是否加密:比如手机设置了密码。
    VoldProperties.desrypt().orElse("");
  3. 调用PKMS.main方法 实例化PKMS
    PKMS.main
    PackageManagerService m = new PackageManagerService(param1,param2 installer);执行PKMS构造函数
    ServiceManager.addService("package",m); 把实例化出来的PKMS丢给ServiceManager进行注册
    final PackageManagerNative pmn= m.new PackageManagerNative();??
    ServiceManager.addService("package_native",pmn);??
  4. 如果设备没有加密,操作它,管理A/B OTA dexopting
  • SystemServer启动其他服务,使核心服务处于ready状态
    startOtherServices
  1. 如果设备没有加密,执行performDexOptUpdate 完成dex优化
    PackageManageService.updatePackageIfNeeded()
  2. 执行performFstrim 完成磁盘维护
    PackageManageService.performFstrimIfNeed()
    7.PackageManageService 准备就绪 PackageManageService.systemReady()
    DefaultPermissionGrantPolicy.grantDefaultPermissions()

PKMS 构造方法

  1. Boot_PROGRESS_PMS_START
    构造displaymetrics来保存分辨率等信息,创建permissionmanager来进行权限管理,创建Settings来保存安装包信息(如:packages.xml,packages-backup.xml...)
  2. BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
    扫描apk目录;清除安装时零时文件以及其他不必要的信息
  3. BOOT_PROGRESS_PMS_DATA_SCAN_START
    处理data目录的应用信息,及时更新,取出不必要的数据
  4. BOOT_PROGRESS_PMS_SCAN_END
    OTA 升级后首次启动要清除不必要的缓存数据,权限等默认项更新后要清理相关数据,更新package.xml
  5. BOOT_PROGRESS_PMS_READY
    GC回收内存

APK扫描

  1. scanDirTracedLi
    被pkms构造方法调用,开起来扫描apk的起点
  2. scanDirLi
    收集apk交付给submit
  3. ParallelPackageParser.submit
    把packageparser 封装好的信息交给parsepackage(pp,param2,param3)
  4. packageparser.parserPackage
    进行apk解析;
    若传入packageFile是目录
    若传入packageFile是apk文件
  5. parseMonolithicPackage
    主要是解析给定的apk文件,具体调用了parseBaseApk来解析
  6. PackageParse.parseBaseApk
    对AndroidMainfest.xml进行解析,解析的所有信息存放在Package对象中
  7. PackageParser.parseBaseApkCommon
    获取标签 application,permission,package,manifest
  8. PackageParser.parseBaseApplication
    增对application进行全面解析
    如application里面的四大组建
    8.得到package对象

apk安装流程

  1. PackageInstallerActivity.bindUi-->startInstall
  2. InstallInstalling-->oncreate-->onresume-->installingAsyncTask
  3. PackageInstaller.Session
  4. PKMS-->installStage-->sendMessage
  5. PackageHandler-->INIT_COPY
  6. HandlerParams-->startCopy

-----下面是路过pkms的--------


危险权限封装思路

  1. 普通程序员用户端
    用3个注解来处理:传入权限,做得到权限,拒绝权限,再次确认权限的注解函数。
  2. 架构封装程序员端
  • 提供一个透明中转activity
  • 提供一个接口:含获得、拒绝、再次确认接口
  • 在该activity中提供对外的static函数加上接口调用
  • 关键:利用AspectJ来处理注解
    • 切点:从注解获得开始处理
    • 切面:处理该获得权限函数。(为了方便,另外两个注解函数用反射来处理)

权限申请源码

  1. MainActivity 调用 ActivityCompat.requestPermissions 进行动态权限申请
  2. requestPermissions函数通过隐式调用,激活PackageInstaller的GrantPermissionsActivity界
    面,让用户选择是否授权
  3. 经过PKMS把相关信息传递给PermissionManagerService处理
  4. PermissionManagerService处理结束后回调给---->PKMS中的onPermissionGranted方法把处
    理结果返回
  5. PKMS通知过程中权限变化,并调用writeRuntimePermissionsForUserLPr函数让
    PackageManager的settings记录下相关授 权信息

检查权限

  1. MainActivity会调用ContextCompat.checkSelfPermission方法检测是否具有权限
  2. 通过实现类ContextImpl的checkPermission方法经由ActivityManager和
    ActivityManagerService处理
  3. 经过ActivityManager处理后会调用PKMS的checkUidPermission方法把数据传递给
    PermissionManagerService处理
  4. 在PermissionManagerService.checkUidPermission中经过一系列查询返回权限授权的状态

摘要:


内容:

你可能感兴趣的:(androidfrmework11-12-pkms)