Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c7000ce authored by Sravan Kumar Reddy Kallu's avatar Sravan Kumar Reddy Kallu Committed by Ryan Mitchell
Browse files

Revert "Migrate ApkAssets to use NativeAllocationRegistry"

This reverts commit 1e245673.

Reason for revert: Memory regression - b/176065944

"Exempt-From-Owner-Approval: see go/perf-revert-first”

Change-Id: I425638d3dd5f39754a65684dacdd04427a2776fc
parent 51bdb366
Loading
Loading
Loading
Loading
+14 −30
Original line number Diff line number Diff line
@@ -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 (mNativePtr != 0) {
                if (mStringBlock != null) {
                    mStringBlock.close();
                }
            if (mRunNativeCleanup != null) {
                mRunNativeCleanup.run();
                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();
}
+2 −6
Original line number Diff line number Diff line
@@ -349,14 +349,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 reinterpret_cast<jlong>(&NativeDestroy);
}

static jstring NativeGetAssetPath(JNIEnv* env, jclass /*clazz*/, jlong ptr) {
  const ApkAssets* apk_assets = reinterpret_cast<const ApkAssets*>(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},