【问题标题】:how to turn off log cat output after making release apk when minifyenabled is true in android当minifyenabled在android中为true时,如何在发布apk后关闭log cat输出
【发布时间】:2015-06-27 12:29:44
【问题描述】:

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

从我制作的 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 并在我的设备上运行时,所有日志仍然显示!我现在有什么新的事情要做吗?

【问题讨论】:

  • 在我使用的应用程序中,我们最终删除了几乎所有的日志记录语句,并将保留在 if (BuildConfig.DEBUG) { /* logging */ } 块中的少数语句包装起来。我们根本没有使用 assumenosideeffects 这个东西。
  • 请给出一个完整的解决方案作为答案,如果可行,我会将其标记为已接受:)
  • 首先,一些日志消息来自我的一个库类,我无法访问这些类,如何在该库上编写代码? @Barend
  • 事后您不能将其应用于库。您必须更新库才能使其正常工作。如果它们是开源的,则有可能……
  • 您可以做的另一件事是使用 ProGuard 去除日志记录。结帐stackoverflow.com/questions/2446248/…

标签: android android-studio proguard logcat


【解决方案1】:

-dontoptimize 设置时会跳过-assumenosideeffects (relevant documentation),我相信这是 Android 提供的标准 ProGuard 配置文件的默认设置。

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

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

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

【讨论】:

  • 我将您的答案标记为非常有价值的选项,我今天会尝试并让您知道
  • 或者你能给我一个简单的复制粘贴解决方案来阻止我的进程中的每个日志,包括我的库日志和我自己的日志? @马丁
【解决方案2】:

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

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

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 字节码之外。当这个字节码被索引并放入 APK 时,日志根本就不存在。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2021-12-17
    • 1970-01-01
    • 2018-10-11
    • 2022-01-22
    相关资源
    最近更新 更多