PackageManagerService 重要属性

        前面理解了PMS创建和调用的过程,接下来讨论PMS的构造函数。PMS的构造函数有接近千行代码,这里我们主要讨论其主要功能。首先是PMS中一些重要的属性:

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

ArrayMap<String, PackageParser.Package> mPackages:用来存储PMS扫描程序文件目录时解析得到的apk的信息的对象的集合,里面包含了所有被扫描的程序包名的package;
Settings mSettings:保存整个系统信息的Setting对象,这是一个非常重要的对象
ActivityIntentResolver mActivities:遍历所有程序的目录,并解析所有的注册清单文件,将提取所有的Activity的Intent-filter数据保存在对应的集合中;
ActivityIntentResolver mReceivers:遍历所有程序的目录,并解析所有的注册清单文件,将提取所有的Recevicer的Intent-filter数据保存在对应的集合中;
ServiceIntentResolver mServices:与前面两个差不多,将提取所有的Service的Intent-filter数据保存在对应的集合中;
ProviderIntentResolver mProviders:提取所有的Provider的Intent-filter数据保存在对应的集合中;


PackageParser:解析apk文件的主要类,调用其parserPackage()方法执行解析操作;
PackageParser.Package:PackageParser的内部类,保存apk文件中的解析信息,每个应用程序对应一个Package对象,属性信息如下:
String packageName:程序包名
String codePath: 软件包的路径
ApplicationInfo applicationInfo :applicationInfo对象
final ArrayList permissions:申请权限的集合
final ArrayList activities:Activity标签解析的结合
final ArrayList receivers:Receiver标签解析的结合
final ArrayList providers :Provider标签解析的结合
final ArrayList services :Service标签解析的结合
Bundle mAppMetaData = null:注册清单中设置的信息
int mVersionCode:版本Code
String mVersionName:版本名称
int mCompileSdkVersion:Sdk版本

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

Settings:PMS内部主要保存信息的类,主要属性如下:

mSettingsFilename:配置系统目录下的package.xml文件
mSystemDir = new File(dataDir, "system"); //系统的/data/system/目录 
mSettingsFilename = new File(mSystemDir, "packages.xml"); //获取系统目录下package.xml文件

mBackupSettingsFilename:配置系统目录下的packages-backup.xml文件,一般在创建和修改package.xml文件前,会先创建packages-backup.xml保存原来信息,在操作读写后会删除此文件; 

mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");

mPackageListFilename:配置系统目录下的packages.list文件,保存了所有应用程序列表,每一行对应一个应用程序 

mPackageListFilename = new File(mSystemDir, "packages.list");
如:com.android.lin 10032 1 data/data/com.android.lin ,
第一项:应用程序包名
第二项:Linux用户Id
第三项:1表示可以debug,0表示不能debug
第四项:程序数据文件目录
/** Map from package name to settings */
final ArrayMap<String, PackageSetting> mPackages = new ArrayMap<>();
解析package.xml文件中的每个程序信息保存在PackageSetting对象中,将所有程序的PackageSetting都填充到集合中
   // List of replaced system applications
    private final ArrayMap<String, PackageSetting> mDisabledSysPackages =
        new ArrayMap<String, PackageSetting>();

mDisabledSysPackages:保存那些没有经过正常程序卸载的应用程序列表,按照正常卸载程序时,PMS会自动删除package.xml文件中的信息,使用adb命令或其他方法删除时package文件信息则不会删除,系统启动时PMS会检查package文件,并检查对应的应用程序的文件目录,从而判断是否意外删除,如果意外删除则加入mDisabledSysPackages集合;
mUserIds:保存Linux下所有的用户Id列表
mPendingPackages:在解析每个PackageSetting时如果是使用sharedId,则将此Setting加入此集合,等相应的share-user标签后再补充Setting
mPastSignatures:保存所有的签名文件信息
mPermissions:保存所有的权限信息
ArraySet mInstallerPackages:已安装的应用软件包 

 接下来是packages.xml文件的相关属性

/data/system/packages.xml :系统的配置文件,记录所有的应用程序的包管理信息,PMS根据此文件管理所有程序

last-platform-version:记录系统最后一次修改的版本信息;
permissions:保存系统中所有的权限信息列表,系统权限以androd开头、自定义权限以包名开头;
sigs:签名标签,一个程序只能有一个签名但可以有多个证书,包含count属性表示证书数量;
cert:表示签名证书,包含index、key属性,index表示证书的下标;
perms:表示一个程序中声明使用的权限列表,存在package标签之下;
package:包含一个应用程序的对应关系:
(1)name:应用程序的包名
(2)codePath:程序apk文件所在的路径
(3)nativeLibraryPath:程序中使用的native文件路径,一般指程序包下的lib文件中导入的依赖
(4)flags:表示应用程序的类型
(5)it、ut:分别表示程序首次安装的install time、更新时间update time
(6)userId:表示应用程序在Linux下的用户id
(7)shareId:表示应用程序所共享的Linux用户Id,与userId互斥
(8)installer:安装器的名称,在调用PackageManager.installPackage()方法时设置的名称

这些属性和文件对于我们理解PMS都是至关重要的。

原文链接:https://blog.csdn.net/Alexwll/article/details/102777742 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值