【问题标题】:NDK how to remove Log Debug statements on releaseNDK 如何在发布时删除 Log Debug 语句
【发布时间】:2013-07-29 22:02:05
【问题描述】:

我知道使用 proguard 可以从发布版本中删除 java Log.d 调试语句 https://stackoverflow.com/a/13327603/1527440

但是有没有办法从 NDK C/C++ 代码中删除日志调试语句。

我正在使用定义语句在 NDK 中调用它们

#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 

【问题讨论】:

    标签: android c++ debugging android-ndk


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2011-05-25
    • 2021-12-29
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多