深入安卓Package Manager和Package Installer
2015-07-22 19:17
483 查看
我们每天都在安装和卸载APK(安卓应用程序包文件),或许一天会有好几次,但是你有想过下面问题吗?
什么是Package Manager(包管理器)和Package Installer(程序安装包)?
APK文件保存在Android的哪个地方?
APK文件安装过程的细节是怎样的?
Package Manager(包管理器)是怎样保存数据的?
我应该去哪里找Package Manager和Package Installer的源码?
PackageInstaller是安卓上默认的应用程序,用它来交互式地安装普通包文件。PackageInstaller提供了用户界面来管理应用或者包文件。PackageInstaller调用一个叫InstallAppProgress的activity来获取用户发出的指令。InstallAppProgress会请求Package Manager服务,然后通过indalld来安装包文件。源码提供在/packages/apps/PackageInstaller上。
Installd这个系统守护程序的首要角色是获取来自Package Manager服务的请求,而该请求是通过Linux套接字/dev/socket/installed获得的。
Installd使用管理员权限执行一系列的步骤来安装APK。参考:commands.c
Package Manger是一个实际上管理应用程序安装、卸载和升级的API。当我们安装APK文件时,Package Manager会解析APK包文件和显示确认信息。当我们点击OK按钮后,Package Manger会调用一个叫“InstallPackage”的方法,这个方法有四个参数,也就是uri、installFlags、observer和installPackagename。Package
Manger会启动一个叫“package”的service(服务),现在所有模糊的东西会发生在这个service中。你可以在PackageInstaller源码中查看“PackageInstallAcitivity.java”和“InstallAppProgress.java”。Package Manger服务运行在系统服务进程中,而安装守护程序(installd)作为一个本地进程运行着,他们都在系统启动时开始运行。
预装程序(即相机,日历和浏览器等)保存在/system/app/中。
用户安装程序(APIDemo,Any.do等)保存在/data/app/中。
Package Manager创建数据目录/data/data//来保存数据库、shared preference、本地函数库和缓存数据。
你可能会看到apk文件和同一个APK的*.odex文件,而ODEX文件是完全不同的讨论和目的了。
下面的过程执行在Package Manger服务中。
等待;
添加一个包文件到安装进程的队列中;
确定合适的地方来安装包文件;
复制apk文件到一个给定的目录下;
确定应用的UID;
请求installd守护程序进程;
创建应用目录和设置权限;
提取dex代码到缓存目录中;
解析packages.list、system、data和packages.xml的最新状态;
向系统发送广播消息,消息带有安装完成效果的名字Intent.ACTION_PACKAGE_ADDED:如果是更新,会带有新的(Intent.ACTION_PACKAGE_REPLACED)。
![](http://jbcdn2.b0.upaiyun.com/2014/05/27fed95f6ceaf41f6492171ee3f742f3-1024x770.jpg)
Package Manager保存应用程序的信息在/data/system目录下的三个文件里。下面的例子是从Android 4 ICS(Ice Cream Sandwich)模拟器提取出来的图片。
1. packages.xml:这个文件包含所有的权限和Packages/Applications。
这个xml文件包含两种信息,权限和package(application)。 权限是保存在标签里的。每个Permission(权限)有三个属性,即name、package和protection。Name属性包含权限的名字,也就是我们在AndroidManifest.xml所用的,Package属性表明权限所属的包。在大多数情况下,“android”是一个值,因为标签包含默认的权限,以及protection表明安全的等级。
package标签包含10个属性和一些子标签。
子标签
sigs 签名信息,count属性代表cert标签的数量。
cert 包含证书的key,index属性代表证书的全局索引,当新的证书安装时,我发现index会随着增加。
perms 包含开发者已经在AndroidManifest.xml中设置好的权限。
2. packages.list: 这是一个简单的文本文件,包含了包名、用户id、flag和数据目录,我找不到更加完美的描述了,但是我设想它可提供更快速的已安装包的查找,因为这个文件一直只保存重要的信息。
3.packages-stoped.xml:这个文件包含了已经是停止状态的包的列表,停止状态的应用是不能接收任何的广播的。参考这个链接来了解更多关于停止状态应用的信息。http://yuki312.blogspot.in/2012/03/androidbroadcaststop.html
Package Manger
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
Package Installer
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
什么是Package Manager(包管理器)和Package Installer(程序安装包)?
APK文件保存在Android的哪个地方?
APK文件安装过程的细节是怎样的?
Package Manager(包管理器)是怎样保存数据的?
我应该去哪里找Package Manager和Package Installer的源码?
1、什么是Package Manager和Package Installer
PackageInstaller是安卓上默认的应用程序,用它来交互式地安装普通包文件。PackageInstaller提供了用户界面来管理应用或者包文件。PackageInstaller调用一个叫InstallAppProgress的activity来获取用户发出的指令。InstallAppProgress会请求Package Manager服务,然后通过indalld来安装包文件。源码提供在/packages/apps/PackageInstaller上。Installd这个系统守护程序的首要角色是获取来自Package Manager服务的请求,而该请求是通过Linux套接字/dev/socket/installed获得的。
Installd使用管理员权限执行一系列的步骤来安装APK。参考:commands.c
Package Manger是一个实际上管理应用程序安装、卸载和升级的API。当我们安装APK文件时,Package Manager会解析APK包文件和显示确认信息。当我们点击OK按钮后,Package Manger会调用一个叫“InstallPackage”的方法,这个方法有四个参数,也就是uri、installFlags、observer和installPackagename。Package
Manger会启动一个叫“package”的service(服务),现在所有模糊的东西会发生在这个service中。你可以在PackageInstaller源码中查看“PackageInstallAcitivity.java”和“InstallAppProgress.java”。Package Manger服务运行在系统服务进程中,而安装守护程序(installd)作为一个本地进程运行着,他们都在系统启动时开始运行。
2、APK文件保存在Android的哪个地方?
预装程序(即相机,日历和浏览器等)保存在/system/app/中。用户安装程序(APIDemo,Any.do等)保存在/data/app/中。
Package Manager创建数据目录/data/data//来保存数据库、shared preference、本地函数库和缓存数据。
你可能会看到apk文件和同一个APK的*.odex文件,而ODEX文件是完全不同的讨论和目的了。
3、APK文件安装过程的细节是怎样的?
下面的过程执行在Package Manger服务中。等待;
添加一个包文件到安装进程的队列中;
确定合适的地方来安装包文件;
复制apk文件到一个给定的目录下;
确定应用的UID;
请求installd守护程序进程;
创建应用目录和设置权限;
提取dex代码到缓存目录中;
解析packages.list、system、data和packages.xml的最新状态;
向系统发送广播消息,消息带有安装完成效果的名字Intent.ACTION_PACKAGE_ADDED:如果是更新,会带有新的(Intent.ACTION_PACKAGE_REPLACED)。
![](http://jbcdn2.b0.upaiyun.com/2014/05/27fed95f6ceaf41f6492171ee3f742f3-1024x770.jpg)
4、Package Manager(包管理器)是怎样保存数据的?
Package Manager保存应用程序的信息在/data/system目录下的三个文件里。下面的例子是从Android 4 ICS(Ice Cream Sandwich)模拟器提取出来的图片。1. packages.xml:这个文件包含所有的权限和Packages/Applications。
package标签包含10个属性和一些子标签。
Sr | 属性 | 描述 |
---|---|---|
1 | name | 包名 |
2 | codePath | APK文件安装路径(/system/app/ 或 /data/app/) |
3 | nativeLibraryPath | 本地函数库(*.so文件),默认路径/data/data/<package name>/lib/ |
4 | flag | 存储ApplicationInfo标记[http://developer.android.com/reference/android/content/pm/ApplicationInfo.html](http://developer.android.com/reference/android/content/pm/ApplicationInfo.html) |
5 | ft | 十六进制时间戳timestamp |
6 | lt | 首次安装十六进制时间戳 |
7 | ut | 最后更新十六进制时间戳 |
8 | version | AndroidManifest.xml文件中的版本代码 [http://developer.android.com/guide/topics/manifest/manifest-element.html#vcode] |
9 | sharedUserId | Linux用户ID名称,其他应用可查看此ID。与在AndroidManifest.xml中的定义一致[http://developer.android.com/guide/topics/manifest/manifest-element.html#uid] |
10 | userId | Linux用户ID名称 |
sigs 签名信息,count属性代表cert标签的数量。
cert 包含证书的key,index属性代表证书的全局索引,当新的证书安装时,我发现index会随着增加。
perms 包含开发者已经在AndroidManifest.xml中设置好的权限。
2. packages.list: 这是一个简单的文本文件,包含了包名、用户id、flag和数据目录,我找不到更加完美的描述了,但是我设想它可提供更快速的已安装包的查找,因为这个文件一直只保存重要的信息。
5、去哪里可以找到Package Manager和Package Installer的源码?
Package Mangerframeworks/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
Package Installer
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
相关文章推荐
- hdu 1814 Peaceful Commission (2-SAT)
- 堆排序
- ZOJ 1241 Geometry Made Simple
- 问你8个问题,让你马上变清醒
- ViewPager
- Snail—UI学习之UIButton
- 离散化/分箱/分组(Discretization / binning / Interactive grouping)
- Android开发之获取相册照片和获取拍照照片二
- 猫猫学iOS之小知识之xcode6自动提示图片插件 KSImageNamed的安装
- Java培训-IO流补充
- 开门人和关门人
- 评委会打分
- Android开发之获取相册照片和获取拍照照片
- 一个奇怪的问题-1
- hdu5045Contest 概率dp
- 科技写作:英语文章中数字写法的常用规则
- 2015-07-22 知识点整理
- AE开发示例之RunGPAsync
- 第10章 菜单及其它资源_10.1 图标、鼠标指针、字符串等资源
- 评委会打分