一上来就clear了一下这两个变量mPendingPackages,mPastSignatures
private final ArrayList<PendingPackage> mPendingPackages = new ArrayList<PendingPackage>();
private final ArrayList<Signature> mPastSignatures =new ArrayList<Signature>();
看样子是往这两个变量里存东西了
1 读包信息
(1)如果当前的tag是package,那么就用readPackageLPw解析package相关的信息并保存起来
if (tagName.equals("package")) {
readPackageLPw(parser);
解析比较简单,无非就是根据package的值给相应的变量赋值
当解析完成后,如果userId>0就意味着这个包的userid是确定的了,可以保存起来:
else if (userId > 0) {
packageSetting = addPackageLPw(name.intern(), realName, new File(codePathStr),
new File(resourcePathStr), nativeLibraryPathStr, userId, versionCode,
pkgFlags);
包的信息最终保存在了mPackages中:
p = new PackageSetting(name, realName, codePath, resourcePath, nativeLibraryPathString,
vc, pkgFlags);
p.userId = uid;
if (addUserIdLPw(uid, p, name)) {
mPackages.put(name, p);
return p;
}
否则的话再看一下它是不是和别人共用ID的,如果是则把这个包的信息放到mPendingPackages中,表示这些包的user id还不能确认到底是多少,需要后续进一步处理
} else if (sharedIdStr != null) {
userId = sharedIdStr != null ? Integer.parseInt(sharedIdStr) : 0;
if (userId > 0) {
packageSetting = new PendingPackage(name.intern(), realName, new File(
codePathStr), new File(resourcePathStr), nativeLibraryPathStr, userId,
versionCode, pkgFlags);
packageSetting.setTimeStamp(timeStamp);
packageSetting.firstInstallTime = firstInstallTime;
packageSetting.lastUpdateTime = lastUpdateTime;
mPendingPackages.add((PendingPackage) packageSetting);
如果上面的两种情况都不是,那就表明这个包的user id肯定没戏了,接着就走异常处理流程了。
(2)读permissions信息
else if (tagName.equals("permissions")) {
readPermissionsLPw(mPermissions, parser);
} else if (tagName.equals("permission-trees")) {
readPermissionsLPw(mPermissionTrees, parser);
}
permissions和permission-trees的信息分别保存在了mPermissions和mPermissionTrees中。
(3)读shared-user
else if (tagName.equals("shared-user")) {
readSharedUserLPw(parser);
}
shared-user的信息最终保存到了mSharedUsers中
if (addUserIdLPw(uid, s, name)) {
mSharedUsers.put(name, s);
return s;
}