Loading core/java/android/app/ActivityThread.java +8 −0 Original line number Diff line number Diff line Loading @@ -246,6 +246,7 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.os.BinderCallsStats; import com.android.internal.os.BinderInternal; import com.android.internal.os.DebugStore; import com.android.internal.os.JniStringCache; import com.android.internal.os.RuntimeInit; import com.android.internal.os.SafeZipPathValidatorCallback; import com.android.internal.os.SomeArgs; Loading Loading @@ -1948,6 +1949,9 @@ public final class ActivityThread extends ClientTransactionHandler if (dumpAllocatorStats) { Debug.logAllocatorStats(); } pw.println(" "); JniStringCache.dump(pw); } @NeverCompile Loading Loading @@ -7686,6 +7690,10 @@ public final class ActivityThread extends ClientTransactionHandler } if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Trimming memory to level: " + level); if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { JniStringCache.clear(); } try { if (skipBgMemTrimOnFgApp() && mLastProcessState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND Loading core/java/android/os/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -370,6 +370,13 @@ flag { bug: "345802719" } flag { name: "parcel_string_cache_enabled" namespace: "system_performance" description: "Enable JNIStringCache in Parcel" bug: "442140362" } flag { name: "remove_app_profiler_pss_collection" is_exported: true Loading core/java/com/android/internal/os/JniStringCache.java 0 → 100644 +67 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.NeverCompile; import java.io.PrintWriter; /** Java companion to native JNIStringCache class. */ public final class JniStringCache { /** Dumps cache statistics to the given writer. */ @NeverCompile public static void dump(PrintWriter pw) { if (!android.os.Flags.parcelStringCacheEnabled()) { return; } pw.println("JniStringCache"); pw.format( " Hits: %,10d Misses: %,10d\n", nativeHits(), nativeMisses()); pw.format( " Evictions: %,10d Skips: %,10d\n", nativeEvictions(), nativeSkips()); pw.flush(); pw.println(" "); } /** Clears the cache. */ public static void clear() { if (!android.os.Flags.parcelStringCacheEnabled()) { return; } nativeClear(); } @CriticalNative private static native long nativeHits(); @CriticalNative private static native long nativeMisses(); @CriticalNative private static native long nativeEvictions(); @CriticalNative private static native long nativeSkips(); @CriticalNative private static native void nativeClear(); } core/java/com/android/internal/os/OWNERS +3 −0 Original line number Diff line number Diff line Loading @@ -22,3 +22,6 @@ per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS # Memcg memory accounting per-file MemcgProcMemoryUtil.java = file:/PERFORMANCE_OWNERS # JniStringCache per-file *JniStringCache* = file:/PERFORMANCE_OWNERS core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,7 @@ cc_library_shared_for_libandroid_runtime { "com_android_internal_os_ClassLoaderFactory.cpp", "com_android_internal_os_DebugStore.cpp", "com_android_internal_os_FuseAppLoop.cpp", "com_android_internal_os_JniStringCache.cpp", "com_android_internal_os_KernelAllocationStats.cpp", "com_android_internal_os_KernelCpuBpfTracking.cpp", "com_android_internal_os_KernelCpuTotalBpfMapReader.cpp", Loading Loading
core/java/android/app/ActivityThread.java +8 −0 Original line number Diff line number Diff line Loading @@ -246,6 +246,7 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.os.BinderCallsStats; import com.android.internal.os.BinderInternal; import com.android.internal.os.DebugStore; import com.android.internal.os.JniStringCache; import com.android.internal.os.RuntimeInit; import com.android.internal.os.SafeZipPathValidatorCallback; import com.android.internal.os.SomeArgs; Loading Loading @@ -1948,6 +1949,9 @@ public final class ActivityThread extends ClientTransactionHandler if (dumpAllocatorStats) { Debug.logAllocatorStats(); } pw.println(" "); JniStringCache.dump(pw); } @NeverCompile Loading Loading @@ -7686,6 +7690,10 @@ public final class ActivityThread extends ClientTransactionHandler } if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Trimming memory to level: " + level); if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) { JniStringCache.clear(); } try { if (skipBgMemTrimOnFgApp() && mLastProcessState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND Loading
core/java/android/os/flags.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -370,6 +370,13 @@ flag { bug: "345802719" } flag { name: "parcel_string_cache_enabled" namespace: "system_performance" description: "Enable JNIStringCache in Parcel" bug: "442140362" } flag { name: "remove_app_profiler_pss_collection" is_exported: true Loading
core/java/com/android/internal/os/JniStringCache.java 0 → 100644 +67 −0 Original line number Diff line number Diff line /* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.NeverCompile; import java.io.PrintWriter; /** Java companion to native JNIStringCache class. */ public final class JniStringCache { /** Dumps cache statistics to the given writer. */ @NeverCompile public static void dump(PrintWriter pw) { if (!android.os.Flags.parcelStringCacheEnabled()) { return; } pw.println("JniStringCache"); pw.format( " Hits: %,10d Misses: %,10d\n", nativeHits(), nativeMisses()); pw.format( " Evictions: %,10d Skips: %,10d\n", nativeEvictions(), nativeSkips()); pw.flush(); pw.println(" "); } /** Clears the cache. */ public static void clear() { if (!android.os.Flags.parcelStringCacheEnabled()) { return; } nativeClear(); } @CriticalNative private static native long nativeHits(); @CriticalNative private static native long nativeMisses(); @CriticalNative private static native long nativeEvictions(); @CriticalNative private static native long nativeSkips(); @CriticalNative private static native void nativeClear(); }
core/java/com/android/internal/os/OWNERS +3 −0 Original line number Diff line number Diff line Loading @@ -22,3 +22,6 @@ per-file *ApplicationSharedMemory* = file:/PERFORMANCE_OWNERS # Memcg memory accounting per-file MemcgProcMemoryUtil.java = file:/PERFORMANCE_OWNERS # JniStringCache per-file *JniStringCache* = file:/PERFORMANCE_OWNERS
core/jni/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -258,6 +258,7 @@ cc_library_shared_for_libandroid_runtime { "com_android_internal_os_ClassLoaderFactory.cpp", "com_android_internal_os_DebugStore.cpp", "com_android_internal_os_FuseAppLoop.cpp", "com_android_internal_os_JniStringCache.cpp", "com_android_internal_os_KernelAllocationStats.cpp", "com_android_internal_os_KernelCpuBpfTracking.cpp", "com_android_internal_os_KernelCpuTotalBpfMapReader.cpp", Loading