summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Calin Juravle <calin@google.com> 2017-01-26 18:53:23 -0800
committer Calin Juravle <calin@google.com> 2017-03-02 13:14:03 -0800
commit61fd6eab463d5b86ef177537c149ee45a0a40dcc (patch)
treeb39676462090970966b28c51a27c05359f61b79a
parent574994afde208fcb60f5aea9921b9b381e13e888 (diff)
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
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java14
-rw-r--r--services/core/java/com/android/server/pm/dex/PackageDexUsage.java4
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 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<String> dexFilesToRemove = new HashSet<>();
+ boolean updated = false;
for (Map.Entry<String, DexUseInfo> 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<Void> {
/**
* 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<Void> {
/**
* 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) {