From bcd771bd085063de6c9ccf57d1f886f450b19aae Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Mon, 24 Feb 2020 03:18:55 -0800 Subject: [PATCH 1/2] Avoid allocation on Java Binder fast path We recently added a new API to the native Parcel class that avoids a string allocation in enforceInterface. Have the Java JNI glue for Parcel use this new interface. Test: builds Change-Id: I50b29ef95e214812c5fa83514497e0a188a635aa --- core/jni/android_os_Parcel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index d80c071c3e26c..d723ecc13dd09 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -625,8 +625,8 @@ static void android_os_Parcel_enforceInterface(JNIEnv* env, jclass clazz, jlong IPCThreadState* threadState = IPCThreadState::self(); const int32_t oldPolicy = threadState->getStrictModePolicy(); const bool isValid = parcel->enforceInterface( - String16(reinterpret_cast(str), - env->GetStringLength(name)), + reinterpret_cast(str), + env->GetStringLength(name), threadState); env->ReleaseStringCritical(name, str); if (isValid) { From 74c60fbacc2ccc63f9fda4eae233f7984e071b47 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Mon, 24 Feb 2020 03:38:40 -0800 Subject: [PATCH 2/2] Avoid interface name copy in HwParcel Test: builds Change-Id: I9ad7403707aac6af8b5f68375527dd8250c2c8fc --- core/jni/android_os_HwParcel.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index 151dbfce7af32..a88f8919ed086 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -292,19 +292,11 @@ static void JHwParcel_native_enforceInterface( return; } - const jchar *interfaceName = env->GetStringCritical(interfaceNameObj, NULL); + const char *interfaceName = env->GetStringUTFChars(interfaceNameObj, NULL); if (interfaceName) { - String8 interfaceNameCopy = String8(String16( - reinterpret_cast(interfaceName), - env->GetStringLength(interfaceNameObj))); - - env->ReleaseStringCritical(interfaceNameObj, interfaceName); - interfaceName = NULL; - hardware::Parcel *parcel = JHwParcel::GetNativeContext(env, thiz)->getParcel(); - - bool valid = parcel->enforceInterface(interfaceNameCopy.string()); + bool valid = parcel->enforceInterface(interfaceName); if (!valid) { jniThrowException( @@ -312,6 +304,7 @@ static void JHwParcel_native_enforceInterface( "java/lang/SecurityException", "HWBinder invocation to an incorrect interface"); } + env->ReleaseStringUTFChars(interfaceNameObj, interfaceName); } }