Loading cmds/statsd/src/atoms.proto +6 −0 Original line number Diff line number Diff line Loading @@ -4821,6 +4821,12 @@ message AppCompacted { // The process state at the time of compaction. optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN]; // Free ZRAM in kilobytes before compaction. optional int64 before_zram_free_kilobytes = 17; // Free ZRAM in kilobytes after compaction. optional int64 after_zram_free_kilobytes = 18; } /** Loading core/java/android/os/Debug.java +7 −0 Original line number Diff line number Diff line Loading @@ -2439,4 +2439,11 @@ public final class Debug VMDebug.attachAgent(library + "=" + options, classLoader); } } /** * Return the current free ZRAM usage in kilobytes. * * @hide */ public static native long getZramFreeKb(); } core/jni/android_os_Debug.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -737,6 +737,25 @@ static jstring android_os_Debug_getUnreachableMemory(JNIEnv* env, jobject clazz, return env->NewStringUTF(s.c_str()); } static jlong android_os_Debug_getFreeZramKb(JNIEnv* env, jobject clazz) { jlong zramFreeKb = 0; std::string status_path = android::base::StringPrintf("/proc/meminfo"); UniqueFile file = MakeUniqueFile(status_path.c_str(), "re"); char line[256]; while (file != nullptr && fgets(line, sizeof(line), file.get())) { jlong v; if (sscanf(line, "SwapFree: %" SCNd64 " kB", &v) == 1) { zramFreeKb = v; break; } } return zramFreeKb; } /* * JNI registration. */ Loading Loading @@ -778,6 +797,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_dumpNativeBacktraceToFileTimeout }, { "getUnreachableMemory", "(IZ)Ljava/lang/String;", (void*)android_os_Debug_getUnreachableMemory }, { "getZramFreeKb", "()J", (void*)android_os_Debug_getFreeZramKb }, }; int register_android_os_Debug(JNIEnv *env) Loading services/core/java/com/android/server/am/AppCompactor.java +7 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION; import android.app.ActivityManager; import android.app.ActivityThread; import android.os.Debug; import android.os.Handler; import android.os.Message; import android.os.Process; Loading Loading @@ -410,6 +411,7 @@ public final class AppCompactor { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Compact " + ((pendingAction == COMPACT_PROCESS_SOME) ? "some" : "full") + ": " + name); long zramFreeKbBefore = Debug.getZramFreeKb(); long[] rssBefore = Process.getRss(pid); FileOutputStream fos = new FileOutputStream("/proc/" + pid + "/reclaim"); fos.write(action.getBytes()); Loading @@ -417,10 +419,12 @@ public final class AppCompactor { long[] rssAfter = Process.getRss(pid); long end = SystemClock.uptimeMillis(); long time = end - start; long zramFreeKbAfter = Debug.getZramFreeKb(); EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name, action, rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, msg.arg2); lastCompactAction, lastCompactTime, msg.arg1, msg.arg2, zramFreeKbBefore, zramFreeKbAfter); // Note that as above not taking mPhenoTypeFlagLock here to avoid locking // on every single compaction for a flag that will seldom change and the // impact of reading the wrong value here is low. Loading @@ -429,7 +433,8 @@ public final class AppCompactor { rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, ActivityManager.processStateAmToProto(msg.arg2)); ActivityManager.processStateAmToProto(msg.arg2), zramFreeKbBefore, zramFreeKbAfter); } synchronized (mAm) { proc.lastCompactTime = end; Loading services/core/java/com/android/server/am/EventLogTags.logtags +1 −1 Original line number Diff line number Diff line Loading @@ -138,4 +138,4 @@ option java_package com.android.server.am 30061 am_remove_task (Task ID|1|5), (Stack ID|1|5) # The task is being compacted 30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2) 30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2),(BeforeZRAMFree|2|2),(AfterZRAMFree|2|2) Loading
cmds/statsd/src/atoms.proto +6 −0 Original line number Diff line number Diff line Loading @@ -4821,6 +4821,12 @@ message AppCompacted { // The process state at the time of compaction. optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN]; // Free ZRAM in kilobytes before compaction. optional int64 before_zram_free_kilobytes = 17; // Free ZRAM in kilobytes after compaction. optional int64 after_zram_free_kilobytes = 18; } /** Loading
core/java/android/os/Debug.java +7 −0 Original line number Diff line number Diff line Loading @@ -2439,4 +2439,11 @@ public final class Debug VMDebug.attachAgent(library + "=" + options, classLoader); } } /** * Return the current free ZRAM usage in kilobytes. * * @hide */ public static native long getZramFreeKb(); }
core/jni/android_os_Debug.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -737,6 +737,25 @@ static jstring android_os_Debug_getUnreachableMemory(JNIEnv* env, jobject clazz, return env->NewStringUTF(s.c_str()); } static jlong android_os_Debug_getFreeZramKb(JNIEnv* env, jobject clazz) { jlong zramFreeKb = 0; std::string status_path = android::base::StringPrintf("/proc/meminfo"); UniqueFile file = MakeUniqueFile(status_path.c_str(), "re"); char line[256]; while (file != nullptr && fgets(line, sizeof(line), file.get())) { jlong v; if (sscanf(line, "SwapFree: %" SCNd64 " kB", &v) == 1) { zramFreeKb = v; break; } } return zramFreeKb; } /* * JNI registration. */ Loading Loading @@ -778,6 +797,8 @@ static const JNINativeMethod gMethods[] = { (void*)android_os_Debug_dumpNativeBacktraceToFileTimeout }, { "getUnreachableMemory", "(IZ)Ljava/lang/String;", (void*)android_os_Debug_getUnreachableMemory }, { "getZramFreeKb", "()J", (void*)android_os_Debug_getFreeZramKb }, }; int register_android_os_Debug(JNIEnv *env) Loading
services/core/java/com/android/server/am/AppCompactor.java +7 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.provider.DeviceConfig.ActivityManager.KEY_USE_COMPACTION; import android.app.ActivityManager; import android.app.ActivityThread; import android.os.Debug; import android.os.Handler; import android.os.Message; import android.os.Process; Loading Loading @@ -410,6 +411,7 @@ public final class AppCompactor { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Compact " + ((pendingAction == COMPACT_PROCESS_SOME) ? "some" : "full") + ": " + name); long zramFreeKbBefore = Debug.getZramFreeKb(); long[] rssBefore = Process.getRss(pid); FileOutputStream fos = new FileOutputStream("/proc/" + pid + "/reclaim"); fos.write(action.getBytes()); Loading @@ -417,10 +419,12 @@ public final class AppCompactor { long[] rssAfter = Process.getRss(pid); long end = SystemClock.uptimeMillis(); long time = end - start; long zramFreeKbAfter = Debug.getZramFreeKb(); EventLog.writeEvent(EventLogTags.AM_COMPACT, pid, name, action, rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, msg.arg2); lastCompactAction, lastCompactTime, msg.arg1, msg.arg2, zramFreeKbBefore, zramFreeKbAfter); // Note that as above not taking mPhenoTypeFlagLock here to avoid locking // on every single compaction for a flag that will seldom change and the // impact of reading the wrong value here is low. Loading @@ -429,7 +433,8 @@ public final class AppCompactor { rssBefore[0], rssBefore[1], rssBefore[2], rssBefore[3], rssAfter[0], rssAfter[1], rssAfter[2], rssAfter[3], time, lastCompactAction, lastCompactTime, msg.arg1, ActivityManager.processStateAmToProto(msg.arg2)); ActivityManager.processStateAmToProto(msg.arg2), zramFreeKbBefore, zramFreeKbAfter); } synchronized (mAm) { proc.lastCompactTime = end; Loading
services/core/java/com/android/server/am/EventLogTags.logtags +1 −1 Original line number Diff line number Diff line Loading @@ -138,4 +138,4 @@ option java_package com.android.server.am 30061 am_remove_task (Task ID|1|5), (Stack ID|1|5) # The task is being compacted 30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2) 30063 am_compact (Pid|1|5),(Process Name|3),(Action|3),(BeforeRssTotal|2|2),(BeforeRssFile|2|2),(BeforeRssAnon|2|2),(BeforeRssSwap|2|2),(AfterRssTotal|2|2),(AfterRssFile|2|2),(AfterRssAnon|2|2),(AfterRssSwap|2|2),(Time|2|3),(LastAction|1|2),(LastActionTimestamp|2|3),(setAdj|1|2),(procState|1|2),(BeforeZRAMFree|2|2),(AfterZRAMFree|2|2)