2.3 packages.xml中的privateFlags字段
前文提到,packages.xml 这个文件位于ROM设备的 data/system,读取需要root权限。记录系统中所有安装的应用信息,包含基本信息、签名和权限等。 与2.2类似,下面来分析确认一下privateFlags字段与LOCAL_PRIVILEGED_MODULE的关系。
PackageManagerService在install和scan应用的过程中,有些属性会持久化,以便下次使用。frameworks/base/services/core/Java/com/Android/server/pm/下有关的几个setting类:
abstract class SettingBase
/**
* Settings base class for pending and resolved classes.
*/
abstract class PackageSettingBase extends SettingBase
/**
* Settings data for a particular package we know about.
*/
final class PackageSetting extends PackageSettingBase
以上三个类是设置的item,即对应每个app的设置项。在PMS中,维护有成员变量
final Settings mSettings;
Settings这个类同样位于frameworks/base/services/core/Java/com/Android/server/pm/,它包含一个PackageSetting的Map:
/**
* Holds information about dynamic settings.
*/
final class Settings {
......
final ArrayMap<String, PackageSetting> mPackages =
new ArrayMap<String, PackageSetting>();
......
}
Settings的构造方法:
Settings(Object lock) {
this(Environment.getDataDirectory(), lock);
}
Settings(File dataDir, Object lock) {
mLock = lock;
mRuntimePermissionsPersistence = new RuntimePermissionPersistence(mLock);
mSystemDir = new File(dataDir, "system");
mSystemDir.mkdirs();
FileUtils.setPermissions(mSystemDir.toString(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG
|FileUtils.S_IROTH|FileUtils.S_IXOTH,
-1, -1);
mSettingsFilename = new File(mSystemDir, "packages.xml");
mBackupSettingsFilename = new File(mSystemDir, "packages-backup.xml");
mPackageListFilename = new File(mSystemDir, "packages.list");
FileUtils.setPermissions(mPackageListFilename, 0640, SYSTEM_UID, PACKAGE_INFO_GID);
// Deprecated: Needed for migration
mStoppedPackagesFilename = new File(mSystemDir, "packages-stopped.xml");
mBackupStoppedPackagesFilename = new File(mSystemDir, "packages-stopped-backup.xml");
}
PMS中的mSettings是在PMS构造方法中被创建对象:
mSettings = new Settings(mPackages);
这次调用传递的参数是mPackages,这个在