配套系列教学视频链接:
说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
Android系统中C/C++代码中verbose级别的日志是不会输出,是因为一个开关没打开,本节就给大家介绍如何打开这个开关。
一, 介绍
在底层调试系统代码时, 会有ALOGV级别代码, 这些在调试的时候能帮我们看到更加详细的日志,这样更方便我们去理解系统代码,比如app_process程序:
但是C/C++代码中的ALOGV()一般虽然调用了, 通过logcat一般也是看不到的,是什么原因的,可以查看log/log_main.h中
#ifndef ALOGV
#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#if LOG_NDEBUG
#define ALOGV(...) \
do { \
if (false) { \
__ALOGV(__VA_ARGS__); \
} \
} while (false)
#else
#define ALOGV(...) __ALOGV(__VA_ARGS__)
#endif
#endif
以上代码可以看到定义了两个接口:
1, __ALOGV()==>ALOG()
2, ALOGV()==>__ALOGV()
同时LOG_NDEBUG为1时, ALOGV实际是一个空函数, 那LOG_NDEBUG默认是多少呢?
而LOG_NDEBUG的定义由如下控制:
/*
* Normally we strip the effects of ALOGV (VERBOSE messages),
* LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
* release builds be defining NDEBUG. You can modify this (for
* example with "#define LOG_NDEBUG 0" at the top of your source
* file) to change that behavior.
*/
#ifndef LOG_NDEBUG
#ifdef NDEBUG
#define LOG_NDEBUG 1
#else
#define LOG_NDEBUG 0
#endif
#endif
以上代码可以知道: 默认LOG_NDEBUG没有定义,如果NDEBUG定义了, LOG_NDEBUG就为1 (ALOGV()为空)
通过搜索grep -rHn "NDEBUG" ./build, 编译系统会自动定义NDEBUG, 所以LOG_NDEBUG也就默认为1
./build/soong/cc/config/global.go:41: "-DNDEBUG",
所以如果要想LOG_NDEBUG为0: 只需要做:
#undef NDEBUG
或者直接
#define LOG_NDEBUG 0
Android.bp可以加cflags: ["-UNDEBUG"]
Android.mk 可以加 LOCAL_C_FLAG := -UUNDEBUG
二,总结:
Java层verbose的日志是可以打印的,对于C/C++代码, 根据自己的需求,打开verbose开关,就能查看系统中的进程的更多日志。