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

8

我注意到我的发布版本是通过eclipse制作的,具体步骤如下:

Android工具 -> 导出签名的应用程序包...

我的proguard-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()消息。 还有其他需要设置的东西吗? 我花了很多时间在谷歌上搜索,但是关于这个主题没有清晰的说明。大多数我找到的都是遇到类似问题的人,但是没有解决方案。


你的Proguard配置(无论是项目特定的还是来自SDK的)中是否包含“-dontoptimize”? - laalto
@laalto 是的,它是连接到 -assumenosideeffects 选项的吗? - f470071
3个回答

21
确保您的proguard配置中没有-dontoptimize。 这是proguard优化器,它会删除具有“无副作用”的方法调用。
SDK默认的proguard-android.txt包含-dontoptimize。请改用proguard-android-optimize.txt,并不要在项目特定的proguard配置中添加-dontoptimize
“-assumenosideeffects”在文档的优化选项下列出,您可以在文档中了解更多信息。
总的来说,Proguard可能会产生副作用。 您需要全面测试经过Proguard处理的应用程序。
如果您想在完全不使用proguard的情况下从发布构建中删除日志记录,可以添加以下内容:
if (BuildConfig.DEBUG)

在每个记录日志的调用之前,都需要使用由Gradle Android插件生成的构建配置 BuildConfig。由于DEBUG是一个编译时常量,Java编译器看到该条件在发布配置中永远不可能为真,并且不会发出条件块内的字节码。


谢谢。您能否告诉我一些可以阅读有关此主题的来源?如果有的话。还有一个问题困扰着我,就是我看到使用proguard-android-optimize.txt文件可能会在某些设备上引发问题。因此,这是一种进退两难的情况。 - f470071
谢谢。我已经接受并点赞你的答案,因为它指出了我的设置中的错误。虽然事情还不太清楚,但我已经发布了另一个问题:http://stackoverflow.com/questions/33070599/expanation-needed-on-proguard-config-setting-in-project-properties-file。 - f470071

5

你试过这个吗?

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

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

虽然这将删除日志输出,但除非您在调用站点对常量进行布尔检查(允许编译器省略调用),否则它不会删除日志调用。有些人希望出于性能、二进制大小或混淆的原因完全删除日志调用。 - fadden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接