本文介绍下如何打开adb源码中的debug log
1.adb源码log是可以动态打开和关闭的,控制逻辑代码如下
static NoDestructor<std::mutex> log_mutex;
static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging");
static std::optional<LogStatus> cached_log_status GUARDED_BY(log_mutex);static NoDestructor<CachedProperty> persist_log_propertyGUARDED_BY(log_mutex)("persist.debug.adbd.logging");
static std::optional<LogStatus> cached_persist_log_status GUARDED_BY(log_mutex);static LogStatus ParseLogStatus(std::string_view str) {LogStatus result = {};for (const auto& part : android::base::Split(std::string(str), ",")) {if (part == "cnxn") {result[adb::LogType::Connection] = true;} else if (part == "service") {result[adb::LogType::Service] = true;} else if (part == "shell") {result[adb::LogType::Shell] = true;} else if (part == "all") {result[adb::LogType::Connection] = true;result[adb::LogType::Service] = true;result[adb::LogType::Shell] = true;}}return result;
}static LogStatus GetLogStatus(android::base::CachedProperty* property,std::optional<LogStatus>* cached_status) REQUIRES(log_mutex) {bool changed;const char* value = property->Get(&changed);if (changed || !*cached_status) {**cached_status = ParseLogStatus(value);}return **cached_status;
}namespace adb {
bool is_logging_enabled(LogType type) {std::lock_guard<std::mutex> lock(*log_mutex);return GetLogStatus(log_property.get(), &cached_log_status)[type] ||GetLogStatus(persist_log_property.get(), &cached_persist_log_status)[type];
}
} // namespace adb
2.配置方法
adb shell setprop persist.debug.adbd.logging service //打开LogType为service的log
例如:
daemon/services.cpp:262: ADB_LOG(Service) << "transport " << transport->serial_name() << " opening service " << name;
打开后执行adb remount,可以抓到如下log
I adbd : transport UsbFfs opening service shell,v2,TERM=xterm-256color,raw:remount
adb shell setprop persist.debug.adbd.logging all //打开所有logtype
3.打开adb trace log方法
adb shell setprop persist.adb.trace_mask 1
adb shell pkill adbd //需要重启adbd 生效
trace log会保存在/data/adb/文件夹下