packages.xml和packages.list全解析

2023-05-16

更多干货,欢迎关注微信公众号: tmac_lover

今天给大家介绍一下Android系统中保存app信息的两个配置文件,packages.xml和packages.list。系统中所有安装的app的基本信息在这里都能体现出来。

我这里以Android 6.0为基础来分析,不同的Android版本,可能内容会稍有出入,但是基本上是相同的。

1. packages.list

packages.list文件内容相对简单。打开packages.list文件后,我们会发现对系统中所有安装的app都有类似这样的内容:

com.android.packageinstaller 10025 0 /data/data/com.android.packageinstaller platform 1028,3003,2001

这里用空格符分了6列,分别包含了6个app相关的信息:

  • 第一列是app的包名,也就是AndroidManifest.xml文件中的package=”xxx.xxx.xxx”设置的内容
  • 第二列是app的使用的userid, 如果没有在AndroidManifext.xml里使用android:sharedUserId属性指定UID, 在app安装的时候,系统会给这个app自动分配一uid,以后app运行时,就用这个UID运行
  • 第三列是app是否处于调试模式,由AndroidManifext.xml里android:debuggable指定
  • 第四列是app的数据存放路径,一般是”/data/data/${package_name}”这样的文件夹
  • 第五列是app的seinfo信息,这个好像和SEAndroid机制有关,具体我也不是太清楚,它的值好像有platform, default之分
  • 第六列是app所属的user group, 如果一个app不属于任何group, 这里的值是None

2. packages.xml

打开packages.xml文件,会发现这个文件非常的长,所以先列出这个文件的框架,以便对它有个整体的认知。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<packages>
    <version ... />
    <version ... />

    <permissions>
        <item name="xxxS" package="xxx" protection="xx" />
        ... ...
    </permissions>

    <package xxx>
        ...
    </package>
    ...

    <shared-user xxx>
        ...
    </shared-user>
    ...

    <keyset-settings version="1">
        ...
    </keyset-settings>
</packages>

packages.xml文件中主要的信息分为下面几个部分:

  • permission块: 里面包含了系统中所有定义的权限的信息
  • package块:里面包含了系统中所有安装的app的详细信息
  • shared-user块:里面包含了所有系统定义的shareuser的信息
  • keyset-settings块:里面包含了已安装app签名的public key信息

下面详细看下每块中的具体类容。

2.1 permissions

permissions块的类容如下:

<permissions>
    <item name="android.permission.REAL_GET_TASKS" package="android" protection="18" />
    <item name="android.permission.REMOTE_AUDIO_PLAYBACK" package="android" protection="2" />
    ...
</permissions>

它里面定义了系统中所有的申明的权限信息,每个item块代表一个权限。name表示权限的名字,package表示申明权限的package, protection表示权限的级别,如normal, dangerous之类的

2.2 keyset-settings

先看看keyset-settings块的内容:

<keyset-settings version="1">
    <keys>
        <public-key identifier="1" value="MIIBIjANBgkqhki..." />
        ...
    </keys>
    <keysets>
        <keyset identifier="1">
            <key-id identifier="1" />
        </keyset>
        ...
    </keysets>
    <lastIssuedKeyId value="9" />
    <lastIssuedKeySetId value="9" />
</keyset-settings>

keyset-settings块里收集了所有app签名的公钥信息,和后面介绍的package块中的信息有关联。

  • keysets块中包含了很多keyset, 每个keyset都有一个编号用identifier表示,keyset里包含的key-id里的identifier和上面keys中public-key的identifier的值相对应。
  • keys块中public-key里的value值就是从apk包里的签名文件里提取出来的的公钥的值。
  • lastIssuedKeyId和lastIssuedKeySetId表示的是最近一次取出来的公钥所属的set编号。

2.3 package

块内容如下:

<package name="com.tencent.qqmusictv" codePath="/data/app/qqmusictv" nativeLibraryPath="/data/app/qqmusictv/lib" primaryCpuAbi="armeabi" publicFlags="941112933" privateFlags="0" ft="15f00a383c8" it="15f00a383c8" ut="15f00a383c8" version="134" userId="10044">
    <sigs count="1">
        <cert index="6" key="30820247308201b0a003020..." />
    </sigs>
    <perms>
        <item name="android.permission.WRITE_SETTINGS" granted="true" flags="0" />
        ...
    </perms>
    <proper-signing-keyset identifier="7" />
</package>

package块里包含了每个app的详细信息,具体说明如下:

  • name表示app的包名
  • codePath表示这个apk文件存放的位置,如果是系统app, 存在system分区,如果是第三方app, 存在data分区
  • nativeLibraryPath表示app使用的.so库存放的位置,primaryCpuAbi表示app以哪种abi架构运行
  • publicFlags和privateFlags是根据AndroidManifest.xml里的设置,生成的,例如:android:multiarch
  • ft表示apk文件上次被更改的时间,it表示app第一次安装的时间,ut表示app上次被更新时间,它的值好像一直和ft相同, ota或app重装之后,这里的ft和ut可能会改变。
  • version是app的版本号信息, 也就是在AndroidManifest.xml里配置的android:versioncode
  • userId是为app分配的user id, 如果有使用shareUserId, 这里出现的就是SharedUserId。
  • sigs块里的count表示这个app有多少个签名信息,有的app可能会被多个证书签名。cert里的index表示这个app使用的证书的序号,当系统发现一个新的证书,这个号就会加1,key是app使用的证书内容的ascii码值。PKMS在扫apk文件过程中,如果发现它和之前扫描到的apk使用的是相同的签名证书,这里就只会有个index的值,并没有key的值。拥有相同的index的package, 表明它们使用的是相同的签名
  • perms块里是这个app拥有的权限, 对于一般的app,这些权限是在AndroidManifest.xml里写明的;那些使用了相同UID的app, 这里的权限就是所有使用相同UID的app申请的权限的总和。 granted表示这个权限是不是已经被允许。
  • proper-signing-keyset里的identifier就是上面说的keysets里identifier的值。它是用来标明这个app使用的是哪个公钥。

2.4 shared-user

我们以android.uid.system为例。

<shared-user name="android.uid.system" userId="1000">
    <sigs count="1">
        <cert index="1" />
    </sigs>
    <perms>
        <item name="android.permission.REAL_GET_TASKS" granted="true" flags="0" />
        <item name="android.permission.ACCESS_CACHE_FILESYSTEM" granted="true" flags="0" />
        ... ...
        <item name="android.permission.DELETE_PACKAGES" granted="true" flags="0" />
    </perms>
</shared-user>
  • name表示这个shared-user的名字,userId表示这个user在系统中的编号,具体可以查看Process.java
  • sigs和package块里的意思相同
  • perms 表示这个user所具有的权限。在开机扫描apk文件时,它会将所有使用了相同uid的app的权限收集到一起,然后放在这里。并且最后还会把这些权限再下发给那些使用了相同uid的app。最后的结果就是,系统中使用相同uid的app,它们具有一样的权限。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

packages.xml和packages.list全解析 的相关文章

随机推荐

  • 云文档托管方案分析

    文章目录 一 前言二 网页生成器的选择2 1 VuePress2 2 Sphinx2 3 Docusaurus2 4 结论 三 支持全文搜索3 1 VuePress 自带插件3 1 1 vuepress plugin fulltext se
  • CUDA和cudnn的安装

    参考 https blog csdn net weixin 44170512 article details 103990592CUDA 和 TF的版本匹配 在最下面 https www tensorflow org install sou
  • 从零开始学习HBase - 一文详解HBase常用API

    HBase常用API总结 使用的HBase版本为 1 31 1 pom xml文件 span class token comment lt 配置 Hbase 的依赖 gt span span class token tag span cla
  • 基于SDN的访问控制模块实现

    一 背景 1 访问控制 访问控制技术 xff0c 指防止对任何资源进行未授权的访问 xff0c 从而使计算机系统在合法的范围内使用 意指用户身份及其所归属的某项定义组来限制用户对某些信息项的访问 xff0c 或限制对某些控制功能的使用的一种
  • Java -- 访问权限控制(public,protected,private)

    访问权限控制 xff08 public xff0c protected xff0c private xff09 Java中最大权限到最小权限依次为 xff1a public xff0c protected xff0c private 类库
  • 认识一下toB和toC

    这个话题似乎是老生常谈 xff0c 但其实每个人的理解都不尽相同 xff0c 甚至一个人在不同阶段也有很大不同 xff0c 就好像金庸武侠独孤求败的利剑 软剑 重剑 木剑 xff0c 阅历不同 xff0c 感悟不同 xff0c 境界就不同
  • 将Docker镜像安全扫描步骤添加到CI/CD管道

    使用GitlabCI和Trivy 介绍 如今 xff0c 镜像安全扫描变得越来越流行 这个想法是分析一个Docker镜像并基于CVE数据库寻找漏洞 这样 xff0c 我们可以在使用镜像之前知道其包含哪些漏洞 xff0c 因此我们只能在生产中
  • 卡尔曼滤波器之经典卡尔曼滤波

    参考文献 xff1a xff11 http www bzarg com p how a kalman filter works in pictures xff12 https blog csdn net u010720661 article
  • 卡尔曼滤波器之扩展卡尔曼滤波

    参考文献 xff1a xff11 https zhuanlan zhihu com p 63641680 目录 xff11 xff0e 非线性模型 xff12 xff0e 非线性模型到线性模型的近似 xff11 xff0e 非线性模型 卡尔
  • VINS fusion软件架构分析(3)--- 输入IMU和相机信息 inputIMU + inputImage

    文章目录 1 输入IMU和相机信息1 1 inputIMU1 1 1 fastPredictIMU1 1 1 1 Utility deltaQ 1 1 2 pubLatestOdometry知识点 pair 1 2 inputImage1
  • VINS fusion软件架构分析(2)---- 从参数文件读取参数

    1 参数配置文件 VINS是利用参数文件yaml统一管理重要的参数 xff0c 主要分为两个参数配置文件 xff0c 如下图 普通参数配置文件 xff0c 如euroc mono imu config yaml相机模型参数配置文件 xff0
  • VINS fusion软件架构分析(5)--- 坐标系转换

    对于VINS代码的解读 xff0c 其中一个重要的知识储备就是理解坐标系间的转换 xff0c 这对于后面代码阅读非常重要 xff0c 因此本章重点解释一下 VINS中有3个坐标系 xff1a 世界坐标系 worldIMU坐标系body相机坐
  • 《算法导论》习题5.3-1 ~ 5.3-7

    算法导论 习题 5 3 1 5 3 7 5 3 5 带星号我抄了一下题目 5 3 6 比较有意思我抄了一下题目 其他的题可以自己对照书 原书第三版 5 3 1 直接考虑第2次循环前 第1次循环后第1个位置的元素是原集合1 n中任意一个元素的
  • ROS:坐标系之间的关系 (map \ odom \ base_link)

    ROS 坐标系之间的关系 map odom base link 在使用ROS进行定位与导航操作时 xff0c 会伴随着各种坐标系 xff0c 并且每种坐标系都有明确的含义 xff0c ros中定义了常见的坐标系 xff0c 并且所有的坐标系
  • 上下拉电阻的作用

    这是在论坛上收集到的一些总结 xff1a 一 OC OD门 xff0c 这种门结构如果不做上拉的话 xff0c 是不能实现电平的高底跳变的 xff0c 不能实现跳变 xff0c 便不能表征数据 二 驱动能力 xff0c 我们看很多的CPU或
  • 实测MySQL 查询结果保留两位小数函数的区别汇总

    MySQL查询结果保留两位小数常用的几个函数的区别 xff0c 使用场景 1 随机函数format x d 2 格式化小数函数format x d 例如 xff1a select format 23456 789 2 或 select fo
  • STLINK怎么与STM32单片机连接

    STLink是ST官方开发的单片机仿真工具 xff0c 可以烧写程序 在线仿真 xff0c 使用非常方便 STLink具有两种接口 xff0c 分别为 1 SWD模式 2 SWIM单总线模式 SWD模式主要针对STM32系列的单片机 xff
  • Ubuntu 18.04系统下创建新用户

    以下介绍在Ubuntu 18 04系统下创建新用户 目录 修改用户权限及删除用户的正确方法 在Ubuntu系统上创建新用户使用 sudo useradd 用户名 命令 xff0c 但只能创建用户 xff0c 不能在 home 中创建用户目录
  • 大数据面试题(一)

    一 hdfs写文件的步骤 答案 xff1a 1 client向NameNode申请上传 xxx txt文件 2 NN向client响应可以上传文件 3 Client向NameNode申请DataNode 4 NN向Client返回DN1 D
  • packages.xml和packages.list全解析

    更多干货 xff0c 欢迎关注微信公众号 tmac lover 今天给大家介绍一下Android系统中保存app信息的两个配置文件 xff0c packages xml和packages list 系统中所有安装的app的基本信息在这里都能