From 52a667208f0dad43888b53123de9ec5e8f06729c Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 11 Jul 2023 21:03:30 +0000 Subject: [PATCH] binder: remove dead logging code This code is only enabled if a static constant is set to false. However, there are other (and better) ways to track transactions these days. For instance, you can use perfetto. There are also alternatives like the Java-only observers. Also, the fact that this is only on the main thread is really arbitrary and useless, and why is there custom code here anyway implementing the eventlog protocol? Bug: 290731071 Test: boot (change should be no-op) Change-Id: Ic7d7e3d045f9c7f53fc576bf2237ebe32a5a7f92 --- core/jni/android_util_Binder.cpp | 116 ------------------------------- 1 file changed, 116 deletions(-) diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 8bc52b874ae0f..c19879713f2fe 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -1305,103 +1305,6 @@ static jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) return alive ? JNI_TRUE : JNI_FALSE; } -static int getprocname(pid_t pid, char *buf, size_t len) { - char filename[32]; - FILE *f; - - snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid); - f = fopen(filename, "re"); - if (!f) { - *buf = '\0'; - return 1; - } - if (!fgets(buf, len, f)) { - *buf = '\0'; - fclose(f); - return 2; - } - fclose(f); - return 0; -} - -static bool push_eventlog_string(char** pos, const char* end, const char* str) { - jint len = strlen(str); - int space_needed = 1 + sizeof(len) + len; - if (end - *pos < space_needed) { - ALOGW("not enough space for string. remain=%" PRIdPTR "; needed=%d", - end - *pos, space_needed); - return false; - } - **pos = EVENT_TYPE_STRING; - (*pos)++; - memcpy(*pos, &len, sizeof(len)); - *pos += sizeof(len); - memcpy(*pos, str, len); - *pos += len; - return true; -} - -static bool push_eventlog_int(char** pos, const char* end, jint val) { - int space_needed = 1 + sizeof(val); - if (end - *pos < space_needed) { - ALOGW("not enough space for int. remain=%" PRIdPTR "; needed=%d", - end - *pos, space_needed); - return false; - } - **pos = EVENT_TYPE_INT; - (*pos)++; - memcpy(*pos, &val, sizeof(val)); - *pos += sizeof(val); - return true; -} - -// From frameworks/base/core/java/android/content/EventLogTags.logtags: - -static const bool kEnableBinderSample = false; - -#define LOGTAG_BINDER_OPERATION 52004 - -static void conditionally_log_binder_call(int64_t start_millis, - IBinder* target, jint code) { - int duration_ms = static_cast(uptimeMillis() - start_millis); - - int sample_percent; - if (duration_ms >= 500) { - sample_percent = 100; - } else { - sample_percent = 100 * duration_ms / 500; - if (sample_percent == 0) { - return; - } - if (sample_percent < (random() % 100 + 1)) { - return; - } - } - - char process_name[40]; - getprocname(getpid(), process_name, sizeof(process_name)); - String8 desc(target->getInterfaceDescriptor()); - - char buf[LOGGER_ENTRY_MAX_PAYLOAD]; - buf[0] = EVENT_TYPE_LIST; - buf[1] = 5; - char* pos = &buf[2]; - char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n - if (!push_eventlog_string(&pos, end, desc.string())) return; - if (!push_eventlog_int(&pos, end, code)) return; - if (!push_eventlog_int(&pos, end, duration_ms)) return; - if (!push_eventlog_string(&pos, end, process_name)) return; - if (!push_eventlog_int(&pos, end, sample_percent)) return; - *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. - android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); -} - -// We only measure binder call durations to potentially log them if -// we're on the main thread. -static bool should_time_binder_calls() { - return (getpid() == gettid()); -} - static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException { @@ -1428,29 +1331,10 @@ static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, ALOGV("Java code calling transact on %p in Java object %p with code %" PRId32 "\n", target, obj, code); - - bool time_binder_calls; - int64_t start_millis; - if (kEnableBinderSample) { - // Only log the binder call duration for things on the Java-level main thread. - // But if we don't - time_binder_calls = should_time_binder_calls(); - - if (time_binder_calls) { - start_millis = uptimeMillis(); - } - } - //printf("Transact from Java code to %p sending: ", target); data->print(); status_t err = target->transact(code, *data, reply, flags); //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); - if (kEnableBinderSample) { - if (time_binder_calls) { - conditionally_log_binder_call(start_millis, target, code); - } - } - if (err == NO_ERROR) { return JNI_TRUE; } else if (err == UNKNOWN_TRANSACTION) {