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();