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. 初始化
-
构造函数五个阶段
- 阶段一:BOOT_PROGRESS_PMS_START
- 阶段二:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
- readLPw
- packages.xml packages.list
- 阶段三:BOOT_PROGRESS_PMS_DATA_SCAN_START
- scanDirTracedLI
- core app >system app > other app 优先级扫描APK,解析AndroidManifest.xml文件,得到各个标签内容
- 扫描完据该 APK后,系统已经根据该 APK 中 AndroidManifest.xml,创建了一个完整的 Package 对象,下一步就是将该 Package 加入到系统中
- 阶段四:BOOT_PROGRESS_PMS_SCAN_END
- 阶段五:BOOT_PROGRESS_PMS_READY
-
OtaDexoptService 服务
谷歌有4.4 dalvik 切到ART,应用安装的时候会启动dex2ota,把dex预编译成ELF文件,每次运行程序的时候不用重新编译,是真正意义的本地应用。
2 权限管理
- 正常权限,危险权限,特殊权限
- 前文所述scanDirTracedLI函数完成
- 6.0之后添加运行时权限,用户在运行时需要什么权限就申请什么权限
3 安装
- 开机自动安装
push 到文件系统目录中,在 Android 的启动流程中,会在文件系统目录中去检索所有的 apk 文件,进行安装。 - 下载安装
应用商店各厂商平台会使用自研应用,逻辑、界面由厂商完成。内部可能通过 PackageInstaller 提供的接口进行应用的安装 - adb安装
adb install (adb shell pm install) 命令的方式安装应用。通过 adb 命令触发,这个过程会将 apk 文件 copy 到 /data/local/tmp/ 目录下,然后向 shell 服务发送 pm 命令安装 apk,最后调用 pm.runInstall() 方法来安装应用
安装流程
- 首先会调用到PackageInstaller应用。
-
PackageInstallerActivity ui
-
InstallInstalling
1.onCreate()
判断是否是继续安装还是全新安装,继续安装情况下,获取之前的 sessionId 和 installId,并且根据 installId 注册安装监听;对于全新安装情况,需要根据传入的 apk 信息组装会话参数 SessionParams 对象,并以此创建新的 sessionId,注册新的观察监听安装事件。
2. onResume()
InstallingAsyncTask异步任务,执行安装 -
copyApk
文件流的操作,把APK拷贝到/data/app等目录
拷贝完成后,进入真正的安装
-
终是交给installed守护进行完成真正的APK安装