Android PackageManager概览
1. 应用程序层
调用ContextImpl类的getPackageManager()函数返回一个PackageManager对象,通过该对象调用各种API接口。
getPackageManager()函数和getSystemService()的过程基本相似,都是从ServiceManager获得指定名称的Ibinder对象,此处名称是"package"——getSystemService("package")。
2. PackageManagerService服务层
包管理服务运行于SystemServer进程中。
PackageManagerService使用两个目录下的xml文件保存相关包管理信息
(1) /system/etc/permissions 目录下
① 定义系统中包含了哪些feature。App 在AndroidManifest.xml文件中使用<use-feature>标签声明需要哪些feature。
<use-feature android:name="android.hardwate.wifi" android:required="true" />
②platform.xml文件。为一些特别的uid和gid分配一些默认的权限
a. 给gid分配权限使用<permission>标签
<permission name="android.permission.BLUETOOTH_ADMIN" >
<group gid="net_bt_admin" />
</permission>
b. 给uid分配权限使用<assign-permission>标签
<!-- Standard permissions granted to the shell. -->
<assign-permission name="android.permission.WRITE_EXTERNAL_STORAGE" uid="shell" />
(2) /data/system/packages.xml,包含App的包名称,安装包路径,使用了哪些系统权限
总权限声明
<packages>
<last-platform-version internal="17" external="17" />
<permission-trees />
<permissions>
<item name="com.sec.android.app.gallery3d.READ_PICASA" package="com.sec.android.gallery3d" />
<item name="com.sec.android.app.gallery3d.WRITE_PICASA" package="com.sec.android.gallery3d" />
<item name="com.sec.android.app.gallery3d.WRITE_STROKEDB" package="com.sec.android.gallery3d" />
<item name="com.sec.android.app.gallery3d.WRITE_SNS" package="com.sec.android.gallery3d" />
<item name="com.sec.android.app.gallery3d.READ_SNS" package="com.sec.android.gallery3d" />
</permissions>
每个package的信息。每个package中还可以使用<perms>声明权限
<package
name="com.sec.android.gallery3d"
codePath="/system/app/SecGallery2013.apk"
nativeLibraryPath="/data/app-lib/SecGallery2013"
flags="1621061"
ft="143fbeddf38"
it="143fbeddf38"
ut="143fbeddf38"
version="17"
userId="10088">
<sigs count="1">
<cert index="3" key="308204a830820390a003020102020900936eacbe07f201df300d06092a864886f70d0101050500308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d301e170d3038303232393031333334365a170d3335303731373031333334365a308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d30820120300d06092a864886f70d01010105000382010d00308201080282010100d6931904dec60b24b1edc762e0d9d8253e3ecd6ceb1de2ff068ca8e8bca8cd6bd3786ea70aa76ce60ebb0f993559ffd93e77a943e7e83d4b64b8e4fea2d3e656f1e267a81bbfb230b578c20443be4c7218b846f5211586f038a14e89c2be387f8ebecf8fcac3da1ee330c9ea93d0a7c3dc4af350220d50080732e0809717ee6a053359e6a694ec2cb3f284a0a466c87a94d83b31093a67372e2f6412c06e6d42f15818dffe0381cc0cd444da6cddc3b82458194801b32564134fbfde98c9287748dbf5676a540d8154c8bbca07b9e247553311c46b9af76fdeeccc8e69e7c8a2d08e782620943f99727d3c04fe72991d99df9bae38a0b2177fa31d5b6afee91f020103a381fc3081f9301d0603551d0e04160414485900563d272c46ae118605a47419ac09ca8c113081c90603551d230481c13081be8014485900563d272c46ae118605a47419ac09ca8c11a1819aa48197308194310b3009060355040613025553311330110603550408130a43616c69666f726e6961311630140603550407130d4d6f756e7461696e20566965773110300e060355040a1307416e64726f69643110300e060355040b1307416e64726f69643110300e06035504031307416e64726f69643122302006092a864886f70d0109011613616e64726f696440616e64726f69642e636f6d820900936eacbe07f201df300c0603551d13040530030101ff300d06092a864886f70d010105050003820101007aaf968ceb50c441055118d0daabaf015b8a765a27a715a2c2b44f221415ffdace03095abfa42df70708726c2069e5c36eddae0400be29452c084bc27eb6a17eac9dbe182c204eb15311f455d824b656dbe4dc2240912d7586fe88951d01a8feb5ae5a4260535df83431052422468c36e22c2a5ef994d61dd7306ae4c9f6951ba3c12f1d1914ddc61f1a62da2df827f603fea5603b2c540dbd7c019c36bab29a4271c117df523cdbc5f3817a49e0efa60cbd7f74177e7a4f193d43f4220772666e4c4d83e1bd5a86087cf34f2dec21e245ca6c2bb016e683638050d2c430eea7c26a1c49d3760a58ab7f1a82cc938b4831384324bd0401fa12163a50570e684d" />
</sigs>
</package>
除了Pms外,还有两个辅助服务用于程序安装
① DefaultContainerService,主要把安装程序复制到程序目录中
② Installer服务,不是Binder,是Socket客户端,Pms直接和该Socket客户端交互。Socket服务端负责 解压工作和数据目录的创建。
例如从APK中提取出dex文件,删除dalvik-cache下的dex文件,创建程序专属数据目录等。
3. 数据文件层
(1) 程序文件
① 系统App保存在/system/app目录下
② 第三方App保存在/data/app目录下
安装前,可以任意命名,保存在任意的地方;安装后,PmS会把apk文件放在 /data/app目录下,文件名称以包名命名,并自动追加一个“-x”的后缀
第二次安装时,数字1会变成2,第三次安装,2变成1,像乒乓机制。
③ /data/dalvik-cache目录中保存了程序中的执行代码。
apk实际上是一个jar压缩类型的文件,压缩包中包含了各种资源文件,资源索引文件,AndroidManifest文件及程序文件
应用程序运行前,PmS从apk中提取出代码文件(即dex文件,存在该目录下,以便快速运行)
(2)framework库文件
这些库文件存在于/system/framework目录下,类型是apk或者jar
系统开机后,dalvik虚拟机加载这些库文件
在PmS启动时,如果这些jar或者apk还没有被转化为dex文件,PmS会将这些库文件转化为dex文件,并保存在/data/dalvik-cache目录下
(3)App使用的数据文件
① 保存方式, App可以 参数存储、数据库存储、文件存储
② 存储目录, 一般保存在/data/data/xxx目录下, xxx是包名。
③ 除了/data/data目录外,系统还提供了三个额外的目录
a. /data/secure 保存加密数据。Framework会提供一种加密的类接口,所有的加密文件都将存放到该目录下。
b. /data/drm 存放 包含数字版权的数据文件。Framework会提供Drm相关类接口,用于间接访问该目录中的文件
c. /data/app-private, 与/data/drm作用相同。Framework可能没有使用/data/drm,而是使用/data/app-private代替