"How are" Android 应用程序(Facebook 等)安装到 android phone?
"How are" Android applications (Facebook etc.) installed to an android phone?
我知道如何将应用程序安装到 Android
设备,例如从 Play-Store 或通过 .apk文件。但是我想了解安装的实际过程。
例如在 Windows:
- 序列号等放在注册表中
- 对 运行 软件重要的文件放在 Program Files 文件夹中(主要
.exe
等)
到目前为止,我对 Android
应用程序安装过程的了解是:
执行 android 应用程序后(post-安装),新下载的数据放置在如下位置:Android/data 或Android/obb等
如果 Android 开发人员明确表示,文件也可以放在其他地方,例如辅助存储(存储卡、云存储等)
但除此之外,我对 Android 安装过程的了解非常有限,例如:
我不知道与 Android 程序执行相关的重要文件放在哪里(在 [=98= 的情况下,.exe、相关媒体、图书馆等)
我同样不知道这些文件在 Android 设备(post-安装)上的结构,例如这些文件的结构是否在如下文件夹中:java、res、menu、layout 等在 Android Studio?
等环境中的开发过程中
我也不知道用户设备 post 安装(从 android 安装文件或 apk) 例如它们是否存储为 .java 和/或 .xml 文件,如在开发期间等
希望有人能填空,谢谢。
开始
PackageInstaller 调用 InstallAppProgress activity 以接收来自用户的指令。 InstallAppProgress 将要求 PackageManager
服务通过 installd 安装包。源代码位于 <Android Source>/packages/apps/PackageInstaller
.
当我们安装 APK
文件时,包管理器解析包(APK
)文件并显示确认,当用户按下确定按钮时,包管理器使用这些调用名为 installPackage
的方法四个参数分别是uri
、installFlags
、observer、installPackageName
。包管理器启动了一项名为 "package" 的服务,现在所有模糊的事情都发生在该服务中。您可以在 PackageInstaller 源代码中查看 PackageInstallerActivity.java
和 InstallAppProgress.java
。 system_service 进程中的程序包管理器服务 运行 和作为本机进程运行的安装守护进程 (installd) 都在系统启动时启动。
其中 APK
文件存储在 Android
?
- 预安装(即相机、日历、浏览器等)
APK
存储在 /system/app/
- 用户安装(ApiDemo、Any.do 等)APK 存储在
/data/app/
- Package Manager 创建数据目录
/data/data/<package name>/
来存储数据库、共享首选项、本机库和缓存数据
您可能会看到 apk
文件和 *.odex
文件相同 APK
,ODEX
文件是完全不同的讨论和目的。
APK安装过程详细是什么?
以下进程在 Package Manager Service
.
中执行
- 等待
- 将包添加到安装过程的队列中
- 确定包安装的合适位置
- 确定安装安装/更新新
- 将 apk 文件复制到给定目录
- 确定应用程序的UID
- 请求安装守护进程
- 创建应用程序目录并设置权限
- 提取dex代码到缓存目录
- 反映和packages.list
/system/data/packages.xml
最新状态
- 连同名称广播到系统安装完成包的效果
Intent.ACTION_PACKAGE_ADDED
:如新(Intent.ACTION_PACKAGE_REPLACED
):更新的情况下。
包管理器如何存储数据?
Package Manager 将应用程序信息存储在三个文件中,位于 /data/system
。以下示例是从 Android 4 ICS
模拟器图像中提取的。
packages.xml
:此文件包含权限列表和 Packages/Applications。
这个 xml
文件存储两件事 1. 权限 2. 包(应用程序),权限存储在 <permissions>
标签下。每个 Permission 具有三个属性,即 name、package 和 protection。 name 属性有我们在 AndroidManifest.xml
中使用的权限名称,package 属性表示权限属于包,在大多数情况下 "android" 是值,因为 <permission>
标签包含默认权限和 protection 表示安全级别.
packages.list
:这是一个简单的文本文件,包含包名称、用户 ID、标志和数据目录,我找不到任何完美的描述,但我假设它packages.list
文件可以更快地查找已安装的软件包,因为它只保留重要信息。
com.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
: 此文件包含已停止状态的软件包列表,Stope 声明应用程序无法接收任何广播。
在哪里可以找到包管理器和包安装程序的源代码?
包管理器
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.
我知道如何将应用程序安装到 Android
设备,例如从 Play-Store 或通过 .apk文件。但是我想了解安装的实际过程。
例如在 Windows:
- 序列号等放在注册表中
- 对 运行 软件重要的文件放在 Program Files 文件夹中(主要
.exe
等)
到目前为止,我对 Android
应用程序安装过程的了解是:
执行 android 应用程序后(post-安装),新下载的数据放置在如下位置:Android/data 或Android/obb等
如果 Android 开发人员明确表示,文件也可以放在其他地方,例如辅助存储(存储卡、云存储等)
但除此之外,我对 Android 安装过程的了解非常有限,例如:
我不知道与 Android 程序执行相关的重要文件放在哪里(在 [=98= 的情况下,.exe、相关媒体、图书馆等)
我同样不知道这些文件在 Android 设备(post-安装)上的结构,例如这些文件的结构是否在如下文件夹中:java、res、menu、layout 等在 Android Studio?
等环境中的开发过程中
我也不知道用户设备 post 安装(从 android 安装文件或 apk) 例如它们是否存储为 .java 和/或 .xml 文件,如在开发期间等
希望有人能填空,谢谢。
开始
PackageInstaller 调用 InstallAppProgress activity 以接收来自用户的指令。 InstallAppProgress 将要求 PackageManager
服务通过 installd 安装包。源代码位于 <Android Source>/packages/apps/PackageInstaller
.
当我们安装 APK
文件时,包管理器解析包(APK
)文件并显示确认,当用户按下确定按钮时,包管理器使用这些调用名为 installPackage
的方法四个参数分别是uri
、installFlags
、observer、installPackageName
。包管理器启动了一项名为 "package" 的服务,现在所有模糊的事情都发生在该服务中。您可以在 PackageInstaller 源代码中查看 PackageInstallerActivity.java
和 InstallAppProgress.java
。 system_service 进程中的程序包管理器服务 运行 和作为本机进程运行的安装守护进程 (installd) 都在系统启动时启动。
其中 APK
文件存储在 Android
?
- 预安装(即相机、日历、浏览器等)
APK
存储在 /system/app/ - 用户安装(ApiDemo、Any.do 等)APK 存储在
/data/app/
- Package Manager 创建数据目录
/data/data/<package name>/
来存储数据库、共享首选项、本机库和缓存数据
您可能会看到 apk
文件和 *.odex
文件相同 APK
,ODEX
文件是完全不同的讨论和目的。
APK安装过程详细是什么?
以下进程在 Package Manager Service
.
- 等待
- 将包添加到安装过程的队列中
- 确定包安装的合适位置
- 确定安装安装/更新新
- 将 apk 文件复制到给定目录
- 确定应用程序的UID
- 请求安装守护进程
- 创建应用程序目录并设置权限
- 提取dex代码到缓存目录
- 反映和packages.list
/system/data/packages.xml
最新状态 - 连同名称广播到系统安装完成包的效果
Intent.ACTION_PACKAGE_ADDED
:如新(Intent.ACTION_PACKAGE_REPLACED
):更新的情况下。
包管理器如何存储数据?
Package Manager 将应用程序信息存储在三个文件中,位于 /data/system
。以下示例是从 Android 4 ICS
模拟器图像中提取的。
packages.xml
:此文件包含权限列表和 Packages/Applications。
这个 xml
文件存储两件事 1. 权限 2. 包(应用程序),权限存储在 <permissions>
标签下。每个 Permission 具有三个属性,即 name、package 和 protection。 name 属性有我们在 AndroidManifest.xml
中使用的权限名称,package 属性表示权限属于包,在大多数情况下 "android" 是值,因为 <permission>
标签包含默认权限和 protection 表示安全级别.
packages.list
:这是一个简单的文本文件,包含包名称、用户 ID、标志和数据目录,我找不到任何完美的描述,但我假设它packages.list
文件可以更快地查找已安装的软件包,因为它只保留重要信息。
com.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
: 此文件包含已停止状态的软件包列表,Stope 声明应用程序无法接收任何广播。
在哪里可以找到包管理器和包安装程序的源代码?
包管理器
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.