参考
https://www.cnblogs.com/pyjetson/p/14946007.html
https://juejin.cn/post/7140836853241872392
static void atrace_init_once() { atrace_marker_fd = open("/sys/kernel/debug/tracing/trace_marker", O_WRONLY | O_CLOEXEC); if (atrace_marker_fd == -1) { ALOGE("Error opening trace file: %s (%d)", strerror(errno), errno); atrace_enabled_tags = 0; } else { atrace_enabled_tags = atrace_get_property(); } } atrace_get_property-获取debug.atrace.tags.enableflags的值,默认为ATRACE_TAG_ALWAYS // Read the sysprop and return the value tags should be set to static uint64_t atrace_get_property() { char value[PROPERTY_VALUE_MAX]; char *endptr; uint64_t tags; property_get("debug.atrace.tags.enableflags", value, "0"); errno = 0; tags = strtoull(value, &endptr, 0); if (value[0] == '\0' || *endptr != '\0') { ALOGE("Error parsing trace property: Not a number: %s", value); return 0; } else if (errno == ERANGE || tags == ULLONG_MAX) { ALOGE("Error parsing trace property: Number too large: %s", value); return 0; } // Only set the "app" tag if this process was selected for app-level debug // tracing. if (atrace_is_app_tracing_enabled()) { // 匹配的话,tags就有APP,APP的是第12位为1 tags |= ATRACE_TAG_APP; } else { tags &= ~ATRACE_TAG_APP; } // ATRACE_TAG_VALID_MASK表示前26位都为1,ATRACE_TAG_ALWAYS表示第1位为1 return (tags | ATRACE_TAG_ALWAYS) & ATRACE_TAG_VALID_MASK; } #define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name) static inline void atrace_begin(uint64_t tag, const char* name) {// 为false,则打印 if (CC_UNLIKELY(atrace_is_tag_enabled(tag))) { void atrace_begin_body(const char*); // 走这里 atrace_begin_body(name); } } #define ATRACE_ENABLED() atrace_is_tag_enabled(ATRACE_TAG) static inline uint64_t atrace_is_tag_enabled(uint64_t tag) {// atrace_get_enabled_tags返回为ATRACE_TAG_ALWAYS,vold的话,tag就是pm,所以这里false return atrace_get_enabled_tags() & tag; } uint64_t atrace_get_enabled_tags() { atrace_init(); return atrace_enabled_tags; } void atrace_begin_body(const char* name) { WRITE_MSG("B|%d|", "%s", name, ""); } #define WRITE_MSG(format_begin, format_end, name, value) { \ char buf[ATRACE_MESSAGE_LENGTH] __attribute__((uninitialized)); \ int pid = getpid(); \ int len = snprintf(buf, sizeof(buf), format_begin "%s" format_end, pid, \ name, value); \ if (len >= (int) sizeof(buf)) { \ /* Given the sizeof(buf), and all of the current format buffers, \ * it is impossible for name_len to be < 0 if len >= sizeof(buf). */ \ int name_len = strlen(name) - (len - sizeof(buf)) - 1; \ /* Truncate the name to make the message fit. */ \ ALOGW("Truncated name in %s: %s\n", __FUNCTION__, name); \ len = snprintf(buf, sizeof(buf), format_begin "%.*s" format_end, pid, \ name_len, name, value); \ } \ write(atrace_marker_fd, buf, len); \ }