這里說明三個內容
- Camera Hal Demo默認使用的也是Android原生日志接口(例如:ALOGD, ALOGV),為什么logLevel設置為V級別,但是通過ALOGV打印的日志不輸出,不生效
- Camera Hal Demo在不修改ALOGX接口使用的情況下,使logLevel對ALOGV生效
- Camera Hal Demo logLevel怎么設置
接下來以Google Camera Hal (Aidl)為例子進行分析說明。
1.logLevel V對Camera Hal Demo ALOGV不生效
理論上ALOGV和ALOGD、ALOGI、ALOGW、ALOGE、ALOGF這些接口應該是類似的,是log模塊提供的不同log level的輸出接口。?
對于通過ALOGD,ALOGI輸出的log,可以通過修改logLevel prop來動態修改以控制是否輸出,而ALOGV輸出的log不能通過logLevel prop打開。因為Camera Hal中使用的ALOGV被LOG_NDEBUG宏開關單獨控制,如下
2.不修改ALOGX使用接口的情況下使logLevel對ALOGV生效
這里介紹兩種方法:
- 在一個頭文件中定義LOG_NDEBUG 0, 然后在想要調用ALOGV受logLevel控制的.cpp中包含這個頭文件。
- 創建自己的xx_log.h, 在這個文件中調用__android_log_print()重新實現ALOGV
方法1
//xx_log.h
#ifndef __XX_LOG_H__
#define __XX_LOG_H__#include <log/log.h>#define NDEBUG 0#endif
//devices/EmulatedSensor/hwl/EmulatedSensor.cpp
#include "xx_log.h"...
方法2
//xx_log.h
#ifndef __XX_LOG_H__
#define __XX_LOG_H__#include <log/log.h>#undef ALOGV
#define ALOGV __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)#endif
//devices/EmulatedSensor/hwl/EmulatedSensor.cpp
#include "xx_log.h"...
這種方法修改好處是,將來如果需要指定LOG_TAG也可以修改。?
3.[操作]動態設置logLevel
$adb shell setprop persist.log.tag.tagX logLevel
使用說明:
- tagX是具體的LOG_TAG, 例如android15 Camera Hal Demo中的EmulatedSensor.cpp中的日志,默認LOG_TAG是EmulatedSensor。
- ?logLevel是每個level的縮寫,對于大于等于這個logLevel的日志能被輸出。logLevel縮寫有(從小到大):
- V - Verbose
- D - Debug
- I - Info
- W - Warn
- E - Error
- F - Fatal
- 通過persist.log.tag.tagX設置的logLevel是永久性的(即設備重新上電后保留上次的設置)
使用例子:為EmulatedSensor這個LOG TAG設置V級別日志輸出(也就是說通過ALOGV, ALOGD, ALOGI, ALOGW, ALOGE, ALOGF這些接口調用打印的日志都能輸出,通過logcat看到)
$adb shell setprop persist.log.tag.EmulatedSensor V