From c23b0165f86f2d4dde3010acf84138d75014a30a Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Thu, 26 Mar 2020 19:23:51 -0700 Subject: [PATCH] Synchronize before calling unstableRemoveIf The call to unstableRemoveIf should be synchronized on the ResourcesManager instance since the collection belongs to the instance. Also remove dead code from the loader refactor to prevent apps from creating AssetManagers that return InputStreams instead of AssetInputStreams. Bug: 145510133 Test: boots Change-Id: I50bcfc8e882f3d8a7827688e32f68790dd226801 --- core/java/android/app/ResourcesManager.java | 27 ++++++++-------- .../android/content/res/ResourcesImpl.java | 31 ++----------------- 2 files changed, 16 insertions(+), 42 deletions(-) diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 5f756033390b8..e5229b2a3bb4c 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -214,11 +214,10 @@ public class ResourcesManager { for (int i = mCachedApkAssets.size() - 1; i >= 0; i--) { final ApkKey key = mCachedApkAssets.keyAt(i); if (key.path.equals(path)) { - WeakReference apkAssetsRef = mCachedApkAssets.remove(key); + WeakReference apkAssetsRef = mCachedApkAssets.removeAt(i); if (apkAssetsRef != null && apkAssetsRef.get() != null) { apkAssetsRef.get().close(); } - mCachedApkAssets.remove(key); } } } @@ -774,19 +773,21 @@ public class ResourcesManager { * Rebases a key's override config on top of the Activity's base override. */ private void rebaseKeyForActivity(IBinder activityToken, ResourcesKey key) { - final ActivityResources activityResources = - getOrCreateActivityResourcesStructLocked(activityToken); + synchronized (this) { + final ActivityResources activityResources = + getOrCreateActivityResourcesStructLocked(activityToken); - // Clean up any dead references so they don't pile up. - ArrayUtils.unstableRemoveIf(activityResources.activityResources, - sEmptyReferencePredicate); + // Clean up any dead references so they don't pile up. + ArrayUtils.unstableRemoveIf(activityResources.activityResources, + sEmptyReferencePredicate); - // Rebase the key's override config on top of the Activity's base override. - if (key.hasOverrideConfiguration() - && !activityResources.overrideConfig.equals(Configuration.EMPTY)) { - final Configuration temp = new Configuration(activityResources.overrideConfig); - temp.updateFrom(key.mOverrideConfiguration); - key.mOverrideConfiguration.setTo(temp); + // Rebase the key's override config on top of the Activity's base override. + if (key.hasOverrideConfiguration() + && !activityResources.overrideConfig.equals(Configuration.EMPTY)) { + final Configuration temp = new Configuration(activityResources.overrideConfig); + temp.updateFrom(key.mOverrideConfiguration); + key.mOverrideConfiguration.setTo(temp); + } } } diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index acdd47a4d61ee..f40d60dbde5ad 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -57,8 +57,6 @@ import android.view.DisplayAdjustments; import com.android.internal.util.GrowingArrayUtils; -import libcore.io.IoUtils; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -817,27 +815,6 @@ public class ResourcesImpl { } } - /** - * Loads a Drawable from an encoded image stream, or null. - * - * This call will handle closing the {@link InputStream}. - */ - @Nullable - private Drawable decodeImageDrawable(@NonNull InputStream inputStream, - @NonNull Resources wrapper, @NonNull TypedValue value) { - ImageDecoder.Source src = ImageDecoder.createSource(wrapper, inputStream, value.density); - try { - return ImageDecoder.decodeDrawable(src, (decoder, info, s) -> - decoder.setAllocator(ImageDecoder.ALLOCATOR_SOFTWARE)); - } catch (IOException ignored) { - // This is okay. This may be something that ImageDecoder does not - // support, like SVG. - return null; - } finally { - IoUtils.closeQuietly(inputStream); - } - } - /** * Loads a drawable from XML or resources stream. * @@ -902,12 +879,8 @@ public class ResourcesImpl { } else { final InputStream is = mAssets.openNonAsset( value.assetCookie, file, AssetManager.ACCESS_STREAMING); - if (is instanceof AssetInputStream) { - AssetInputStream ais = (AssetInputStream) is; - dr = decodeImageDrawable(ais, wrapper, value); - } else { - dr = decodeImageDrawable(is, wrapper, value); - } + final AssetInputStream ais = (AssetInputStream) is; + dr = decodeImageDrawable(ais, wrapper, value); } } finally { stack.pop();