8.2.10 更新packages文件

mSettings. writeLPr()方法负责将mSettings中存储的package信息写入以下4个文件,mSettings.readLPr()方法则负责读取这些文件的信息。

/data/system/packages. xml

/data/system/packages-backup. xml

/data/system/packages-stopped. xml

/data/system/packages-stopped-backup. xml.xml

writeLPr的执行流程如下:

步骤1 判断packages.xml是否存在。

如果存在,判断packages-backup.xml是否也存在。如果两者同时存在,说明已经将packages.xml备份到packages-backup.xml,此时删除packages.xml;如果packages-backup.xml不存在,把packages.xml重命名为packages-backup.xml,如果重命名失败,writeLPr()方法将直接返回。经过上述处理,系统中将只存在packages-backup.xml。

步骤2 将mSettings中的信息写入packages.xml。

通过文件输出流将mSettings中的信息持久化到packages.xml。写入成功后,packages.xml中的标签与mSettings对象中的成员变量的对应关系如表8-1所示。

8.2.10 更新packages文件 - 图1

新的packages.xml成功创建后,不再需要其备份文件packages-backup.xml了,此时需要删除packages-backup.xml。

步骤3 创建packages.list文件。

首先创建packages.list.tmp文件,将mSettings.mPackages中相应信息依次写入该文件,随后将文件内容更新到packages.list。写入的内容如下所示:


com.android.defcontainer 10003 0/data/data/com.android.defcontainer

com.android.launcher 10013 0/data/data/com.android.launcher

com.android.quicksearchbox 10033 0/data/data/com.android.quicksearchbox

com.android.contacts 10001 0/data/data/com.android.contacts


每行都对应一个应用程序,每行由四列组成,分别是1)包名,2)UID,3)是否可以Debug,4)数据文件目录;每列之间用空格隔开。mSettings.mPackages中存储PackageSettings类型的pkg对象,每个pkg对象中又存储ApplicationInfo类型的ai对象。其中包名取自ai.packageName;UID取自ai.uid;是否可以进行Debug需要根据ai.flags中是否设置了ApplicationInfo.FLAG_DEBUGGABLE标记做出判断,1表示可以Debug,0表示不可以Debug;数据文件目录列取自ai.dataDir。

步骤4 写入mSettings的信息。

使用writeAllUsersPackageRestrictionsLPr方法把mSettings的信息写入data/system/users<uid>/package-restrictions.xml中,其处理流程与packages.xml的处理过程相似,也有相应的备份文件package-restrictions-backup.xml。写入该文件的信息主要是处于stop、not launched、disabled状态的应用程序信息。写入成功后,同样需要删除package-restrictions-backup.xml备份文件。

至此,PackageManagerService的启动过程就分析完了,接下来开始分析PackageManager Service使用的核心组件Installer。