首先,请不要把它当作一个重复的问题,因为我已经尝试了这个论坛的所有解决方案,但没有得到答案。
从我的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
标记。