From b1097411028103b6c88ce325af23d2ff1ec746c8 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Thu, 26 Jan 2017 18:53:23 -0800 Subject: [PATCH] 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 Change-Id: Ic07126bfb8730933081a5e010e3c357d338786e8 --- .../core/java/com/android/server/pm/dex/DexManager.java | 14 +++++++++++--- .../java/com/android/server/pm/dex/PackageDexUsage.java | 4 ++++ 2 files changed, 15 insertions(+), 3 deletions(-) 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 cc4b1c20d8b4..964ed9880605 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -282,6 +282,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(); @@ -302,7 +303,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; @@ -313,7 +315,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; } @@ -329,8 +332,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) { -- 2.11.0