表现为,ota升级后应用没有更新,比如新内置应用不出现,需要恢复出厂设置才行,这里提供一种办法强制刷新缓存
修改PackageManagerService.java
这是因为国内版本为了过GMS版本后还能修改版本不让谷歌发现所以把fingerprint锁住了,PMS会在每次开机时根据fingerprint值在/data/system/package_cache目录下找fingerprint对应digest的cache目录,我这里是因为是userdebug版本,所以这里目录名称为1正常的是SystemProperties.digestOf("ro.build.fingerprint")通过这个生成的名称
正常ota升级的话这个值会变,所以会清空之前的缓存,使用新生成的目录,需要做如下特殊操作使系统在升级完ota后去更新缓存目录
final File cacheBaseDir = Environment.getPackageCacheDirectory();
if (!FileUtils.createDir(cacheBaseDir)) {
return null;
}
// 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.
final String cacheName = 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());
}
Slog.d(TAG, "Keeping known cache " + cacheDir.getName());
} else {
Slog.d(TAG, "Destroying unknown cache " + cacheDir.getName());
FileUtils.deleteContentsAndDir(cacheDir);
}
}
标签:缓存,SystemProperties,OTA,fingerprint,cache,升级,cacheDir,ota,FileUtils
From: https://blog.51cto.com/u_16228977/7121896