PackageManagerService概述

1、客户端相关文件
	android/frameworks/base/core/java/android/content/pm/PackageManager.java
	android/frameworks/base/core/java/android/app/ApplicationPackageManager.java
2、服务端相关文件
	android/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
	android/frameworks/base/services/core/java/com/android/server/pm/PackageDexOptimizer.java
	android/frameworks/base/services/core/java/com/android/server/pm/Installer.java
	android/frameworks/base/services/core/java/com/android/server/pm/Settings.java
	android/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
	android/frameworks/base/core/java/android/content/pm/IPackageManager.aidl
3、相关文件
	android/frameworks/base/services/java/com/android/server/SystemServer.java
	android/frameworks/base/core/java/com/android/server/SystemConfig.java

1. 初始化

在这里插入图片描述

  • 构造函数五个阶段

    1. 阶段一:BOOT_PROGRESS_PMS_START
    2. 阶段二:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
      • readLPw
      • packages.xml packages.list
    3. 阶段三:BOOT_PROGRESS_PMS_DATA_SCAN_START
      • scanDirTracedLI
      • core app >system app > other app 优先级扫描APK,解析AndroidManifest.xml文件,得到各个标签内容
      • 扫描完据该 APK后,系统已经根据该 APK 中 AndroidManifest.xml,创建了一个完整的 Package 对象,下一步就是将该 Package 加入到系统中
    4. 阶段四:BOOT_PROGRESS_PMS_SCAN_END
    5. 阶段五:BOOT_PROGRESS_PMS_READY
  • OtaDexoptService 服务
    谷歌有4.4 dalvik 切到ART,应用安装的时候会启动dex2ota,把dex预编译成ELF文件,每次运行程序的时候不用重新编译,是真正意义的本地应用。

2 权限管理

  • 正常权限,危险权限,特殊权限
  • 前文所述scanDirTracedLI函数完成
  • 6.0之后添加运行时权限,用户在运行时需要什么权限就申请什么权限

3 安装

  1. 开机自动安装
    push 到文件系统目录中,在 Android 的启动流程中,会在文件系统目录中去检索所有的 apk 文件,进行安装。
  2. 下载安装
    应用商店各厂商平台会使用自研应用,逻辑、界面由厂商完成。内部可能通过 PackageInstaller 提供的接口进行应用的安装
  3. adb安装
    adb install (adb shell pm install) 命令的方式安装应用。通过 adb 命令触发,这个过程会将 apk 文件 copy 到 /data/local/tmp/ 目录下,然后向 shell 服务发送 pm 命令安装 apk,最后调用 pm.runInstall() 方法来安装应用

在这里插入图片描述

安装流程

  1. 首先会调用到PackageInstaller应用。
    在这里插入图片描述
  • PackageInstallerActivity ui

  • InstallInstalling
    1.onCreate()
    判断是否是继续安装还是全新安装,继续安装情况下,获取之前的 sessionId 和 installId,并且根据 installId 注册安装监听;对于全新安装情况,需要根据传入的 apk 信息组装会话参数 SessionParams 对象,并以此创建新的 sessionId,注册新的观察监听安装事件。
    2. onResume()
    InstallingAsyncTask异步任务,执行安装

  • copyApk
    文件流的操作,把APK拷贝到/data/app等目录
    拷贝完成后,进入真正的安装
    在这里插入图片描述

  • 终是交给installed守护进行完成真正的APK安装

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值