diff options
| author | 2017-01-20 01:59:14 +0000 | |
|---|---|---|
| committer | 2017-01-20 01:59:18 +0000 | |
| commit | 5bb4c96d43b31d1a79393cf54b8e3c3ce414bdef (patch) | |
| tree | 18dd6567e6eda129a44d11c4af6ead050739c9ce | |
| parent | 17671ff0bff1e577fd43fcd4d7f4986817cd1226 (diff) | |
| parent | d33ef5665159212e190d2cccda55e77b19779e75 (diff) | |
Merge "ActivityThread: Only update code paths that have been added"
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 13 | ||||
| -rw-r--r-- | core/java/android/app/LoadedApk.java | 12 |
2 files changed, 22 insertions, 3 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 74614cc8a703..d814ddcc7f27 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4919,18 +4919,27 @@ public final class ActivityThread { } void handleApplicationInfoChanged(@NonNull final ApplicationInfo ai) { + // Updates triggered by package installation go through a package update + // receiver. Here we try to capture ApplicationInfo changes that are + // caused by other sources, such as overlays. That means we want to be as conservative + // about code changes as possible. Take the diff of the old ApplicationInfo and the new + // to see if anything needs to change. synchronized (mResourcesManager) { // Update all affected loaded packages with new package information WeakReference<LoadedApk> ref = mPackages.get(ai.packageName); LoadedApk apk = ref != null ? ref.get() : null; if (apk != null) { - apk.updateApplicationInfo(ai, null); + final ArrayList<String> oldPaths = new ArrayList<>(); + LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths, null /*outLibPaths*/); + apk.updateApplicationInfo(ai, oldPaths); } ref = mResourcePackages.get(ai.packageName); apk = ref != null ? ref.get() : null; if (apk != null) { - apk.updateApplicationInfo(ai, null); + final ArrayList<String> oldPaths = new ArrayList<>(); + LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths, null /*outLibPaths*/); + apk.updateApplicationInfo(ai, oldPaths); } // Update all affected Resources objects to use new ResourcesImpl diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index db1162a3cbb3..4ab07432ad1f 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -16,6 +16,8 @@ package android.app; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -262,7 +264,15 @@ public final class LoadedApk { return ai.sharedLibraryFiles; } - public void updateApplicationInfo(ApplicationInfo aInfo, List<String> oldPaths) { + /** + * Update the ApplicationInfo for an app. If oldPaths is null, all the paths are considered + * new. + * @param aInfo The new ApplicationInfo to use for this LoadedApk + * @param oldPaths The code paths for the old ApplicationInfo object. null means no paths can + * be reused. + */ + public void updateApplicationInfo(@NonNull ApplicationInfo aInfo, + @Nullable List<String> oldPaths) { setApplicationInfo(aInfo); final List<String> newPaths = new ArrayList<>(); |