当android中minifyenabled为true时,如何在发布apk后关闭log cat输出

时间:2015-06-27 12:29:44

标签: android android-studio proguard logcat

首先请不要把它作为一个重复的问题,因为我已经尝试了这个论坛的所有解决方案,但没有得到我的答案。

从我的gradle.build文件中我做了:

minifyenabled为true,然后在我的项目的proguard-rules.pro文件中写下这行代码:

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

但这并没有改变我的项目中的任何内容,当我制作发布版本apk并在我的设备上运行所有日志仍显示!我现在还有什么新东西要做吗?

2 个答案:

答案 0 :(得分:1)

在我工作的应用中,我们最终使用了不同的方法。我们仔细查看日志记录语句,大多数仅在初始开发期间使用。我们会在功能完成后删除它们。

对于我们想要保留的日志记录语句,我们使用这种方法:

import com.mycompany.mypackage.BuildConfig;
import android.util.Log;

public class SomeClass {

    public void someMethod() {
        if (BuildConfig.DEBUG) {
            Log.i("SomeClass", "Some logging");
        }
    }
}

如果BuildConfig.DEBUG字段是由构建过程生成的public static final boolean,则会发生什么。在发布版本中,此布尔值生成为false,这意味着您获得if (false) { /* logging */ }。 java编译器非常智能,可以看到这段代码永远不会运行,并且完全不使用Java字节代码。当这个字节代码被dexed并放入APK时,日志就不存在了。

我们根本没有使用-assumenosideeffects标记。

答案 1 :(得分:1)

设置-assumenosideeffectsrelevant documentation)时会跳过

-dontoptimize,我认为这是Android提供的标准ProGuard配置文件的默认设置。

如果您想使用-assumenosideeffects,则必须使用proguard-android-optimize.txt目录中的{your-sdk-dir}/tools/proguard/配置文件。这也将应用于您在应用程序项目中使用的任何库,因此如果您担心这一点,它们的日志记录也将被删除。

作为替代方案,您可以使用Android Log的包装类,将所有调用包装在检查BuildConfig.DEBUG标志的条件中,这样更好,因为您将拥有一个访问点这些检查而不是在你的课堂上乱扔垃圾。

然而值得注意的是,对于后一种解决方案,您将无法获得发布版本的性能改进,就好像您有大量日志记录来连接消息的字符串,这些仍将在运行时为方法调用进行评估(即使它们永远不会打印出来。)