从第三方lib / sdk删除所有调试日志记录调用(Proguard不工作)

时间:2016-11-22 09:29:49

标签: android android-studio logging gradle proguard

我尝试了很多解决方案 例如 Remove all debug logging calls before publishing: are there tools to do this?

但是,当我查看logcat时。日志仍显示。我的应用程序的日志已经消失,但第三方的日志仍然存在。

这是我的proguard配置。

-dontwarn **
-target 1.7
#-dontusemixedcaseclassnames
#-dontskipnonpubliclibraryclasses
#-dontpreverify
-verbose

-optimizations !code/simplification/arithmetic,!code/allocation/variable
-keep class **
-keepclassmembers class *{*;}
-keepattributes *

-dontskipnonpubliclibraryclasses
#-dontobfuscate
-forceprocessing
-optimizationpasses 5

-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

这是我的gradle文件配置

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable false
            jniDebuggable false
            signingConfig signingConfigs.config
        }
        debug {
           proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            minifyEnabled true
            debuggable false
            zipAlignEnabled true
            jniDebuggable false
        }
    }

出于安全原因,客户希望删除每个日志,甚至是第三方库或SDK中的日志

2 个答案:

答案 0 :(得分:1)

ProGuard只能删除应用程序代码中的日志记录调用,即正在处理并包含在您自己的应用程序中的代码。无法删除由Android运行时执行的任何日志记录调用,因为运行时安装在每个设备上,并且显然无法提前修改。

查看规则和gradle文件,设置看起来正确,也可以删除对android.util.Log的调用。确保您使用的是最新版本的ProGuard(例如5.2.1或更高版本)。此外,您的release buildType仍然禁用了ProGuard,您需要将minifyEnabled设置为true才能启用它。

答案 1 :(得分:0)

您需要检查您的第三方使用哪种日志记录库,并根据该日志记录来禁用每个库的日志记录。

如果您的第三方库使用Java Logger.getLogger(LIBRARY_CLASS.class.getName());这样的Logger,则可以像下面在应用程序类onCreate()上调用:

LogHelper.INSTANCE.setRootLoggerLevel(Level.OFF);

LogHelper类代码:

 object LogHelper {

 /**
 * set root logger log level
 *
 * @param level maximum allowed log level[Level]
 */
fun setRootLoggerLevel(level: Level) {
    val rootLogger = LogManager.getLogManager().getLogger("")
    rootLogger.level = level
}
}