NDK 如何在发布时删除 Log Debug 语句
Posted
技术标签:
【中文标题】NDK 如何在发布时删除 Log Debug 语句【英文标题】:NDK how to remove Log Debug statements on release 【发布时间】:2013-07-29 22:02:05 【问题描述】:我知道使用 proguard 可以从发布版本中删除 java Log.d 调试语句 https://***.com/a/13327603/1527440
但是有没有办法从 NDK C/C++ 代码中删除日志调试语句。
我正在使用定义语句在 NDK 中调用它们
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
【问题讨论】:
【参考方案1】:使用NDEBUG
宏。或者你真的可以在任何事情上#ifdef
。
#ifdef NDEBUG
#define LOGD(...)
#else
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#endif
然后是代码:
void f()
LOGD("About to do some stuff");
doSomeStuff();
编译器会看到(大致 - 如果ANDROID_LOG_DEBUG
和 LOG_TAG
是宏,它们也将被替换为它们的值):
void f()
__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,"About to do some stuff");
doSomeStuff();
当NDEBUG
未定义并会看到:
void f()
;
doSomeStuff();
当NDEBUG
被定义时。
【讨论】:
但使用 NDEBUG 时,对 LOGD 的调用仍将保留在二进制文件中,从而将调用的消息字符串留给潜在的黑客提取。有没有比每次调用 log D 更简洁的使用 #ifdef 的方法?谢谢LOGD
是一个宏,而不是一个函数。预处理器将在编译器看到它之前将其删除。就好像电话根本没有发生一样。此外,您不应该将每个呼叫都围起来LOGD
。这是LOGD
的定义,因此对于LOGD
的任何给定定义,您只需执行一次。
更重要的是,预处理器是唯一从最终二进制文件中删除内容的方法。基于该语言的任何内容都会将您的字符串文字存储在静态存储中。我展示的方法从您的源代码中完全删除了字符串。编译器不会在二进制文件中包含它从未见过的内容。而NDEBUG
是assert
的基础。断言已从发布版本中删除。
你在哪里定义 NDEBUG 真假?
NDK-Build 将 NDEBUG
定义为 1,除非您将 APP_OPTIM
编译为 debug
。以上是关于NDK 如何在发布时删除 Log Debug 语句的主要内容,如果未能解决你的问题,请参考以下文章