From 30db090b045d54e1a7ad08526fe9a800ce69fa72 Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 28 Jan 2025 17:41:46 -0800 Subject: Revert "Fix the potential memory leak issue caused by setExtension." This reverts commit 371bac53bc263853d32a299fb96b3757e2925794. Reason for revert: b/392243808 - 0.9 MB memory increase in com.android.phone Change-Id: If56e31573aff520267c1fed5a6eef04d485bfa20 --- core/java/android/os/Binder.java | 16 ++-------------- core/jni/android_util_Binder.cpp | 34 +++++++++++++++++++++------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 86dc20c497e6..ed75491b8e21 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -148,11 +148,6 @@ public class Binder implements IBinder { */ private static volatile boolean sStackTrackingEnabled = false; - /** - * The extension binder object - */ - private IBinder mExtension = null; - /** * Enable Binder IPC stack tracking. If enabled, every binder transaction will be logged to * {@link TransactionTracker}. @@ -1239,9 +1234,7 @@ public class Binder implements IBinder { /** @hide */ @Override - public final @Nullable IBinder getExtension() { - return mExtension; - } + public final native @Nullable IBinder getExtension(); /** * Set the binder extension. @@ -1249,12 +1242,7 @@ public class Binder implements IBinder { * * @hide */ - public final void setExtension(@Nullable IBinder extension) { - mExtension = extension; - setExtensionNative(extension); - } - - private final native void setExtensionNative(@Nullable IBinder extension); + public final native void setExtension(@Nullable IBinder extension); /** * Default implementation rewinds the parcels and calls onTransact. On diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index e85b33e2f7b7..8003bb7d442b 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -74,7 +74,6 @@ static struct bindernative_offsets_t jmethodID mExecTransact; jmethodID mGetInterfaceDescriptor; jmethodID mTransactionCallback; - jmethodID mGetExtension; // Object state. jfieldID mObject; @@ -490,12 +489,8 @@ public: if (mVintf) { ::android::internal::Stability::markVintf(b.get()); } - if (mSetExtensionCalled) { - jobject javaIBinderObject = env->CallObjectMethod(obj, gBinderOffsets.mGetExtension); - sp extensionFromJava = ibinderForJavaObject(env, javaIBinderObject); - if (extensionFromJava != nullptr) { - b.get()->setExtension(extensionFromJava); - } + if (mExtension != nullptr) { + b.get()->setExtension(mExtension); } mBinder = b; ALOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%" PRId32 "\n", @@ -521,12 +516,21 @@ public: mVintf = false; } + sp getExtension() { + AutoMutex _l(mLock); + sp b = mBinder.promote(); + if (b != nullptr) { + return b.get()->getExtension(); + } + return mExtension; + } + void setExtension(const sp& extension) { AutoMutex _l(mLock); - mSetExtensionCalled = true; + mExtension = extension; sp b = mBinder.promote(); if (b != nullptr) { - b.get()->setExtension(extension); + b.get()->setExtension(mExtension); } } @@ -538,7 +542,8 @@ private: // is too much binder state here, we can think about making JavaBBinder an // sp here (avoid recreating it) bool mVintf = false; - bool mSetExtensionCalled = false; + + sp mExtension; }; // ---------------------------------------------------------------------------- @@ -1244,6 +1249,10 @@ static void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject cla return IPCThreadState::self()->blockUntilThreadAvailable(); } +static jobject android_os_Binder_getExtension(JNIEnv* env, jobject obj) { + JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject); + return javaObjectForIBinder(env, jbh->getExtension()); +} static void android_os_Binder_setExtension(JNIEnv* env, jobject obj, jobject extensionObject) { JavaBBinderHolder* jbh = (JavaBBinderHolder*) env->GetLongField(obj, gBinderOffsets.mObject); @@ -1286,7 +1295,8 @@ static const JNINativeMethod gBinderMethods[] = { { "getNativeBBinderHolder", "()J", (void*)android_os_Binder_getNativeBBinderHolder }, { "getNativeFinalizer", "()J", (void*)android_os_Binder_getNativeFinalizer }, { "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable }, - { "setExtensionNative", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension }, + { "getExtension", "()Landroid/os/IBinder;", (void*)android_os_Binder_getExtension }, + { "setExtension", "(Landroid/os/IBinder;)V", (void*)android_os_Binder_setExtension }, }; // clang-format on @@ -1303,8 +1313,6 @@ static int int_register_android_os_Binder(JNIEnv* env) gBinderOffsets.mTransactionCallback = GetStaticMethodIDOrDie(env, clazz, "transactionCallback", "(IIII)V"); gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); - gBinderOffsets.mGetExtension = GetMethodIDOrDie(env, clazz, "getExtension", - "()Landroid/os/IBinder;"); return RegisterMethodsOrDie( env, kBinderPathName, -- cgit v1.2.3-59-g8ed1b