Revert "[res] Duplicate AssetManager when changes are needed"

This reverts commit 40c4f8c8a78afb29fd2fa8ab9dd876569cdab123.

Bug: 379317468

Reason for revert: b/379317468

Change-Id: Id8c5c7cb7fc884234deae33caaa13236fb2a9a57
diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java
index f702b85..a458b4e 100644
--- a/core/java/android/app/ResourcesManager.java
+++ b/core/java/android/app/ResourcesManager.java
@@ -174,54 +174,22 @@
     }
 
     /**
-     * Apply the registered library paths to the passed AssetManager. If may create a new
-     * AssetManager if any changes are needed and it isn't allowed to reuse the old one.
-     *
-     * @return new AssetManager and the hash code for the current version of the registered paths
+     * Apply the registered library paths to the passed impl object
+     * @return the hash code for the current version of the registered paths
      */
-    public @NonNull Pair<AssetManager, Integer> updateResourceImplAssetsWithRegisteredLibs(
-            @NonNull AssetManager assets, boolean reuseAssets) {
+    public int updateResourceImplWithRegisteredLibs(@NonNull ResourcesImpl impl) {
         if (!Flags.registerResourcePaths()) {
-            return new Pair<>(assets, 0);
+            return 0;
         }
 
-        final int size;
-        final PathCollector collector;
-
-        synchronized (mLock) {
-            size = mSharedLibAssetsMap.size();
-            if (assets == AssetManager.getSystem()) {
-                return new Pair<>(assets, size);
-            }
-            collector = new PathCollector(resourcesKeyFromAssets(assets));
-            for (int i = 0; i < size; i++) {
-                final var libraryKey = mSharedLibAssetsMap.valueAt(i).getResourcesKey();
-                collector.appendKey(libraryKey);
-            }
+        final var collector = new PathCollector(null);
+        final int size = mSharedLibAssetsMap.size();
+        for (int i = 0; i < size; i++) {
+            final var libraryKey = mSharedLibAssetsMap.valueAt(i).getResourcesKey();
+            collector.appendKey(libraryKey);
         }
-        if (collector.isSameAsOriginal()) {
-            return new Pair<>(assets, size);
-        }
-        if (reuseAssets) {
-            assets.addPresetApkKeys(extractApkKeys(collector.collectedKey()));
-            return new Pair<>(assets, size);
-        }
-        final var newAssetsBuilder = new AssetManager.Builder();
-        for (final var asset : assets.getApkAssets()) {
-            if (!asset.isForLoader()) {
-                newAssetsBuilder.addApkAssets(asset);
-            }
-        }
-        for (final var key : extractApkKeys(collector.collectedKey())) {
-            try {
-                final var asset = loadApkAssets(key);
-                newAssetsBuilder.addApkAssets(asset);
-            } catch (IOException e) {
-                Log.e(TAG, "Couldn't load assets for key " + key, e);
-            }
-        }
-        assets.getLoaders().forEach(newAssetsBuilder::addLoader);
-        return new Pair<>(newAssetsBuilder.build(), size);
+        impl.getAssets().addPresetApkKeys(extractApkKeys(collector.collectedKey()));
+        return size;
     }
 
     public static class ApkKey {
@@ -656,23 +624,6 @@
         return apkKeys;
     }
 
-    private ResourcesKey resourcesKeyFromAssets(@NonNull AssetManager assets) {
-        final var libs = new ArrayList<String>();
-        final var overlays = new ArrayList<String>();
-        for (final ApkAssets asset : assets.getApkAssets()) {
-            if (asset.isSystem() || asset.isForLoader()) {
-                continue;
-            }
-            if (asset.isOverlay()) {
-                overlays.add(asset.getAssetPath());
-            } else if (asset.isSharedLib()) {
-                libs.add(asset.getAssetPath());
-            }
-        }
-        return new ResourcesKey(null, null, overlays.toArray(new String[0]),
-                libs.toArray(new String[0]), 0, null, null);
-    }
-
     /**
      * Creates an AssetManager from the paths within the ResourcesKey.
      *
@@ -801,7 +752,7 @@
 
         final Configuration config = generateConfig(key);
         final DisplayMetrics displayMetrics = getDisplayMetrics(generateDisplayId(key), daj);
-        final ResourcesImpl impl = new ResourcesImpl(assets, displayMetrics, config, daj, true);
+        final ResourcesImpl impl = new ResourcesImpl(assets, displayMetrics, config, daj);
 
         if (DEBUG) {
             Slog.d(TAG, "- creating impl=" + impl + " with key: " + key);
@@ -1884,32 +1835,31 @@
         for (int i = 0; i < resourcesCount; i++) {
             final WeakReference<Resources> ref = mAllResourceReferences.get(i);
             final Resources r = ref != null ? ref.get() : null;
-            if (r == null) {
-                continue;
-            }
-            final ResourcesKey key = updatedResourceKeys.get(r.getImpl());
-            if (key != null) {
-                final ResourcesImpl impl = findOrCreateResourcesImplForKeyLocked(key);
-                if (impl == null) {
-                    throw new Resources.NotFoundException("failed to redirect ResourcesImpl");
-                }
-                r.setImpl(impl);
-            } else {
-                // ResourcesKey is null which means the ResourcesImpl could belong to a
-                // Resources created by application through Resources constructor and was not
-                // managed by ResourcesManager, so the ResourcesImpl needs to be recreated to
-                // have shared library asset paths appended if there are any.
-                final ResourcesImpl oldImpl = r.getImpl();
-                if (oldImpl != null) {
-                    final AssetManager oldAssets = oldImpl.getAssets();
-                    // ResourcesImpl constructor will help to append shared library asset paths.
-                    if (oldAssets != AssetManager.getSystem()) {
-                        if (oldAssets.isUpToDate()) {
-                            final ResourcesImpl newImpl = new ResourcesImpl(oldImpl);
+            if (r != null) {
+                final ResourcesKey key = updatedResourceKeys.get(r.getImpl());
+                if (key != null) {
+                    final ResourcesImpl impl = findOrCreateResourcesImplForKeyLocked(key);
+                    if (impl == null) {
+                        throw new Resources.NotFoundException("failed to redirect ResourcesImpl");
+                    }
+                    r.setImpl(impl);
+                } else {
+                    // ResourcesKey is null which means the ResourcesImpl could belong to a
+                    // Resources created by application through Resources constructor and was not
+                    // managed by ResourcesManager, so the ResourcesImpl needs to be recreated to
+                    // have shared library asset paths appended if there are any.
+                    if (r.getImpl() != null) {
+                        final ResourcesImpl oldImpl = r.getImpl();
+                        final AssetManager oldAssets = oldImpl.getAssets();
+                        // ResourcesImpl constructor will help to append shared library asset paths.
+                        if (oldAssets != AssetManager.getSystem() && oldAssets.isUpToDate()) {
+                            final ResourcesImpl newImpl = new ResourcesImpl(oldAssets,
+                                    oldImpl.getMetrics(), oldImpl.getConfiguration(),
+                                    oldImpl.getDisplayAdjustments());
                             r.setImpl(newImpl);
                         } else {
-                            Slog.w(TAG, "Skip appending shared library asset paths for "
-                                    + "the Resources as its assets are not up to date.");
+                            Slog.w(TAG, "Skip appending shared library asset paths for the "
+                                    + "Resource as its assets are not up to date.");
                         }
                     }
                 }
diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java
index 908999b..68b5d78 100644
--- a/core/java/android/content/res/ApkAssets.java
+++ b/core/java/android/content/res/ApkAssets.java
@@ -124,13 +124,11 @@
 
     @Nullable
     @GuardedBy("this")
-    private StringBlock mStringBlock;  // null or closed if mNativePtr = 0.
+    private final StringBlock mStringBlock;  // null or closed if mNativePtr = 0.
 
     @PropertyFlags
     private final int mFlags;
 
-    private final boolean mIsOverlay;
-
     @Nullable
     private final AssetsProvider mAssets;
 
@@ -304,43 +302,40 @@
 
     private ApkAssets(@FormatType int format, @NonNull String path, @PropertyFlags int flags,
             @Nullable AssetsProvider assets) throws IOException {
-        this(format, flags, assets);
         Objects.requireNonNull(path, "path");
+        mFlags = flags;
         mNativePtr = nativeLoad(format, path, flags, assets);
         mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+        mAssets = assets;
     }
 
     private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
             @NonNull String friendlyName, @PropertyFlags int flags, @Nullable AssetsProvider assets)
             throws IOException {
-        this(format, flags, assets);
         Objects.requireNonNull(fd, "fd");
         Objects.requireNonNull(friendlyName, "friendlyName");
+        mFlags = flags;
         mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets);
         mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+        mAssets = assets;
     }
 
     private ApkAssets(@FormatType int format, @NonNull FileDescriptor fd,
             @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags,
             @Nullable AssetsProvider assets) throws IOException {
-        this(format, flags, assets);
         Objects.requireNonNull(fd, "fd");
         Objects.requireNonNull(friendlyName, "friendlyName");
+        mFlags = flags;
         mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets);
         mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/);
+        mAssets = assets;
     }
 
     private ApkAssets(@PropertyFlags int flags, @Nullable AssetsProvider assets) {
-        this(FORMAT_APK, flags, assets);
+        mFlags = flags;
         mNativePtr = nativeLoadEmpty(flags, assets);
         mStringBlock = null;
-    }
-
-    private ApkAssets(@FormatType int format, @PropertyFlags int flags,
-            @Nullable AssetsProvider assets) {
-        mFlags = flags;
         mAssets = assets;
-        mIsOverlay = format == FORMAT_IDMAP;
     }
 
     @UnsupportedAppUsage
@@ -430,18 +425,6 @@
         }
     }
 
-    public boolean isSystem() {
-        return (mFlags & PROPERTY_SYSTEM) != 0;
-    }
-
-    public boolean isSharedLib() {
-        return (mFlags & PROPERTY_DYNAMIC) != 0;
-    }
-
-    public boolean isOverlay() {
-        return mIsOverlay;
-    }
-
     @Override
     public String toString() {
         return "ApkAssets{path=" + getDebugName() + "}";
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index bcaceb2..e6b9342 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -203,25 +203,9 @@
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
     public ResourcesImpl(@NonNull AssetManager assets, @Nullable DisplayMetrics metrics,
             @Nullable Configuration config, @NonNull DisplayAdjustments displayAdjustments) {
-        // Don't reuse assets by default as we have no control over whether they're already
-        // inside some other ResourcesImpl.
-        this(assets, metrics, config, displayAdjustments, false);
-    }
-
-    public ResourcesImpl(@NonNull ResourcesImpl orig) {
-        // We know for sure that the other assets are in use, so can't reuse the object here.
-        this(orig.getAssets(), orig.getMetrics(), orig.getConfiguration(),
-                orig.getDisplayAdjustments(), false);
-    }
-
-    public ResourcesImpl(@NonNull AssetManager assets, @Nullable DisplayMetrics metrics,
-            @Nullable Configuration config, @NonNull DisplayAdjustments displayAdjustments,
-            boolean reuseAssets) {
-        final var assetsAndHash =
-                ResourcesManager.getInstance().updateResourceImplAssetsWithRegisteredLibs(assets,
-                        reuseAssets);
-        mAssets = assetsAndHash.first;
-        mAppliedSharedLibsHash = assetsAndHash.second;
+        mAssets = assets;
+        mAppliedSharedLibsHash =
+                ResourcesManager.getInstance().updateResourceImplWithRegisteredLibs(this);
         mMetrics.setToDefaults();
         mDisplayAdjustments = displayAdjustments;
         mConfiguration.setToDefaults();