diff options
| -rw-r--r-- | core/java/android/content/res/ApkAssets.java | 44 | ||||
| -rw-r--r-- | core/jni/android_content_res_ApkAssets.cpp | 8 |
2 files changed, 16 insertions, 36 deletions
diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java index de48ed75746d..f3783e4a1328 100644 --- a/core/java/android/content/res/ApkAssets.java +++ b/core/java/android/content/res/ApkAssets.java @@ -26,8 +26,6 @@ import android.text.TextUtils; import com.android.internal.annotations.GuardedBy; -import libcore.util.NativeAllocationRegistry; - import java.io.FileDescriptor; import java.io.IOException; import java.lang.annotation.Retention; @@ -104,11 +102,11 @@ public final class ApkAssets { public @interface FormatType {} @GuardedBy("this") - private final long mNativePtr; + private long mNativePtr; // final, except cleared in finalizer. @Nullable @GuardedBy("this") - private final StringBlock mStringBlock; + private final StringBlock mStringBlock; // null or closed if mNativePtr = 0. @PropertyFlags private final int mFlags; @@ -116,19 +114,6 @@ public final class ApkAssets { @Nullable private final AssetsProvider mAssets; - @GuardedBy("this") - @Nullable - private final Runnable mRunNativeCleanup; - - // Use a Holder to allow static initialization of ApkAssets in the boot image, and - // possibly to avoid some initialization ordering issues. - private static class NoImagePreloadHolder { - // TODO(175425996): Make size estimate more accurate - public static final NativeAllocationRegistry REGISTRY = - NativeAllocationRegistry.createMalloced(ApkAssets.class.getClassLoader(), - nativeGetFinalizer()); - } - /** * Creates a new ApkAssets instance from the given path on disk. * @@ -303,8 +288,6 @@ public final class ApkAssets { mFlags = flags; mNativePtr = nativeLoad(format, path, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); - mRunNativeCleanup = NoImagePreloadHolder.REGISTRY.registerNativeAllocation( - this, mNativePtr); mAssets = assets; } @@ -316,8 +299,6 @@ public final class ApkAssets { mFlags = flags; mNativePtr = nativeLoadFd(format, fd, friendlyName, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); - mRunNativeCleanup = NoImagePreloadHolder.REGISTRY.registerNativeAllocation( - this, mNativePtr); mAssets = assets; } @@ -329,8 +310,6 @@ public final class ApkAssets { mFlags = flags; mNativePtr = nativeLoadFdOffsets(format, fd, friendlyName, offset, length, flags, assets); mStringBlock = new StringBlock(nativeGetStringBlock(mNativePtr), true /*useSparse*/); - mRunNativeCleanup = NoImagePreloadHolder.REGISTRY.registerNativeAllocation( - this, mNativePtr); mAssets = assets; } @@ -338,7 +317,6 @@ public final class ApkAssets { mFlags = flags; mNativePtr = nativeLoadEmpty(flags, assets); mStringBlock = null; - mRunNativeCleanup = null; mAssets = assets; } @@ -433,16 +411,22 @@ public final class ApkAssets { return "ApkAssets{path=" + getDebugName() + "}"; } + @Override + protected void finalize() throws Throwable { + close(); + } + /** * Closes this class and the contained {@link #mStringBlock}. */ public void close() { synchronized (this) { - if (mStringBlock != null) { - mStringBlock.close(); - } - if (mRunNativeCleanup != null) { - mRunNativeCleanup.run(); + if (mNativePtr != 0) { + if (mStringBlock != null) { + mStringBlock.close(); + } + nativeDestroy(mNativePtr); + mNativePtr = 0; } } } @@ -457,6 +441,7 @@ public final class ApkAssets { private static native long nativeLoadFdOffsets(@FormatType int format, @NonNull FileDescriptor fd, @NonNull String friendlyName, long offset, long length, @PropertyFlags int flags, @Nullable AssetsProvider asset) throws IOException; + private static native void nativeDestroy(long ptr); private static native @NonNull String nativeGetAssetPath(long ptr); private static native @NonNull String nativeGetDebugName(long ptr); private static native long nativeGetStringBlock(long ptr); @@ -465,5 +450,4 @@ public final class ApkAssets { private static native @Nullable OverlayableInfo nativeGetOverlayableInfo(long ptr, String overlayableName) throws IOException; private static native boolean nativeDefinesOverlayable(long ptr) throws IOException; - private static native final long nativeGetFinalizer(); } diff --git a/core/jni/android_content_res_ApkAssets.cpp b/core/jni/android_content_res_ApkAssets.cpp index b0c575162b56..b207ad39edc3 100644 --- a/core/jni/android_content_res_ApkAssets.cpp +++ b/core/jni/android_content_res_ApkAssets.cpp @@ -353,14 +353,10 @@ static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject return reinterpret_cast<jlong>(apk_assets.release()); } -static void NativeDestroy(void* ptr) { +static void NativeDestroy(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) { delete reinterpret_cast<ApkAssets*>(ptr); } -static jlong NativeGetFinalizer(JNIEnv* /*env*/, jclass /*clazz*/) { - return static_cast<jlong>(reinterpret_cast<uintptr_t>(&NativeDestroy)); -} - static jstring NativeGetAssetPath(JNIEnv* env, jclass /*clazz*/, jlong ptr) { auto apk_assets = reinterpret_cast<const ApkAssets*>(ptr); if (auto path = apk_assets->GetPath()) { @@ -477,7 +473,7 @@ static const JNINativeMethod gApkAssetsMethods[] = { {"nativeLoadFdOffsets", "(ILjava/io/FileDescriptor;Ljava/lang/String;JJILandroid/content/res/loader/AssetsProvider;)J", (void*)NativeLoadFromFdOffset}, - {"nativeGetFinalizer", "()J", (void*)NativeGetFinalizer}, + {"nativeDestroy", "(J)V", (void*)NativeDestroy}, {"nativeGetAssetPath", "(J)Ljava/lang/String;", (void*)NativeGetAssetPath}, {"nativeGetDebugName", "(J)Ljava/lang/String;", (void*)NativeGetDebugName}, {"nativeGetStringBlock", "(J)J", (void*)NativeGetStringBlock}, |