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_DEBUGLOG_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 的任何给定定义,您只需执行一次。 更重要的是,预处理器是唯一从最终二进制文件中删除内容的方法。基于该语言的任何内容都会将您的字符串文字存储在静态存储中。我展示的方法从您的源代码中完全删除了字符串。编译器不会在二进制文件中包含它从未见过的内容。而NDEBUGassert 的基础。断言已从发布版本中删除。 你在哪里定义 NDEBUG 真假? NDK-Build 将 NDEBUG 定义为 1,除非您将 APP_OPTIM 编译为 debug

以上是关于NDK 如何在发布时删除 Log Debug 语句的主要内容,如果未能解决你的问题,请参考以下文章

NDK开发: 打印C代码的调试信息Log

log4j.properties日志级别debug打印后台sql语句

如何逐步使用ndk-stack?

Android NDK Debug

如何将debug版本的so库变成release版本?

怎样把hibernate产生的SQL语句,输出到log4j文件