起步
PackageInstaller调用InstallAppProgress活动以接收用户的指令。 InstallAppProgress将要求PackageManager
服务通过installd安装软件包。源代码可在<Android Source>/packages/apps/PackageInstaller
中找到。
当我们安装APK
文件时,软件包管理器解析软件包(APK
)文件,并显示确认信息。当用户按下“确定”按钮时,软件包管理器使用这四个参数:即uri
、installFlags
、观察者和installPackageName
调用名为installPackage
的方法。软件包管理器启动了一个名为“package”的服务,现在所有的模糊事情都发生在这个服务中。您可以在PackageInstaller源代码中检查PackageInstallerActivity.java
和InstallAppProgress.java
。软件包管理器服务运行在system_service进程中,安装守护程序(installd)作为一个本地进程,在系统启动时同时启动。
Android存储APK
文件在哪里?
- 预安装(如相机、日历、浏览器等)
APK
存储在/system/app/中
- 用户安装(ApiDemo、Any.do等)APK存储在
/data/app/
中
- 软件包管理器创建数据目录
/data/data/<package name>/
来存储数据库、共享首选项、本地库和缓存数据
您可能会看到与同一APK
相关的apk
文件和*.odex
文件,其中ODEX
文件是完全不同的讨论和目的。
详细讲解APK安装过程?
以下流程在Package Manager Service
中执行。
- 等待
- 将一个软件包添加到安装进程的队列中
- 确定软件包安装的适当位置
- 确定安装/更新新的安装
- 将apk文件的副本复制到给定的目录中
- 确定应用程序的UID
- 请求installd守护程序进程
- 创建应用程序目录并设置权限
- 将dex代码提取到缓存目录中
- 为反映和packages.list
/system/data/packages.xml
更新最新的状态
- 广播到系统,同时附带安装完成包的名称效果。
Intent.ACTION_PACKAGE_ADDED
: 如果是新的(Intent.ACTION_PACKAGE_REPLACED
): 更新的情况。
![enter image description here](https://istack.dev59.com/3HBka.webp)
软件包管理器如何存储数据?
软件包管理器在/data/system
中存储应用程序信息的三个文件。以下示例从Android 4 ICS模拟器映像中提取。
packages.xml
:此文件包含权限和软件包/应用程序的列表。这个xml文件存储两个东西1.权限2.包(应用程序),权限存储在<permissions>
标记下。每个权限都有三个属性,即名称、包和保护。名称属性具有我们在AndroidManifest.xmlcom.android.launcher 10013 0 /data/data/com.android.launcher
com.android.quicksearchbox 10033 0 /data/data/com.android.quicksearchbox
com.android.contacts 10001 0 /data/data/com.android.contacts
com.android.inputmethod.latin 10006 0 /data/data/com.android.inputmethod.latin
packages-stoped.xml
:这个文件包含已停止状态的软件包列表,停止状态的应用程序无法接收任何广播。
我在哪里可以找到Package Manager和Package Installer的源代码?
Package Manager
frameworks/base/services/java/com/android/server/pm/Settings.java
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/pm/IPackageManager.aidl
frameworks/base/services/java/com/android/server/pm/PackageSignatures.java
frameworks/base/services/java/com/android/server/pm/PreferredActivity.java
frameworks/services/java/com/android/server/PreferredComponent.java
frameworks/core/java/android/content/IntentFilter.java
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/services/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/app/IMediaContainerService.aidl
frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
软件包安装程序
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java.
参考链接: 链接1 和 链接2.
adb shell
。 命令类似于Unix shell——例如,您可以键入cd
和ls
。 查看目录,如/data/app
。 http://blog.shvetsov.com/2013/02/access-android-app-data-without-root.html - craig65535