• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "Trace"
18 // #define LOG_NDEBUG 0
19 
20 #include <inttypes.h>
21 
22 #include <JNIHelp.h>
23 #include <ScopedUtfChars.h>
24 #include <ScopedStringChars.h>
25 
26 #include <utils/String8.h>
27 
28 #include <cutils/trace.h>
29 #include <cutils/log.h>
30 
31 namespace android {
32 
sanitizeString(String8 & utf8Chars)33 static void sanitizeString(String8& utf8Chars) {
34     size_t size = utf8Chars.size();
35     char* str = utf8Chars.lockBuffer(size);
36     for (size_t i = 0; i < size; i++) {
37         char c = str[i];
38         if (c == '\0' || c == '\n' || c == '|') {
39             str[i] = ' ';
40         }
41     }
42     utf8Chars.unlockBuffer();
43 }
44 
android_os_Trace_nativeGetEnabledTags(JNIEnv * env,jclass clazz)45 static jlong android_os_Trace_nativeGetEnabledTags(JNIEnv* env, jclass clazz) {
46     return atrace_get_enabled_tags();
47 }
48 
android_os_Trace_nativeTraceCounter(JNIEnv * env,jclass clazz,jlong tag,jstring nameStr,jint value)49 static void android_os_Trace_nativeTraceCounter(JNIEnv* env, jclass clazz,
50         jlong tag, jstring nameStr, jint value) {
51     ScopedUtfChars name(env, nameStr);
52 
53     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, name.c_str(), value);
54     atrace_int(tag, name.c_str(), value);
55 }
56 
android_os_Trace_nativeTraceBegin(JNIEnv * env,jclass clazz,jlong tag,jstring nameStr)57 static void android_os_Trace_nativeTraceBegin(JNIEnv* env, jclass clazz,
58         jlong tag, jstring nameStr) {
59     ScopedStringChars jchars(env, nameStr);
60     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
61     sanitizeString(utf8Chars);
62 
63     ALOGV("%s: %" PRId64 " %s", __FUNCTION__, tag, utf8Chars.string());
64     atrace_begin(tag, utf8Chars.string());
65 }
66 
android_os_Trace_nativeTraceEnd(JNIEnv * env,jclass clazz,jlong tag)67 static void android_os_Trace_nativeTraceEnd(JNIEnv* env, jclass clazz,
68         jlong tag) {
69 
70     ALOGV("%s: %" PRId64, __FUNCTION__, tag);
71     atrace_end(tag);
72 }
73 
android_os_Trace_nativeAsyncTraceBegin(JNIEnv * env,jclass clazz,jlong tag,jstring nameStr,jint cookie)74 static void android_os_Trace_nativeAsyncTraceBegin(JNIEnv* env, jclass clazz,
75         jlong tag, jstring nameStr, jint cookie) {
76     ScopedStringChars jchars(env, nameStr);
77     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
78     sanitizeString(utf8Chars);
79 
80     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
81     atrace_async_begin(tag, utf8Chars.string(), cookie);
82 }
83 
android_os_Trace_nativeAsyncTraceEnd(JNIEnv * env,jclass clazz,jlong tag,jstring nameStr,jint cookie)84 static void android_os_Trace_nativeAsyncTraceEnd(JNIEnv* env, jclass clazz,
85         jlong tag, jstring nameStr, jint cookie) {
86     ScopedStringChars jchars(env, nameStr);
87     String8 utf8Chars(reinterpret_cast<const char16_t*>(jchars.get()), jchars.size());
88     sanitizeString(utf8Chars);
89 
90     ALOGV("%s: %" PRId64 " %s %d", __FUNCTION__, tag, utf8Chars.string(), cookie);
91     atrace_async_end(tag, utf8Chars.string(), cookie);
92 }
93 
android_os_Trace_nativeSetAppTracingAllowed(JNIEnv * env,jclass clazz,jboolean allowed)94 static void android_os_Trace_nativeSetAppTracingAllowed(JNIEnv* env,
95         jclass clazz, jboolean allowed) {
96     ALOGV("%s: %d", __FUNCTION__, allowed);
97 
98     atrace_set_debuggable(allowed);
99 }
100 
android_os_Trace_nativeSetTracingEnabled(JNIEnv * env,jclass clazz,jboolean enabled)101 static void android_os_Trace_nativeSetTracingEnabled(JNIEnv* env,
102         jclass clazz, jboolean enabled) {
103     ALOGV("%s: %d", __FUNCTION__, enabled);
104 
105     atrace_set_tracing_enabled(enabled);
106 }
107 
108 static const JNINativeMethod gTraceMethods[] = {
109     /* name, signature, funcPtr */
110     { "nativeGetEnabledTags",
111             "()J",
112             (void*)android_os_Trace_nativeGetEnabledTags },
113     { "nativeTraceCounter",
114             "!(JLjava/lang/String;I)V",
115             (void*)android_os_Trace_nativeTraceCounter },
116     { "nativeTraceBegin",
117             "!(JLjava/lang/String;)V",
118             (void*)android_os_Trace_nativeTraceBegin },
119     { "nativeTraceEnd",
120             "!(J)V",
121             (void*)android_os_Trace_nativeTraceEnd },
122     { "nativeAsyncTraceBegin",
123             "!(JLjava/lang/String;I)V",
124             (void*)android_os_Trace_nativeAsyncTraceBegin },
125     { "nativeAsyncTraceEnd",
126             "!(JLjava/lang/String;I)V",
127             (void*)android_os_Trace_nativeAsyncTraceEnd },
128     { "nativeSetAppTracingAllowed",
129             "(Z)V",
130             (void*)android_os_Trace_nativeSetAppTracingAllowed },
131     { "nativeSetTracingEnabled",
132             "(Z)V",
133             (void*)android_os_Trace_nativeSetTracingEnabled },
134 };
135 
register_android_os_Trace(JNIEnv * env)136 int register_android_os_Trace(JNIEnv* env) {
137     int res = jniRegisterNativeMethods(env, "android/os/Trace",
138             gTraceMethods, NELEM(gTraceMethods));
139     LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
140 
141     return 0;
142 }
143 
144 } // namespace android
145