在安卓系统中,当minimyenabled为true时,如何在发布apk后关闭log-cat输出



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

从我的grade.build文件我已经做了:

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

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

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

作为一种选择,你可以为Android的Log使用一个包装类,将所有调用包装在检查BuildConfig.DEBUG标志的条件下,这更好,因为你将有一个用于这些检查的访问点,而不是把它们扔在你的类中。

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

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

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

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标记。

相关内容

  • 没有找到相关文章

最新更新