packages.xml分析

2023-05-16

/data/system/packages

1、/data/system/packages.list:  记录安装app的信息

com.android.cts.priv.ctsshim 10028 0 /data/user/0/com.android.cts.priv.ctsshim default:privapp:targetSdkVersion=24 none

com.qualcomm.qti.qms.service.telemetry 10096 0 /data/user/0/com.qualcomm.qti.qms.service.telemetry platform:targetSdkVersion=28 
3003

com.google.android.youtube 10079 0 /data/user/0/com.google.android.youtube default:targetSdkVersion=28 3003

这里用空格符分了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、/data/system/packages.xml 文件详解

记录安装app的详细信息(权限,uid等)

文件结构简单介绍:

<packages>

    <version sdkVersion="28" databaseVersion="3" fingerprint="htc/ocla1_sprout_00401/htc_ocla1_sprout:9/PPR1.180610.011/1048332.1:user/release-keys" />

    <version volumeUuid="primary_physical" sdkVersion="28" databaseVersion="3" 
fingerprint="htc/ocla1_sprout_00401/htc_ocla1_sprout:9/PPR1.180610.011/1048332.1:user/release-keys" />

    <permission-trees>

        <item name="com.google.android.googleapps.permission.GOOGLE_AUTH" package="com.google.android.gsf" />

    </permission-trees>

<permissions>

<item name="com.htc.trimslow.permission.EDIT" package="com.htc.zero" protection="18" />

…

</permissions>

<package      ***>

        …

</package>

<updated-package ***>

        …

</updated-package>

<shared-user name="android.media" userId="10033">

        …

</shared-user>

<keyset-settings version="1">

        …

</keyset-settings>

</packages>

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

permission块: 里面包含了系统中所有定义的权限的信息

package块:里面包含了系统中所有安装的app的详细信息

shared-user块:里面包含了所有系统定义的shareuser的信息

keyset-settings块:里面包含了已安装app签名的public key信息

下面来详细介绍一下每个元素块里的具体内容.

2.1、permission块

permission内容结构如下:

<permissions>

        <item name="com.htc.gc.companion.permission.USE_PROVIDER" package="com.htc.gc.companion" protection="2" 
/>

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

</permissions>

它里面定义了系统中所有声明的权限信息,每个item代表一个权限.

nam: 权限名

package: 包名

protection:权限等级

permission的权限组:包含默认配置的权限和所有app的权限组去重之后的结果

2.2、package块

package块内容结构如下:

<package name="com.qualcomm.qti.qms.service.telemetry" codePath="/vendor/app/SSGTelemetryService" 
nativeLibraryPath="/vendor/app/SSGTelemetryService/lib" primaryCpuAbi="armeabi-v7a" publicFlags="810073669" 
privateFlags="262144" ft="1659f8a6d70" it="1659f8a6d70" ut="1659f8a6d70" version="789610" userId="10096" 
isOrphaned="true">

        <sigs count="1" schemeVersion="3">
            <cert index="1" key="***" />
        </sigs>

        <perms>
            <item name="android.permission.RECEIVE_BOOT_COMPLETED" granted="true" flags="0" />
            <item name="android.permission.INTERNET" granted="true" flags="0" />
            <item name="android.permission.ACCESS_NETWORK_STATE" granted="true" flags="0" />
        </perms>

        <proper-signing-keyset identifier="1" />

<domain-verification packageName="com.google.android.calendar" status="0">
            <domain name="www.google.com" />
            <domain name="calendar.google.com" />
        </domain-verification>
</package>

package包含了每个app的详细信息

name: 应用的包名

codePath: apk存放位置

nativeLibraryPath: so库存放位置

primaryCpuAbi: 应用以哪种abi框架运行

publicFlags="810073669": pkg.applicationInfo.flags

privateFlags="262144":, pkg.applicationInfo.privateFlags

是根据AndroidManifest.xml里的设置生成的,例如:android:multiarch

ft="1659f8a6d70"=pkg.timeStamp: apk文件上次被更改的时间

it="1659f8a6d70"= pkg.firstInstallTime: app第一次安装的时间

ut="1659f8a6d70"=pkg.lastUpdateTime: app上次被更新时间. app重装之后,这里的ft和ut会改变

version="789610": app版本号

userId="10096": 为app分配的user id, 如果有使用shareUserId, 这里出现的就是SharedUserId

isOrphaned="true": (系统应用和预加载应用值为true)

sigs块里的count表示这个app有多少个签名信息,有的app可能会被多个证书签名。

cert里的index表示这个app使用的证书的序号,当系统发现一个新的证书,这个号就会加1,key是app使用的证书内容的ascii码值。PKMS在扫apk文件过程中,如果发现它和之前扫描到的apk使用的是相同的签名证书,这里就只会有个index的值,并没有key的值。拥有相同的index的package, 表明它们使用的是相同的签名

perms块里是这个app拥有的权限, 对于一般的app,这些权限是在AndroidManifest.xml里写明的;那些使用了相同UID(sharedUserId)的app, 这里的权限就是所有使用相同UID/(sharedUserId)的app申请的权限的总和。 granted表示这个权限是不是已经被允许。

proper-signing-keyset里的identifier就是keyset-settingskeysetsidentifier的值。它是用来标明这个app使用的是哪个公钥。

内置的应用更新后会出现<updated-package>结构块

2.3、shared-user块

shared-user块结构如下:

<shared-user name="com.google.android.calendar.uid.shared" userId="10057">

        <sigs count="1" schemeVersion="2">
            <cert index="4" />
        </sigs>

        <perms>
            …
            <item name="android.permission.WAKE_LOCK" 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,它们具有一样的权限

2.4、keyset-settings块

keyset-settings的结构如下:

<keyset-settings version="1">

        <keys>
            <public-key identifier="29" value="***" />
        </keys>

        <keysets>
            <keyset identifier="29">
                <key-id identifier="29" />
            </keyset>
        </keysets>

        <lastIssuedKeyId value="29" />
        <lastIssuedKeySetId value="29" />

</keyset-settings>

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

keysets块中包含了很多keyset, 每个keyset都有一个编号用identifier表示,keyset里包含的key-id里的identifier和上面keys中public-key的identifier的值相对应。

keys块中public-key里的value值就是从apk包里的签名文件里提取出来的的公钥的值。

lastIssuedKeyIdlastIssuedKeySetId表示的是最近一次取出来的公钥所属的set编号。

3、源码分析

/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

systemserver.main()-->systemserver.startBootstrapServices()-->PackageManagerService.main-->PackageManagerService() -->mSettings.writeLPr();

void writeLPr(){

         ...

            serializer.startTag(null, "permissions");//permissions
            
            mPermissions.writePermissions(serializer);
            serializer.endTag(null, "permissions");

            for (final PackageSetting pkg : mPackages.values()) {//package
                writePackageLPr(serializer, pkg);
            }

            for (final SharedUserSetting usr : mSharedUsers.values()) {//shared-user
                serializer.startTag(null, "shared-user");
                serializer.attribute(null, ATTR_NAME, usr.name);
                serializer.attribute(null, "userId",
                        Integer.toString(usr.userId));
                usr.signatures.writeXml(serializer, "sigs", mPastSignatures);
                writePermissionsLPr(serializer, usr.getPermissionsState()
                        .getInstallPermissionStates());
                serializer.endTag(null, "shared-user");
            }

            mKeySetManagerService.writeKeySetManagerServiceLPr(serializer);//keyset

            writePackageListLPr();//  package.list
         ...
}

[gitbook] Android框架分析系列之Android PackageManager - Android移动开发技术文章_手机开发 - 红黑联盟

https://www.jianshu.com/p/551be795bf53

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

packages.xml分析 的相关文章

随机推荐

  • SSH连接问题:连不上&不能免密登录

    一 连不上 ssh username 64 ip 报错 xff1a ssh connect to host lt ip4地址 gt port 22 Connection timed out 首先排查 xff0c 排查步骤 xff1a 1 p
  • VScode: “无法打开源文件 xxxx.h”

    原因 xff1a 缺文件 报错的文件中引用的文件 xff0c 层层索引进去 xff0c 有缺的 解决办法 xff1a 更新子模块 xff1b 重新下载源代码 xff1b 找到没有的文件 xff0c 从新的源码中复制缺失的文件 xff08 比
  • git clone PX4 环境配置与问题记录

    仿真平台基础配置 yuque com 前言 使用ubuntu下载ros px4似乎是一件十分繁琐以及困难的事情 xff0c 但是本人经过了参考大量链接 xff0c 成功安装好后 xff0c 发现这件事情其实并非难事 许多安装指导链接发布于一
  • SSH工作原理&Ubuntu20.04安装并配置SSH&设置SSH免密登录

    目录 一 SSH的介绍 xff08 服务器端 xff0c 客户端 xff09 1 SSH 远程连接工具 连接原理 xff1a 2 SSH的安全机制 3 两种级别的验证方法 xff08 登录方法 xff09 二 ssh的安装与启动 1 安装
  • SSH使用问题:无法免密登录

    一 排查服务器端 1 检查authorized keys文件权限 xff0c 并设置为700 chmod 700 authorized keys 2 检查 etc ssh sshd config文件 sudo vim etc ssh ssh
  • PX4项目学习::(一)项目架构

    目录 序 xff1a 项目整体嵌入式架构 xff1a 无人机方面做嵌入式编写的飞控总结 1软件 xff1a 2硬件 xff1a 1 PX4 Pixhawk的软件体系结构 2 下图所示为PX4的算法顶层架构 左边是整个飞控系统的控制功能实现
  • PX4项目学习::(七)飞控栈:导航(Navigator和mission控制)

    25条消息 PX4飞控之导航及任务架构 Felix ZL的博客 CSDN博客
  • 微策略春招面试总结

    春季招聘时我报的研发岗 xff0c 由于我不是杭州本地人 xff0c 故首先接到的是电话面试 xff0c 电话面试大概一周左右被通知去杭州总部面试 下面主要简述一下面试的内容 第一面是技术面 xff0c 大概持续近一个小时 首先面试官会照着
  • PX4项目学习::(六)CMakeLists.txt 文件剖析

    27条消息 PX4 CMakeLists txt 文件剖析 lipi37的博客 CSDN博客 px4 cmake makefile介绍 跟我一起写Makefile 1 0 文档 seisman github io 57条消息 PX4编译文件
  • PX4项目学习::(七)飞控栈算法梳理

    无人机算法分为三种 xff0c 分别为捷联式惯性导航系统 滤波算法和估计算法 xff08 卡尔曼滤波器 xff09 飞行控制算法 xff08 PID算法 xff09 Px4控制算法综述 1commander和navigator产生期望位置
  • PX4项目学习::(七)驱动(src-->drivers)

    PX4的spi驱动 xff0c nuttx的spi硬件抽象 古月居 guyuehome com 无人机中级篇 xff1a 第四讲 xff1a 系统级驱动程序开发 知乎 zhihu com 无人机中级篇 xff1a 第五讲 xff1a 用应级
  • PX4:二次开发:流程

    1 程序编写 xff08 用模板简单实现一个程序 xff09 gt 进阶 xff1a 不同项目下的程序规范 xff1b 调用子模块的流程 2 在Nuttx系统中注册应用并编译 为了使该程序能够编译进固件 xff0c 需要在系统的cmake文
  • 原理::定位与导航::IMU和GPS融合原理(无人驾驶)

    41条消息 动手学无人驾驶 xff08 6 xff09 xff1a 基于IMU和GPS数据融合的自车定位 自动驾驶小学生的博客 CSDN博客 41条消息 重读经典 Quaternion kinematics for the error st
  • 系统使用:vmware虚拟机如何不占用c盘

    42条消息 vmware放在D盘占用C盘空间 vmware虚拟机如何不占用c盘 wendychow001的博客 CSDN博客
  • 无人机学习指南

    学什么 xff1f 理论与开发 理论 xff1a 控制栈的原理与算法 43 通信 目的 xff1a 了解无人机的本质 知识解决的是 why 如果你遇到的问题通常是 xff0c 为什么要用欧拉角 xff1f 为什么要用滤波 xff1f 那说明
  • PX4项目学习::(八)无人机仿真综述(介绍)

    xff08 一 xff09 仿真平台 xff1a 物理化仿真平台 xff1a xff08 world 43 node xff1a 使用基础模块搭建环境 xff08 world environment xff09 与plant xff09 飞
  • PX4项目学习::(一)项目介绍::源码目录介绍

    代码目录 xff1a 1 boards 各种飞控硬件平台的配置文件 2 build 编译产生的目录 xff0c make之后生成的文件放置在这个目录 3 cmake cmake编译配置目录 4 Documentation 开发者文档目录 x
  • PX4项目学习::(三)Nuttx操作系统

    50条消息 PX4代码解析 4 超级菜狗的博客 CSDN博客 px4代码解析
  • Jetson TX2使用记录

    Jetson TX2使用记录 一 配置二 工具1 安装jtop2 安装文件同步工具3 I2C4 ssh5 模块温度 三 自启动1 自启动优化2 自启动设置1 设置WiFi开机自动连接2 设置开机自动登录 用以远程 3 应用软件自启动 3 桌
  • packages.xml分析

    data system packages 1 data system packages list 记录安装app的信息 code com android cts priv ctsshim 10028 0 data user 0 com an