Android6.0 PKMS的mSettings,mPackages变量分析


一、mSettings

mSettings在PKMS的构造函数中创建,这里mPackages变量传进去,仅仅是作为lock使用

  1. public PackageManagerService(Context context, Installer installer,  
  2.         boolean factoryTest, boolean onlyCore) {  
  3.     EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,  
  4.             SystemClock.uptimeMillis());  
  5.   
  6.     if (mSdkVersion <= 0) {  
  7.         Slog.w(TAG, "**** ro.build.version.sdk not set!");  
  8.     }  
  9.   
  10.     mContext = context;  
  11.     mFactoryTest = factoryTest;  
  12.     mOnlyCore = onlyCore;  
  13.     mLazyDexOpt = "eng".equals(SystemProperties.get("ro.build.type"));  
  14.     mMetrics = new DisplayMetrics();  
  15.     mSettings = new Settings(mPackages);  


1.1 读取packages.xml

在PKMS的构造函数中还会调用mSettings的readLPw函数,来读取data/system/packages.xml文件。

  1. mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),  
  2.         mSdkVersion, mOnlyCore);  

这个函数读取packages.xml,这里主要记录安装的应用信息(基本信息、权限、签名等),然后会把这些信息从xml文件中解析出来插到mSettings的mPackages变量中。

这些信息在安装应用,扫描目录的时候都会使用。


1.2 更新packages.xml

我们也需要不断的去更新packages.xml文件。我们来看看什么情况下需要更新这个文件

1.2.1 扫描所有目录后

最后在PKMS的构造函数最后,当扫描完各个目录的时候,会更新mSettings中的内容,这时需要重新更新packages.xml文件,就要调用如下函数。

  1. mSettings.writeLPr();  

更新的时候,会先创建一个备份文件packges-backup.xml,更新成功后会将其删除。不成功就是用这个备份文件

1.2.2 安装应用

安装应用最后会调用installNewPackageLI函数,这个函数有如下代码,会先调用scanPackageLI来解析apk文件,然后调用updateSettingsLI来更新mSettings,并且也会调用其writeLPr来更新packages.xml文件

  1. try {  
  2.     PackageParser.Package newPackage = scanPackageLI(pkg, parseFlags, scanFlags,  
  3.             System.currentTimeMillis(), user);  
  4.   
  5.     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添加成员

  1. mPackages.put(pkg.applicationInfo.packageName, pkg);  


2.2 mPackages删减

在removePackageLI会调用mPackages的remove函数

  1. void removePackageLI(PackageSetting ps, boolean chatty) {  
  2.     if (DEBUG_INSTALL) {  
  3.         if (chatty)  
  4.             Log.d(TAG, "Removing package " + ps.name);  
  5.     }  
  6.   
  7.     // writer  
  8.     synchronized (mPackages) {  
  9.         mPackages.remove(ps.name);  
  10.         final PackageParser.Package pkg = ps.pkg;  
  11.         if (pkg != null) {  
  12.             cleanPackageDataStructuresLILPw(pkg, chatty);  
  13.         }  
  14.     }  
  15. }  

而在删除apk是,会调用removePackageDataLI函数中就会调用removePackageLI函数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值