深入安卓Package Manager和Package Installer
我们每天都在安装和卸载APK(安卓应用程序包文件),或许一天会有好几次,但是你有想过下面问题吗?
- 什么是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)。
4、Package Manager(包管理器)是怎样保存数据的?
Package Manager保存应用程序的信息在/data/system目录下的三个文件里。下面的例子是从Android 4 ICS(Ice Cream Sandwich)模拟器提取出来的图片。
1. packages.xml:这个文件包含所有的权限和Packages/Applications。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
< packages >
< last-platform-version external = "15" internal = "15" >
< permission-trees >
< permissions >
< item name = "android.permission.CHANGE_WIFI_MULTICAST_STATE" package = "android" protection = "1" >
< item name = "android.permission.CLEAR_APP_USER_DATA" package = "android" protection = "2" >
.
.
.
.
</ item ></ item ></ permissions >
< package codepath = "/system/app/Contacts.apk" flags = "1" ft = "136567b3990" it = "136567b3990" name = "com.android.contacts" nativelibrarypath = "/data/data/com.android.contacts/lib" shareduserid = "10001" ut = "136567b3990" version = "15" >
< sigs count = "1" >
< cert index = "2" >
</ cert ></ sigs >
</ package >
.
.
.
.
< package codepath = "/data/app/com.project.t2i-2.apk" flags = "0" ft = "13a837c2068" it = "13a83704ea3" name = "com.project.t2i" nativelibrarypath = "/data/data/com.project.t2i/lib" userid = "10040" ut = "13a837c2ecb" version = "1" >
< sigs count = "1" >
< cert index = "3" key="308201e53082014ea0030201020204506825ae300d06092a86
4886f70d01010505003037310b30090603550406130255533110300e060355040a13074
16e64726f6964311630140603550403130d416e64726f6964204465627567301e170d31
32303933303130353735305a170d3432303932333130353735305a3037310b300906035
50406130255533110300e060355040a1307416e64726f6964311630140603550403130d
416e64726f696420446562756730819f300d06092a864886f70d010101050003818d003
08189028181009ce1c5fd64db794fd787887e8a2dccf6798ddd2fd6e1d8ab04cd8cdd9e
bf721fb3ed6be1d67c55ce729b1e1d32b200cbcfc91c798ef056bc9b2cbc66a396aed6b
a3629a18e4839353314252811412202500f11a11c3bf4eb41b2a8747c3c791c89391443
39036345b15b5e080469ac5f536fd9edffcd52dcbdf88cf43c580abd0203010001300d0
6092a864886f70d01010505000381810071fa013b4560f16640ed261262f32085a51fca
63fa6c5c46fde9a862b56b6d6f17dd49643086a39a06314426ba9a38b784601197246f8
d568e349a93bc6af315455de7a8923f40d4051a51e1658ee34aca41494ab94ce978ae38
609803dfb3004806634e6e78dd0be26fe75843958711935ffc85f9fcf81523ce23c86bc
c5c7a">
</ cert ></ sigs >
< perms >
< item name = "android.permission.WRITE_EXTERNAL_STORAGE" >
</ item ></ perms >
</ package >
.
.
.
.
.
</ permission-trees ></ last-platform-version ></ packages >
|
这个xml文件包含两种信息,权限和package(application)。 权限是保存在标签里的。每个Permission(权限)有三个属性,即name、package和protection。Name属性包含权限的名字,也就是我们在AndroidManifest.xml所用的,Package属性表明权限所属的包。在大多数情况下,“android”是一个值,因为标签包含默认的权限,以及protection表明安全的等级。
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和数据目录,我找不到更加完美的描述了,但是我设想它可提供更快速的已安装包的查找,因为这个文件一直只保存重要的信息。
1
2
3
4
|
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
|
3.packages-stoped.xml:这个文件包含了已经是停止状态的包的列表,停止状态的应用是不能接收任何的广播的。参考这个链接来了解更多关于停止状态应用的信息。http://yuki312.blogspot.in/2012/03/androidbroadcaststop.html
1
2
3
4
5
6
|
< stopped-packages >
< pkg name = "com.android.widgetpreview" nl = "1" ></ pkg >
< pkg name = "com.example.android.livecubes" nl = "1" ></ pkg >
< pkg name = "com.android.gesture.builder" nl = "1" ></ pkg >
< pkg name = "com.example.android.softkeyboard" nl = "1" ></ pkg >
</ stopped-packages >
|
5、去哪里可以找到Package Manager和Package Installer的源码?
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相关推荐
- 学习日记-安卓Package Manager和Package Installer
安装和卸载APK(安卓应用程序包文件),运作原理. 什么是Package Manager(包管理器)和Package Installer(程序安装包)? APK文件保存在Android的哪个地方? A ...
- 【Ubuntu 学习】Package manager / Package management system 详解
文章目录 1. 什么是 Package 2. 什么是 Package manager 2.1 有哪些常见的 Package manager 2.2 安装 package 的不同方式:编译后的二进制形式 ...
- Guidance Package Manager button doesn’t appear in the VS menu
Problem: After installing Enterprise Library 3.1 – May 2007, when I open vs.net, there is no Guidanc ...
- [Android Pro] 分析 Package manager has died
reference to : http://blog.csdn.net/xxooyc/article/details/50162523 这是今天遇到的一个issue,由于Binder造成的.虽然比较简 ...
- Swift Package Manager 库制作
Swift Package Manager 是苹果官方推出的库管理工具.类似 cocoapods. 准备事项: 一个需要封装的库 存放库的远程仓库,如 github.gitee.gitLab等 创建P ...
- Error: Could not access the Package Manager. Is the system running?
最近在搭建cordova,android 开发环境,安装android studio之后创建一个demo之后,运行想看一下效果,在运行过程中创建一个虚拟机(arm)的,等了有1分钟左右,再次运行程序, ...
- 在linux上安装cuda的时候报错:Existing package manager installation of the driver found.
文章目录: 1 错误原因 2 解决方法 1 错误原因 安装cuda的时候提示有多个显卡驱动:Existing package manager installation of the driver fo ...
- RuntimeException: Package manager has died
原文出处:http://blog.csdn.net/xxooyc/article/details/50162523,(部分修改) bug描述 W/System.err: java.lang.Runti ...
- RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”...
rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组 ...
最新文章
- jQuery API之each、children、index的使用
- 关于Gitlab若干权限问题
- Android Fragment 真正的完全解析(下)
- Java Maven学习 - 1
- Ansible script模块使用示例
- 我的世界拿java开服务器_我的世界如何开服务器
- 中篇 | 多轮对话机器之话题意图识别
- 机器学习变量转换(定性变量、定量变量)
- Linux常用命令与基本操作、填空题、简答题
- UI下拉模板|提升下拉列表菜单体验设计的10技巧
- 前阿里财务人告诉你:抛弃Excel,原来报表竟然还能这么快
- history模式 nginx配置_Vue history模式Nginx配置
- 《Tomcat权威指南》读书笔记
- echarts全国省市县下钻
- 服务器解析xml文件报错:org.dom4j.DocumentException: Error on line -1 of document
- Codeforces Round #643 (Div. 2)——B. Young Explorers
- pytorch GradScale 梯度缩放算子
- python樱花树代码_用python绘制樱花树
- UI层自动化测试框架(五):业务层和用例层
- [Telegram X]旧版分享 突破被锁群组
热门文章
- Python NO.4
- 旧版奥维 用 新地图 gmap 谷歌卫星图层
- swf反编译/swf decompiler/flash decompiler软件ASV2011截图
- [内附完整源码和文档] 基于C++实现的小型超市管理系统
- JAVA_HOME should point to a JDK not a JRE的解决办法
- 摄像机标定终极总结版03---实际应用中的摄像机标定过程
- 智慧城市密码应用解决方案
- 软件安全测试-软件安全测试概述
- Cefsharp——将Cefsharp相关库集中放到程序的子目录下
- 计算机基础知识考试题库-----复习资料