使用 R8 和 proguard 删除日志记录,但关闭其他所有内容

Using R8 and proguard to remove logging, but turn off everything else

我正在尝试使用 R8 和混淆器从发布版本中删除日志记录。问题是我现在需要这是微创的,所以我想启用 R8/proguard 来删除日志,但关闭其他所有内容。 IE 压缩、混淆等

build.gradle:

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

proguard-rules.pro:

-dontobfuscate
-dontoptimize
-dontshrink

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

但是,在构建和部署发布版本时,不会删除日志。我想这是因为 assumenosideeffects 运行s 作为我关闭的选项之一的一部分。

我也试过这个:

-keep class ** { *; }

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

然而,这仍然留下日志记录。

在不移动到不同的日志记录库或修改代码的情况下,是否可以使用 R8/proguard 而不是 运行 任何其他方式来删除日志记录?

编辑:

我努力弄清楚为什么 proguard/r8 没有删除日志我创建了一个全新的项目。我使用以下配置添加了一行日志记录:

release {
    debuggable true
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}

然而,当我构建发布版本并安装 APK 时,我仍然看到日志记录,这意味着我的日志语句没有被删除。

编辑:

debuggable true 

是否跳过 r8 优化。所以这不是验证日志是否已被 proguard 删除的好方法。使用 dex to jar 应用程序进行验证是可行的方法。 dex2jar 为我工作。

请从发布块中删除可调试的真实行,这就是您在构建中看到日志的原因。

我还使用 R8 从我的一些应用程序的发布版本中删除日志。我能看到你和我的配置之间的唯一区别是 v()d()、... 函数前的三个星号。

这就是我的发布版本的工作原理:

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

编辑:如果这没有帮助,可能是 AGP 中的行为变化引起的(相关问题:Android Gradle Plugin 4.2.x changed behavior for assumenosideeffects