Android6.0 PackageManagerService(PMS)-简介

1.PMS介绍

PMS是PackageManagerService的缩写,主要负责各种APK的安装,卸载,优化和查询。

Android系统中,pm工具是PMS的一个展现命令。通过了解pm的使用,可以了解PMS究竟提供了哪些具体的功能,进而帮助我们理解和分析PMS的源码实现。[待添加]

接下来分析下Android6.0版本的PMS各个功能实现过程。

2.PMS相关

2.1 APK主要分为两类:

1.系统自带的APK,路径如下:
/system/priv-app:系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使用android:protectionLevel=signatureOrSystem,则app必须此目录中。
/system/app:存放的系统app权限相对较低,而且当拥有root权限时,就有可能卸载掉这些app。
/vendor/app:存放vendor厂商的app。
/oem/app:存放oem特有的app。
2.用户安装的第三方APK,路径如下:
/data/app:用户安装的第三方app。

注:PMS启动的时候,也是按照上述顺序逐个扫描解析这些目录中的apk的。

2.2 安装APK的方法:

一、系统应用的安装:PMS启动的时候完成,没有安装界面。
二、通过设备自带的应用商店下载的apk:下载完APK之后,调用Packagemanager接口安装,没有安装界面。
三、ADB命令安装:adb命令实际上是通过pm命令来安装的,同样没有安装界面。
四、第三方应用安装:通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。


注:在Android 5.0之前,Android系统会监视前面所说的几个存放apk的路径,一旦发现有新的apk被放进去了,就会自带安装。5.0之后,不在采取此策略。只有系统启动的时候,才会扫描这写路径中的apk。

2.3 apk数据存储的位置:

apk安装之后,产生的数据都存储在/data文件中。
/data/app:用户安装的第三方apk,以及app所依赖的native library都放在这里。
/data/data:是系统当前用户安装的所有app的沙箱目录。该目录实际上是“/data/user/用户ID”这个目录的引用。随着用户的切换,“/data/data/”也会映射为不同的用户。[但adb中root模式下才能ls,否则显示 opendir failed, Permission denied]

2.4 PMS的配置文件:

PMS会产生一些配置文件,用来记录系统当前安装的app这些文件存储在/data/system/中
一、packages.xml
记录系统中所有已经安装的应用信息,包括基本信息,签名和权限。当操作该文件的时候,总会创建备份文件packages-backup.xml。当正常操作完成的时候,会删除该备份。否则,当PMS下次启动的时候,一旦发现有backup文件,就会优先解析备份文件。

当一个app被升级覆盖安装时,会使用updated-packages表示,当新旧版本app的包名发生改变时,会使用renamed-package记录。
截取packages.xml内部分内容如下:

    <package name="com.android.bcm.bluetooth" codePath="/system/app/BluetoothBcm" nativeLibraryPath="/system/app/BluetoothBcm/lib" primaryCpuAbi="armeabi-v7a" publicFlags="810073669" privateFlags="0" ft="20b70" it="15d8a9db2a8" ut="20b70" version="23" sharedUserId="1002">
        <sigs count="1">
            <cert index="2" key="一长串数字" />
        </sigs>
        <perms>
            <item name="android.permission.REAL_GET_TASKS" granted="true" flags="0" />
           	...
            <item name="android.permission.MEDIA_CONTENT_CONTROL" granted="true" flags="0" />
        </perms>
        <proper-signing-keyset identifier="1" />
    </package>


    <shared-user name="android.media" userId="10003">
        <sigs count="1">
            <cert index="3" />
        </sigs>
        <perms>
            <item name="android.permission.ACCESS_CACHE_FILESYSTEM" granted="true" flags="0" />
            ...
            <item name="android.permission.UPDATE_APP_OPS_STATS" granted="true" flags="0" />
        </perms>
    </shared-user>

name:程序包名称
codePath:程序包所在路径
nativeLibraryPath:该程序所使用的native库文件路径。
primaryCpuAbi:apk支持的abi类型(优先)
userId:应用程序对应的Linux用户Id
sharedUserId:若在androidManifest.xml中定义了sharedUserId,则此处使用它而非userId。
Sigs:签名信息。一个应用程序只能有一个签名。
Perms:一个应用程序所申请的权限列表。androidManifest.xml中每使用一个<uses-permission>,则packages.xml中<perms>标签就会增加一项。
Shared-user标签:定义了共享用户id对应的签名和权限。

二、packages-stoped.xml
记录系统中被强制停止运行的app的信息。它同样可能存在一个packages-stoped-backup.xml的备份文件,当备份文件存在的时候,优先使用备份文件。因为原文件可能已经损坏了。

三、packages.list
保存应用的数据目录和uid信息。
截取部分内容如下:

com.kookong.tv.livematch 10030 0 /data/data/com.kookong.tv.livematch default 3002,3003,3001
com.letv.tvos.gamecenter 10064 0 /data/data/com.letv.tvos.gamecenter default 3002,3003,3001
com.android.bcm.bluetooth 1002 0 /data/data/com.android.bcm.bluetooth platform 3002,3003,3001,3008,3005,1016,3004
com.stv.network.diagnotics 1000 0 /data/data/com.stv.network.diagnotics platform 2001,3002,1023,1015,3003,3001,1007

第一列为app的包名,第二列的数字为此app的用户ID,第三列中的0,表示此app所属的系统用户ID,第四列为此app的数据文件目录,第五列default为seinfo,SEAndroid相关机制会使用该字段,最后一列记录了该app所在的权限组,也就是说拥有哪些权限。

2.5 系统硬件特性和权限

PMS启动的时候会从/system/etc/permissions/中读取当前Android设备的硬件特性和设定的相关权限。
所谓的硬件特性,狭义上可以理解为当前设备支持哪些外设,比如camera,NFC,wifi,usb等等。正是因为解析了该目录中的文件,所以可以通过pm命令查看features和permissions等信息。

2.6 多用户管理

PMS还要对多用户进行管理。因为安装apk的时候,可以PMS可以指定给某个特定的用户,也可以安装给全部的用户。

2.7 权限动态管理

Android6.0中允许动态授权和取消App中申请的权限。修改后会相应的写入runtime-permissions.xml

    原文作者:Dr_Unknown
    原文地址: https://blog.csdn.net/Dr_Unknown/article/details/77450944
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞