diff --git a/core/java/android/content/res/ApkAssets.java b/core/java/android/content/res/ApkAssets.java index 2d381eb85e90a..f5e1719050968 100644 --- a/core/java/android/content/res/ApkAssets.java +++ b/core/java/android/content/res/ApkAssets.java @@ -25,8 +25,6 @@ import android.content.res.loader.ResourcesProvider; import com.android.internal.annotations.GuardedBy; -import libcore.util.NativeAllocationRegistry; - import java.io.FileDescriptor; import java.io.IOException; import java.lang.annotation.Retention; @@ -103,11 +101,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; @@ -115,19 +113,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. * @@ -302,8 +287,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; } @@ -315,8 +298,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; } @@ -328,8 +309,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; } @@ -337,7 +316,6 @@ public final class ApkAssets { mFlags = flags; mNativePtr = nativeLoadEmpty(flags, assets); mStringBlock = null; - mRunNativeCleanup = null; mAssets = assets; } @@ -425,16 +403,22 @@ public final class ApkAssets { return "ApkAssets{path=" + getAssetPath() + "}"; } + @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; } } } @@ -449,6 +433,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 long nativeGetStringBlock(long ptr); private static native boolean nativeIsUpToDate(long ptr); @@ -456,5 +441,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 af06e2e80cec5..247b8dafc9ff9 100644 --- a/core/jni/android_content_res_ApkAssets.cpp +++ b/core/jni/android_content_res_ApkAssets.cpp @@ -349,14 +349,10 @@ static jlong NativeLoadEmpty(JNIEnv* env, jclass /*clazz*/, jint flags, jobject return reinterpret_cast(apk_assets.release()); } -static void NativeDestroy(void* ptr) { +static void NativeDestroy(JNIEnv* /*env*/, jclass /*clazz*/, jlong ptr) { delete reinterpret_cast(ptr); } -static jlong NativeGetFinalizer(JNIEnv* /*env*/, jclass /*clazz*/) { - return reinterpret_cast(&NativeDestroy); -} - static jstring NativeGetAssetPath(JNIEnv* env, jclass /*clazz*/, jlong ptr) { const ApkAssets* apk_assets = reinterpret_cast(ptr); return env->NewStringUTF(apk_assets->GetPath().c_str()); @@ -465,7 +461,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}, {"nativeGetStringBlock", "(J)J", (void*)NativeGetStringBlock}, {"nativeIsUpToDate", "(J)Z", (void*)NativeIsUpToDate},