summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ryan Savitski <rsavitski@google.com> 2019-01-23 03:21:43 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-01-23 03:21:43 +0000
commite58c4b58503db6e60c47cd04e9b889b26e2e153c (patch)
tree97222a413a758eb280bc05d1ad13765d3e679a06
parent035808eea06926a97651deac45aafcaad86a24dd (diff)
parentcfdc151d520c3bec26ac2a258648324ab5e542b7 (diff)
Merge "zygote children: propagate profileability to bionic for native heap profiling"
-rw-r--r--core/java/android/app/ActivityThread.java6
-rw-r--r--core/jni/android_app_ActivityThread.cpp9
-rw-r--r--services/core/jni/Android.bp1
-rw-r--r--services/core/jni/com_android_server_SystemServer.cpp9
-rw-r--r--services/java/com/android/server/SystemServer.java10
5 files changed, 34 insertions, 1 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 7767f0491a16..a3243a5de72a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -5939,6 +5939,11 @@ public final class ActivityThread extends ClientTransactionHandler {
Binder.enableTracing();
}
+ // Initialize heap profiling.
+ if (isAppProfileable || Build.IS_DEBUGGABLE) {
+ nInitZygoteChildHeapProfiling();
+ }
+
// Allow renderer debugging features if we're debuggable.
boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
HardwareRenderer.setDebuggingEnabled(isAppDebuggable || Build.IS_DEBUGGABLE);
@@ -6965,4 +6970,5 @@ public final class ActivityThread extends ClientTransactionHandler {
// ------------------ Regular JNI ------------------------
private native void nPurgePendingResources();
private native void nDumpGraphicsInfo(FileDescriptor fd);
+ private native void nInitZygoteChildHeapProfiling();
}
diff --git a/core/jni/android_app_ActivityThread.cpp b/core/jni/android_app_ActivityThread.cpp
index d56e4c51124d..93f2525eb29d 100644
--- a/core/jni/android_app_ActivityThread.cpp
+++ b/core/jni/android_app_ActivityThread.cpp
@@ -24,6 +24,8 @@
#include "core_jni_helpers.h"
#include <unistd.h>
+#include <bionic_malloc.h>
+
namespace android {
static void android_app_ActivityThread_purgePendingResources(JNIEnv* env, jobject clazz) {
@@ -38,13 +40,18 @@ android_app_ActivityThread_dumpGraphics(JNIEnv* env, jobject clazz, jobject java
minikin::Layout::dumpMinikinStats(fd);
}
+static void android_app_ActivityThread_initZygoteChildHeapProfiling(JNIEnv* env, jobject clazz) {
+ android_mallopt(M_INIT_ZYGOTE_CHILD_PROFILING, nullptr, 0);
+}
static JNINativeMethod gActivityThreadMethods[] = {
// ------------ Regular JNI ------------------
{ "nPurgePendingResources", "()V",
(void*) android_app_ActivityThread_purgePendingResources },
{ "nDumpGraphicsInfo", "(Ljava/io/FileDescriptor;)V",
- (void*) android_app_ActivityThread_dumpGraphics }
+ (void*) android_app_ActivityThread_dumpGraphics },
+ { "nInitZygoteChildHeapProfiling", "()V",
+ (void*) android_app_ActivityThread_initZygoteChildHeapProfiling }
};
int register_android_app_ActivityThread(JNIEnv* env) {
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index fb00aebb622f..3729eaf63ddb 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -53,6 +53,7 @@ cc_library_static {
],
include_dirs: [
+ "bionic/libc/private",
"frameworks/base/libs",
"frameworks/native/services",
"system/gatekeeper/include",
diff --git a/services/core/jni/com_android_server_SystemServer.cpp b/services/core/jni/com_android_server_SystemServer.cpp
index dc0d53b41595..159a4960731d 100644
--- a/services/core/jni/com_android_server_SystemServer.cpp
+++ b/services/core/jni/com_android_server_SystemServer.cpp
@@ -24,6 +24,8 @@
#include <sensorservice/SensorService.h>
#include <sensorservicehidl/SensorManager.h>
+#include <bionic_malloc.h>
+
#include <cutils/properties.h>
#include <utils/Log.h>
#include <utils/misc.h>
@@ -64,6 +66,11 @@ static void android_server_SystemServer_startHidlServices(JNIEnv* env, jobject /
ALOGE_IF(err != OK, "Cannot register %s: %d", ISchedulingPolicyService::descriptor, err);
}
+static void android_server_SystemServer_initZygoteChildHeapProfiling(JNIEnv* /* env */,
+ jobject /* clazz */) {
+ android_mallopt(M_INIT_ZYGOTE_CHILD_PROFILING, nullptr, 0);
+}
+
/*
* JNI registration.
*/
@@ -71,6 +78,8 @@ static const JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
{ "startSensorService", "()V", (void*) android_server_SystemServer_startSensorService },
{ "startHidlServices", "()V", (void*) android_server_SystemServer_startHidlServices },
+ { "initZygoteChildHeapProfiling", "()V",
+ (void*) android_server_SystemServer_initZygoteChildHeapProfiling },
};
int register_android_server_SystemServer(JNIEnv* env)
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index cef47caff740..98385c93aafe 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -327,6 +327,11 @@ public final class SystemServer {
private static native void startHidlServices();
/**
+ * Mark this process' heap as profileable. Only for debug builds.
+ */
+ private static native void initZygoteChildHeapProfiling();
+
+ /**
* The main entry point from zygote.
*/
public static void main(String[] args) {
@@ -448,6 +453,11 @@ public final class SystemServer {
// Initialize native services.
System.loadLibrary("android_servers");
+ // Debug builds - allow heap profiling.
+ if (Build.IS_DEBUGGABLE) {
+ initZygoteChildHeapProfiling();
+ }
+
// Check whether we failed to shut down last time we tried.
// This call may not return.
performPendingShutdown();