6,下面看一下Settings的createNewUserLILPw函数
void createNewUserLILPw(PackageManagerService service, Installer installer,
int userHandle, File path) {
//创建“data/user/userId”文件夹
path.mkdir();
FileUtils.setPermissions(path.toString(), FileUtils.S_IRWXU | FileUtils.S_IRWXG
| FileUtils.S_IXOTH, -1, -1);
for (PackageSetting ps : mPackages.values()) {
// Only system apps are initially installed.
//存放在"system/app"文件夹下的app都属于系统应用
//他们都具有这样的属性:(ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0
//将所有"system/app"文件夹下的app的PackageUserState的installed属性置为true
ps.setInstalled((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0, userHandle);
// Need to create a data directory for all apps under this user.
installer.createUserData(ps.name,
UserHandle.getUid(userHandle, ps.appId), userHandle);
}
// 从”etc/preferred-apps”目录下的XML文件
readDefaultPreferredAppsLPw(service, userHandle);
// 写当前用户的“data/system/users/userId/package-restrictions.xml”文件
writePackageRestrictionsLPr(userHandle);
}
复制代码 A,该方法首先将所有“system/app”文件夹下的系统应用的installed属性设置为true
B,然后调用Installer.java中的createUserData函数
C,读取”etc/preferred-apps”目录下的XML文件
D,写入当前用户的“data/system/users/userId/package-restrictions.xml”文件
7,下面我们重点看看writePackageRestrictionsLPr函数,该函数源码如下
void writePackageRestrictionsLPr(int userId) {
if (DEBUG_MU) {
Log.i(TAG, "Writing package restrictions for user=" + userId);
}
// Keep the old stopped packages around until we know the new ones have
// been successfully written.
//指向文件“data/system/users/userId/package-restrictions.xml”
File userPackagesStateFile = getUserPackagesStateFile(userId);
//指向文件“data/system/users/userId/package-restrictions-backup.xml”
File backupFile = getUserPackagesStateBackupFile(userId);
new File(userPackagesStateFile.getParent()).mkdirs();
if (userPackagesStateFile.exists()) {
// Presence of backup settings file indicates that we failed
// to persist packages earlier. So preserve the older
// backup for future reference since the current packages
// might have been corrupted.
if (!backupFile.exists()) {
if (!userPackagesStateFile.renameTo(backupFile)) {
Log.wtf(PackageManagerService.TAG, "Unable to backup user packages state file, "
+ "current changes will be lost at reboot");
return;
}
} else {
userPackagesStateFile.delete();
Slog.w(PackageManagerService.TAG, "Preserving older stopped packages backup");
}
}
try {
final FileOutputStream fstr = new FileOutputStream(userPackagesStateFile);
final BufferedOutputStream str = new BufferedOutputStream(fstr);
final XmlSerializer serializer = new FastXmlSerializer();
serializer.setOutput(str, "utf-8");
serializer.startDocument(null, true);
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
//XML标记:package-restrictions
serializer.startTag(null, TAG_PACKAGE_RESTRICTIONS);
for (final PackageSetting pkg : mPackages.values()) {
PackageUserState ustate = pkg.readUserState(userId);
if (ustate.stopped || ustate.notLaunched || !ustate.installed
|| ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT
|| ustate.blocked
|| (ustate.enabledComponents != null
&& ustate.enabledComponents.size() > 0)
|| (ustate.disabledComponents != null
&& ustate.disabledComponents.size() > 0)) {
//XML标记:pkg
serializer.startTag(null, TAG_PACKAGE);
//XML标记:name
serializer.attribute(null, ATTR_NAME, pkg.name);
if (DEBUG_MU) Log.i(TAG, " pkg=" + pkg.name + ", state=" + ustate.enabled);
if (!ustate.installed) {
//XML标记:inst
serializer.attribute(null, ATTR_INSTALLED, "false");
}
if (ustate.stopped) {
//XML标记:stopped
serializer.attribute(null, ATTR_STOPPED, "true");
}
if (ustate.notLaunched) {
//XML标记:nl
serializer.attribute(null, ATTR_NOT_LAUNCHED, "true");
}
if (ustate.blocked) {
//XML标记:
serializer.attribute(null, ATTR_BLOCKED, "true");
}
if (ustate.enabled != COMPONENT_ENABLED_STATE_DEFAULT) {
//XML标记:enabled
serializer.attribute(null, ATTR_ENABLED,
Integer.toString(ustate.enabled));
if (ustate.lastDisableAppCaller != null) {
//XML标记:enabledCaller
serializer.attribute(null, ATTR_ENABLED_CALLER,
ustate.lastDisableAppCaller);
}
}
if (ustate.enabledComponents != null
&& ustate.enabledComponents.size() > 0) {
//XML标记:enabled-components
serializer.startTag(null, TAG_ENABLED_COMPONENTS);
for (final String name : ustate.enabledComponents) {
//XML标记:item
serializer.startTag(null, TAG_ITEM);
//XML标记:name
serializer.attribute(null, ATTR_NAME, name);
//XML标记:item
serializer.endTag(null, TAG_ITEM);
}
//XML标记:enabled-components
serializer.endTag(null, TAG_ENABLED_COMPONENTS);
}
if (ustate.disabledComponents != null
&& ustate.disabledComponents.size() > 0) {
//XML标记:disabled-components
serializer.startTag(null, TAG_DISABLED_COMPONENTS);
for (final String name : ustate.disabledComponents) {
serializer.startTag(null, TAG_ITEM);
serializer.attribute(null, ATTR_NAME, name);
serializer.endTag(null, TAG_ITEM);
}
serializer.endTag(null, TAG_DISABLED_COMPONENTS);
}
//XML标记:pkg
serializer.endTag(null, TAG_PACKAGE);
}
}
writePreferredActivitiesLPr(serializer, userId, true);
serializer.endTag(null, TAG_PACKAGE_RESTRICTIONS);
serializer.endDocument();
str.flush();
FileUtils.sync(fstr);
str.close();
// New settings successfully written, old ones are no longer
// needed.
backupFile.delete();
FileUtils.setPermissions(userPackagesStateFile.toString(),
FileUtils.S_IRUSR|FileUtils.S_IWUSR
|FileUtils.S_IRGRP|FileUtils.S_IWGRP,
-1, -1);
// Done, all is good!
return;
} catch(java.io.IOException e) {
Log.wtf(PackageManagerService.TAG,
"Unable to write package manager user packages state, "
+ " current changes will be lost at reboot", e);
}
// Clean up partially written files
if (userPackagesStateFile.exists()) {
if (!userPackagesStateFile.delete()) {
Log.i(PackageManagerService.TAG, "Failed to clean up mangled file: "
+ mStoppedPackagesFilename);
}
}
}
复制代码 A,该函数主要工作就是写入当前用户的“data/system/users/userId/package-restrictions.xml” |