Android6.0 PackageManagerService的mSettings、mPackages变量分析
2016-11-21 16:25
399 查看
这篇博客我们来分析下mSettings核mPackages变量。
这个函数读取packages.xml,这里主要记录安装的应用信息(基本信息、权限、签名等),然后会把这些信息从xml文件中解析出来插到mSettings的mPackages变量中。
这些信息在安装应用,扫描目录的时候都会使用。
更新的时候,会先创建一个备份文件packges-backup.xml,更新成功后会将其删除。不成功就是用这个备份文件
卸载普通应用也会在removePackageDataLI函数中调用writeLPr来更新packages.xml文件的。
void removePackageLI(PackageSetting ps, boolean chatty) {
if (DEBUG_INSTALL) {
if (chatty)
Log.d(TAG, "Removing package " + ps.name);
}
// writer
synchronized (mPackages) {
mPackages.remove(ps.name);
final PackageParser.Package pkg = ps.pkg;
if (pkg != null) {
cleanPackageDataStructuresLILPw(pkg, chatty);
}
}
}而在删除apk是,会调用removePackageDataLI函数中就会调用removePackageLI函数。
一、mSettings
mSettings在PKMS的构造函数中创建,这里mPackages变量传进去,仅仅是作为lock使用public PackageManagerService(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis()); if (mSdkVersion <= 0) { Slog.w(TAG, "**** ro.build.version.sdk not set!"); } mContext = context; mFactoryTest = factoryTest; mOnlyCore = onlyCore; mLazyDexOpt = "eng".equals(SystemProperties.get("ro.build.type")); mMetrics = new DisplayMetrics(); mSettings = new Settings(mPackages);
1.1 读取packages.xml
在PKMS的构造函数中还会调用mSettings的readLPw函数,来读取data/system/packages.xml文件。mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false), mSdkVersion, mOnlyCore);
这个函数读取packages.xml,这里主要记录安装的应用信息(基本信息、权限、签名等),然后会把这些信息从xml文件中解析出来插到mSettings的mPackages变量中。
这些信息在安装应用,扫描目录的时候都会使用。
1.2 更新packages.xml
我们也需要不断的去更新packages.xml文件。我们来看看什么情况下需要更新这个文件1.2.1 扫描所有目录后
最后在PKMS的构造函数最后,当扫描完各个目录的时候,会更新mSettings中的内容,这时需要重新更新packages.xml文件,就要调用如下函数。mSettings.writeLPr();
更新的时候,会先创建一个备份文件packges-backup.xml,更新成功后会将其删除。不成功就是用这个备份文件
1.2.2 安装应用
安装应用最后会调用installNewPackageLI函数,这个函数有如下代码,会先调用scanPackageLI来解析apk文件,然后调用updateSettingsLI来更新mSettings,并且也会调用其writeLPr来更新packages.xml文件try { PackageParser.Package newPackage = scanPackageLI(pkg, parseFlags, scanFlags, System.currentTimeMillis(), user); updateSettingsLI(newPackage, installerPackageName, volumeUuid, null, null, res, user);
1.2.3 卸载应用
卸载应用,无论在卸载系统应用会在deleteSystemPackageLI函数中调用writeLPr来更新packages.xml文件,卸载普通应用也会在removePackageDataLI函数中调用writeLPr来更新packages.xml文件的。
二、mPackages
mPackages代表系统中已经安装的pkg,同时它也作为一个lock对象2.1 mPackages增加
在scanPackageDirtyLI函数后面,会调用如下代码,往mPackages添加成员mPackages.put(pkg.applicationInfo.packageName, pkg);
2.2 mPackages删减
在removePackageLI会调用mPackages的remove函数void removePackageLI(PackageSetting ps, boolean chatty) {
if (DEBUG_INSTALL) {
if (chatty)
Log.d(TAG, "Removing package " + ps.name);
}
// writer
synchronized (mPackages) {
mPackages.remove(ps.name);
final PackageParser.Package pkg = ps.pkg;
if (pkg != null) {
cleanPackageDataStructuresLILPw(pkg, chatty);
}
}
}而在删除apk是,会调用removePackageDataLI函数中就会调用removePackageLI函数。
相关文章推荐
- Android PackageManagerService流程详细分析(五)之packages
- Android源码之“应用程序界面“分析二(PackageManager和PackageManagerService)
- PackageManagerService的启动过程分析
- android包管理服务(PackageManagerService)源码分析
- Android PackageManagerService分析三:卸载APK
- Android PackageManagerService详细分析
- Android PackageManagerService详细分析
- Android PackageManagerService详细分析
- Android PackageManagerService详细分析
- Android Framework 之PackageManagerService详细分析
- Android PackageManagerService分析二:安装APK
- Android PackageManagerService启动流程分析
- Android PackageManagerService详细分析
- Android服务之PackageManagerService启动源码分析
- Android PackageManagerService详细分析
- PackageManagerService 分析及执行流程
- Android PackageManagerService详细分析[转]