From 46d2cc8f824e2bb81b4a57520bce00cefeecf419 Mon Sep 17 00:00:00 2001 From: Kalesh Singh Date: Mon, 29 Mar 2021 17:03:19 -0400 Subject: [PATCH] Add memtrackproxy system server service Serve memtrackproxy service from system server. This service enforces access control on requests for memory usage stats to the memtrack HAL based on the call context's PID and UID. Bug: 177664629 Test: memtrackproxy_test Change-Id: I10829ffcf4e5b2813d4c622268b0b59da6f171b6 --- services/core/jni/Android.bp | 4 +++- .../jni/com_android_server_SystemServer.cpp | 19 +++++++++++++++++++ .../java/com/android/server/SystemServer.java | 11 +++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 9f25daf0732f2..15f57653840b2 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -95,8 +95,8 @@ cc_defaults { "libaudioclient", "libbase", "libappfuse", - "libbinder", "libbinder_ndk", + "libbinder", "libcutils", "libcrypto", "liblog", @@ -105,6 +105,7 @@ cc_defaults { "libhardware_legacy", "libhidlbase", "libmeminfo", + "libmemtrackproxy", "libmtp", "libnativehelper", "libnativewindow", @@ -154,6 +155,7 @@ cc_defaults { "android.hardware.input.classifier@1.0", "android.hardware.ir@1.0", "android.hardware.light@2.0", + "android.hardware.memtrack-V1-ndk_platform", "android.hardware.power@1.0", "android.hardware.power@1.1", "android.hardware.power-V1-cpp", diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp index 6cb4a63a5636a..fe728ab14dff8 100644 --- a/services/core/jni/com_android_server_SystemServer.cpp +++ b/services/core/jni/com_android_server_SystemServer.cpp @@ -24,11 +24,13 @@ #include #include +#include #include #include #include #include +#include #include #include #include @@ -83,6 +85,21 @@ static void android_server_SystemServer_startSensorService(JNIEnv* /* env */, jo } } +static void android_server_SystemServer_startMemtrackProxyService(JNIEnv* env, + jobject /* clazz */) { + using aidl::android::hardware::memtrack::MemtrackProxy; + + const char* memtrackProxyService = "memtrack.proxy"; + + std::shared_ptr memtrack_proxy = ndk::SharedRefBase::make(); + auto binder = memtrack_proxy->asBinder(); + + AIBinder_forceDowngradeToLocalStability(binder.get()); + + const binder_exception_t err = AServiceManager_addService(binder.get(), memtrackProxyService); + LOG_ALWAYS_FATAL_IF(err != EX_NONE, "Cannot register %s: %d", memtrackProxyService, err); +} + static void android_server_SystemServer_startHidlServices(JNIEnv* env, jobject /* clazz */) { using ::android::frameworks::schedulerservice::V1_0::ISchedulingPolicyService; using ::android::frameworks::schedulerservice::V1_0::implementation::SchedulingPolicyService; @@ -144,6 +161,8 @@ static void android_server_SystemServer_setIncrementalServiceSystemReady(JNIEnv* static const JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ {"startSensorService", "()V", (void*)android_server_SystemServer_startSensorService}, + {"startMemtrackProxyService", "()V", + (void*)android_server_SystemServer_startMemtrackProxyService}, {"startHidlServices", "()V", (void*)android_server_SystemServer_startHidlServices}, {"initZygoteChildHeapProfiling", "()V", (void*)android_server_SystemServer_initZygoteChildHeapProfiling}, diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index fbf677dd0967c..9b2a1e7a4e07d 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -453,6 +453,11 @@ public final class SystemServer implements Dumpable { */ private static native void startSensorService(); + /** + * Start the memtrack proxy service. + */ + private static native void startMemtrackProxyService(); + /** * Start all HIDL services that are run inside the system server. This may take some time. */ @@ -1024,6 +1029,12 @@ public final class SystemServer implements Dumpable { mSystemServiceManager.startService(PowerStatsService.class); t.traceEnd(); + // Start MemtrackProxyService before ActivityManager, so that early calls + // to Memtrack::getMemory() don't fail. + t.traceBegin("MemtrackProxyService"); + startMemtrackProxyService(); + t.traceEnd(); + // Activity manager runs the show. t.traceBegin("StartActivityManager"); // TODO: Might need to move after migration to WM.