From e5430976256a10c7ed727f7c7c96ff0bc1db4cde Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 5 Feb 2021 11:32:39 -0800 Subject: [PATCH 1/2] CachedAppOptimizer: don't hardcode freezer path Test: verified that the freezer is correctly detected Bug: 168058155 Change-Id: Ia594282f62ce934d124fa5f89da75cd58fd6ed78 --- .../java/com/android/server/am/CachedAppOptimizer.java | 8 +++++++- .../jni/com_android_server_am_CachedAppOptimizer.cpp | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index c18031fd6de60..9e6d647dc0140 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -537,6 +537,12 @@ public final class CachedAppOptimizer { */ private static native int getBinderFreezeInfo(int pid); + /** + * Returns the path to be checked to verify whether the freezer is supported by this system. + * @return absolute path to the file + */ + private static native String getFreezerCheckPath(); + /** * Determines whether the freezer is supported by this system */ @@ -545,7 +551,7 @@ public final class CachedAppOptimizer { FileReader fr = null; try { - fr = new FileReader("/sys/fs/cgroup/uid_0/cgroup.freeze"); + fr = new FileReader(getFreezerCheckPath()); char state = (char) fr.read(); if (state == '1' || state == '0') { diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp index 31cc295406a50..4551d49d9e58a 100644 --- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp +++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp @@ -278,6 +278,11 @@ static jint com_android_server_am_CachedAppOptimizer_getBinderFreezeInfo(JNIEnv return retVal; } +static jstring com_android_server_am_CachedAppOptimizer_getFreezerCheckPath(JNIEnv* env, + jobject clazz) { + return env->NewStringUTF(CGROUP_FREEZE_PATH); +} + static const JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ {"compactSystem", "()V", (void*)com_android_server_am_CachedAppOptimizer_compactSystem}, @@ -286,7 +291,9 @@ static const JNINativeMethod sMethods[] = { (void*)com_android_server_am_CachedAppOptimizer_enableFreezerInternal}, {"freezeBinder", "(IZ)V", (void*)com_android_server_am_CachedAppOptimizer_freezeBinder}, {"getBinderFreezeInfo", "(I)I", - (void*)com_android_server_am_CachedAppOptimizer_getBinderFreezeInfo}}; + (void*)com_android_server_am_CachedAppOptimizer_getBinderFreezeInfo}, + {"getFreezerCheckPath", "()Ljava/lang/String;", + (void*)com_android_server_am_CachedAppOptimizer_getFreezerCheckPath}}; int register_android_server_am_CachedAppOptimizer(JNIEnv* env) { From be4d539493848cad6a488481df4890886c66bfb6 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 5 Feb 2021 13:31:27 -0800 Subject: [PATCH 2/2] CachedAppOptimizer: enable single cgroup freezer The cgroup v2 uid/pid hierarchy was reverted because of http://b/179006802 leaving the underlying freezer implementation to a single cgroup. Enable the freezer at boot until the new hierarchy can be brought back. Bug: 179006802 Test: verified that the freezer is enabled at boot Change-Id: I88041a3efb06724e4bc2d78fea017778c365d387 --- .../core/java/com/android/server/am/CachedAppOptimizer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 9e6d647dc0140..44ab9190004b5 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -556,6 +556,10 @@ public final class CachedAppOptimizer { if (state == '1' || state == '0') { supported = true; + // This is a workaround after reverting the cgroup v2 uid/pid hierarchy due to + // http://b/179006802. + // TODO: remove once the uid/pid hierarchy is restored + enableFreezerInternal(true); } else { Slog.e(TAG_AM, "unexpected value in cgroup.freeze"); }