如何在 Android 应用程序的发布版本中删除 Log.d() 调用?

How to remove Log.d() calls in release build of an Android app?

我注意到我的发布版本是在 eclipse 中通过以下方式创建的:

Android Tools -> Export signed application package ...

我的混淆器-project.txt 包含:

-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(...);
}

然而,如果我 运行 设备上的应用程序并使用 CatLog 查看日志,我会看到所有 Log.d()、Log.v() 消息不应该在那里。 还有什么我应该设置的吗? 我花了很多时间在谷歌上搜索,但没有关于该主题的明确说明。好吧,我发现的大多数事情都是有类似问题但没有解决方案的人。

你试过吗?

-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
    }

在我的应用程序中,我用自己的 class 包装了记录器调用,它在记录之前检查布尔值 "debugMode"。 这样,将布尔标志更改为 false,就会导致没有日志(实际上,这只是概念,因为我也想允许不同级别的日志记录,但想法是一样的)。 您可以根据需要配置每个级别,因此您仍然会看到严重的日志,但排除调试日志。

确保您的混淆器配置中没有 -dontoptimize。 proguard 优化器删除了具有 "no side effects".

的方法调用

SDK默认proguard-android.txt里面有-dontoptimize。请改用 proguard-android-optimize.txt,不要在项目特定的混淆器配置中添加 -dontoptimize

Could you please state some source where I could read up on the subject. If it exists of course.

好吧,对于初学者来说 -assumenosideeffects 列在 documentation 的优化选项下。

One more thing bothers is that, I have read that using proguard-android-optimize.txt can cause problems on some devices. So, it is a sort od catch 22 situation.

Proguard 通常会有副作用。您需要彻底测试您的 proguard 处理的应用程序。


如果你想在不使用混淆器的情况下从发布版本中删除日志记录,你可以,例如添加

if (BuildConfig.DEBUG)

在每个日志记录调用之前,其中 BuildConfig 是由 Gradle Android 插件生成的构建配置。由于 DEBUG 有一个编译时常量,Java 编译器认为条件在发布配置中永远不会为真,因此不会在条件块内发出字节码。