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

los*_*ion 2 android proguard android-r8

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

构建.gradle:

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
Run Code Online (Sandbox Code Playgroud)

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(...);
}
Run Code Online (Sandbox Code Playgroud)

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

我也尝试过这个:

-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(...);
}
Run Code Online (Sandbox Code Playgroud)

然而,这还剩下日志记录。

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

编辑:

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

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

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

编辑:

debuggable true 
Run Code Online (Sandbox Code Playgroud)

跳过 r8 优化。所以这不是验证日志是否已被混淆器删除的好方法。使用 dex to jar 应用程序进行验证是正确的方法。dex2jar 对我有用。

小智 5

请从发布块中删除可调试的 true 行,这就是您在 build.gradle 中看到日志的原因。

  • @lostintranslation,Sumit Kumar 是对的。如果应用程序设置为调试,proguard/R8 将不会优化。如果代码优化了,怎么调试。您的 gradle 中有冲突的设置。在发布中将 debuggable 设置为 false 并尝试构建。使用 https://github.com/skylot/jadx 工具验证日志语句是否被删除。 (2认同)