publicPackageManagerService(PackageManagerServiceInjector injector, boolean factoryTest, final String partitionsFingerprint, finalboolean isEngBuild, finalboolean isUserDebugBuild, finalint sdkVersion, final String incrementalVersion) { ......
// Bug 2258844 - add debug log or trace for PKMS(3/6) t.traceBegin("prepare package parser cache"); // 准备包解析器缓存目录,该目录的命名与设备的构建fingerprint有关 mCacheDir = PackageManagerServiceUtils.preparePackageParserCache( mIsEngBuild, mIsUserDebugBuild, mIncrementalVersion); // Bug 2258844 - add debug log or trace for PKMS(4/6) t.traceEnd();
...... }
需要注意的是,由于某些国内版本的Android设备在通过GMS(Google Mobile Services)认证后仍然需要修改系统版本信息以避免被谷歌发现,因此这些设备会将构建指纹(fingerprint)锁定。PackageManagerService(PMS)在每次开机时会根据这个指纹值在 /data/system/package_cache 目录下查找对应的缓存目录。在userdebug版本中,这个目录的名称通常为“1”,而在正常版本中,它是通过SystemProperties.digestOf(“ro.build.fingerprint”)生成的。
// The base directory for the package parser cache lives under /data/system/. finalFilecacheBaseDir= Environment.getPackageCacheDirectory(); if (!FileUtils.createDir(cacheBaseDir)) { returnnull; }
// There are several items that need to be combined together to safely // identify cached items. In particular, changing the value of certain // feature flags should cause us to invalidate any caches. finalStringcacheName= FORCE_PACKAGE_PARSED_CACHE_ENABLED ? "debug" : SystemProperties.digestOf("ro.build.fingerprint");//文件夹的名称是通过这个生成的
// Reconcile cache directories, keeping only what we'd actually use. for (File cacheDir : FileUtils.listFilesOrEmpty(cacheBaseDir)) { if (Objects.equals(cacheName, cacheDir.getName())) {//boyin if(SystemProperties.get("persist.sys.ota_done","0").equals("1")){//添加标志位,需要对ota升级应用做修改,在升级成功后把这个标志位置为1 FileUtils.deleteContentsAndDir(cacheDir); SystemProperties.set("persist.sys.ota_done","0"); Slog.d(TAG, "delete known cache ,升级成功:" + cacheDir.getName()); }