Android权限之二packages.xml解析

本文详细解析了Android系统中PackageManagerService生成的packages.xml文件,该文件记录了系统内所有APK的详细信息,包括权限、版本、安装路径等。文件随APK的安装、删除和升级实时更新,通过分析此文件可以深入了解系统内APK的管理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/data/system/packages.xml这个文件由PackageManagerService.java生成,里面记录了系统当中安装的APK的所有属性,权限等信息。当系统中的APK安装、删除、升级时,文件就会被更新。

 

<permissions>标签定义了目前系统中定义的所有权限。主要分为两类:系统定义的(package属性为android)和APK定义的(package属性为APK的包名)。

 

<package>代表一个APK的属性,它的属性含义如下。

name:APK的包名

codePath:安装路径。有/system/app系统APK和/data/app两种。/system/app存放系统出厂时预置的一些APK,/data/app存放用户安装的第三方APK。

system:如果APK被安装在/system/app下,system的值为true;安装在/data/app下面的话,值为true。

ts:时间戳

version:APK的版本号

sharedUserId/userId:Android系统启动一个普通的APK时,会为这个APK分配一个独立的UID,这就是userId。如果APK要和系统中其它APK使用相同的UID的话,那就是sharedUserId。关于共享UID,下面有更详细的描述。

perms:APK的AndroidManifest.xml文件中,每使用一个<uses-permission>标签,<perms>标签中就会增加一项。

 

<shared-user>代表一个共享UID,通常,共同实现一系列相似功能的APK共享一个UID。<perms>标签中的权限代表了这个共享UID的权限,所有使用的同一个共享UID的APK运行在同一进程中,这个进程的UID就是这个共享UID,这些APK都具有这个共享UID的权限。

name:共享UID的名字,在APK的android:sharedUserId属性中使用。

userId:使用这个共享UID的所有APK运行时所在的进程的UID。

### AndroidManifest.xml 解析信息存储位置 在Android系统中,`AndroidManifest.xml`文件的解析信息主要由系统的包管理服务(Package Manager Service, PMS)处理并保存。当安装一个新的应用程序时,PMS会读取该应用的`AndroidManifest.xml`文件,并将其内容转换成二进制形式,以便更高效地访问和查询这些信息。 #### 1. 编译期编译为Binary XML 为了提高效率,在构建过程中,`AndroidManifest.xml`会被AAPT工具(Android Asset Packaging Tool)转化为一种紧凑高效的二进制XML格式。这种格式不仅减小了文件大小,还加快了解析速度[^2]。 #### 2. 安装期间缓存至Package Data Directory 在应用程序首次被安装到设备上之后,其清单文件的信息会被提取出来并通过PMS进一步加工后存储于特定的数据目录下(`/data/system/packages.xml`)。这里记录了所有已安装的应用程序的相关配置细节以及权限声明等重要参数[^3]。 #### 3. 运行时期间内存映射 每当启动某个组件(如Activity、Service)之前,PMS都会先检查对应的类是否已经在运行时环境中加载过;如果没有,则重新从磁盘上的二进制版本中获取必要的定义,并创建相应的对象实例。此过程涉及到将部分或全部的`AndroidManifest.xml`数据映射到进程地址空间内,从而允许快速查找所需的元数据[^4]。 ```java // 获取当前上下文中指定名称的ComponentName Intent intent = new Intent(); intent.setClassName("com.example.app", "com.example.app.MainActivity"); ComponentName componentName = intent.getComponent(); // 使用PackageManager来检索有关给定组件的具体信息 PackageManager packageManager = context.getPackageManager(); ActivityInfo activityInfo = packageManager.getActivityInfo(componentName, PackageManager.GET_META_DATA); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值