本文介紹下如何打開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/文件夾下