diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/os/Trace.java | 21 | ||||
-rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 5 | ||||
-rw-r--r-- | core/jni/android_os_Trace.cpp | 8 |
3 files changed, 30 insertions, 4 deletions
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index 617f490..3307a8c 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -79,6 +79,7 @@ public final class Trace { private static native void nativeAsyncTraceBegin(long tag, String name, int cookie); private static native void nativeAsyncTraceEnd(long tag, String name, int cookie); private static native void nativeSetAppTracingAllowed(boolean allowed); + private static native void nativeSetTracingEnabled(boolean allowed); static { // We configure two separate change callbacks, one in Trace.cpp and one here. The @@ -115,10 +116,6 @@ public final class Trace { */ private static long cacheEnabledTags() { long tags = nativeGetEnabledTags(); - if (tags == TRACE_TAG_NOT_READY) { - Log.w(TAG, "Unexpected value from nativeGetEnabledTags: " + tags); - // keep going - } sEnabledTags = tags; return tags; } @@ -169,6 +166,22 @@ public final class Trace { } /** + * Set whether tracing is enabled in this process. Tracing is disabled shortly after Zygote + * initializes and re-enabled after processes fork from Zygote. This is done because Zygote + * has no way to be notified about changes to the tracing tags, and if Zygote ever reads and + * caches the tracing tags, forked processes will inherit those stale tags. + * + * @hide + */ + public static void setTracingEnabled(boolean enabled) { + nativeSetTracingEnabled(enabled); + + // Setting whether tracing is enabled may change the tags, so we update the cached tags + // here. + cacheEnabledTags(); + } + + /** * Writes a trace message to indicate that a given section of code has * begun. Must be followed by a call to {@link #traceEnd} using the same * tag. diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 7eddc9c..2184fd2 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -25,6 +25,7 @@ import android.net.LocalServerSocket; import android.os.Debug; import android.os.Process; import android.os.SystemClock; +import android.os.Trace; import android.util.EventLog; import android.util.Log; @@ -528,6 +529,10 @@ public class ZygoteInit { // Do an initial gc to clean up after startup gc(); + // Disable tracing so that forked processes do not inherit stale tracing tags from + // Zygote. + Trace.setTracingEnabled(false); + // If requested, start system server directly from Zygote if (argv.length != 2) { throw new RuntimeException(argv[0] + USAGE_STRING); diff --git a/core/jni/android_os_Trace.cpp b/core/jni/android_os_Trace.cpp index 1315291..01d02c5 100644 --- a/core/jni/android_os_Trace.cpp +++ b/core/jni/android_os_Trace.cpp @@ -86,6 +86,11 @@ static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env, atrace_set_debuggable(allowed); } +static void android_os_Trace_nativeSetTracingEnabled(JNIEnv* env, + jclass clazz, jboolean enabled) { + atrace_set_tracing_enabled(enabled); +} + static JNINativeMethod gTraceMethods[] = { /* name, signature, funcPtr */ { "nativeGetEnabledTags", @@ -109,6 +114,9 @@ static JNINativeMethod gTraceMethods[] = { { "nativeSetAppTracingAllowed", "(Z)V", (void*)android_os_Trace_nativeSetAppTracingAllowed }, + { "nativeSetTracingEnabled", + "(Z)V", + (void*)android_os_Trace_nativeSetTracingEnabled }, }; int register_android_os_Trace(JNIEnv* env) { |