使用 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)
我正在尝试使用 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)