From: Calin Juravle Date: Fri, 27 Jan 2017 02:53:23 +0000 (-0800) Subject: Save package dex usage info after secondary dex reconciliation X-Git-Tag: android-x86-8.1-r1~2121^2~9^2~116^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=61fd6eab46;p=android-x86%2Fframeworks-base.git Save package dex usage info after secondary dex reconciliation Bug: 1833991 Test: add a bogus entry to /syste/data/package-dex-usage.list adb shell cmd package reconcile-secondary-dex-files com.android.google.gms wait a bit and check the bogus entry is gone (cherry picked from commit b1097411028103b6c88ce325af23d2ff1ec746c8) Change-Id: I23248b11ea07bceb6527f55bf62618d1b2c3d83d Merged-In: Ic07126bfb8730933081a5e010e3c357d338786e8 --- diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 30b949901d74..00f3711c7038 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -291,6 +291,7 @@ public class DexManager { return; } Set dexFilesToRemove = new HashSet<>(); + boolean updated = false; for (Map.Entry entry : useInfo.getDexUseInfoMap().entrySet()) { String dexPath = entry.getKey(); DexUseInfo dexUseInfo = entry.getValue(); @@ -311,7 +312,8 @@ public class DexManager { Slog.d(TAG, "Could not find package when compiling secondary dex " + packageName + " for user " + dexUseInfo.getOwnerUserId()); // Update the usage and continue, another user might still have the package. - mPackageDexUsage.removeUserPackage(packageName, dexUseInfo.getOwnerUserId()); + updated = mPackageDexUsage.removeUserPackage( + packageName, dexUseInfo.getOwnerUserId()) || updated; continue; } ApplicationInfo info = pkg.applicationInfo; @@ -322,7 +324,8 @@ public class DexManager { flags |= StorageManager.FLAG_STORAGE_CE; } else { Slog.e(TAG, "Could not infer CE/DE storage for package " + info.packageName); - mPackageDexUsage.removeUserPackage(packageName, dexUseInfo.getOwnerUserId()); + updated = mPackageDexUsage.removeUserPackage( + packageName, dexUseInfo.getOwnerUserId()) || updated; continue; } @@ -338,8 +341,13 @@ public class DexManager { } } if (!dexStillExists) { - mPackageDexUsage.removeDexFile(packageName, dexPath, dexUseInfo.getOwnerUserId()); + updated = mPackageDexUsage.removeDexFile( + packageName, dexPath, dexUseInfo.getOwnerUserId()) || updated; } + + } + if (updated) { + mPackageDexUsage.maybeWriteAsync(); } } diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java index 26134163a222..3693bce04eb1 100644 --- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java +++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java @@ -378,6 +378,8 @@ public class PackageDexUsage extends AbstractStatsBase { /** * Remove all the records about package {@code packageName} belonging to user {@code userId}. + * @return true if the record was found and actually deleted, + * false if the record doesn't exist */ public boolean removeUserPackage(String packageName, int userId) { synchronized (mPackageUseInfoMap) { @@ -402,6 +404,8 @@ public class PackageDexUsage extends AbstractStatsBase { /** * Remove the secondary dex file record belonging to the package {@code packageName} * and user {@code userId}. + * @return true if the record was found and actually deleted, + * false if the record doesn't exist */ public boolean removeDexFile(String packageName, String dexFile, int userId) { synchronized (mPackageUseInfoMap) {