android 中 minifyenabled 为真时如何在发布 apk 后关闭 log cat 输出
how to turn off log cat output after making release apk when minifyenabled is true in android
首先请不要将其视为重复问题,因为我已经尝试了该论坛的所有解决方案但未能得到我的答案。
来自我制作的 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 和 运行 时,所有日志仍然显示!我现在有什么新的事情要做吗?
在我开发的应用程序中,我们最终使用了不同的方法。我们仔细查看我们的日志记录语句,大多数仅在初始开发期间使用。我们会在功能完成后删除它们。
对于我们想要保留的日志语句,我们使用这种方法:
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
标记。
-assumenosideeffects
在设置 -dontoptimize
时被跳过 (relevant documentation),我相信这是 Android 提供的标准 ProGuard 配置文件的默认设置。
如果您想使用 -assumenosideeffects
,则必须使用 {your-sdk-dir}/tools/proguard/
目录中的 proguard-android-optimize.txt
配置文件。这也将应用于您在应用程序项目中使用的任何库,因此如果您担心的话,它们的日志记录也将被删除。
作为替代方案,您可以为 Android 的 Log
使用包装器 class,将所有调用包装在检查 BuildConfig.DEBUG
标志的条件中,这样更好,因为您将有一个单一的访问点来进行这些检查,而不是将它们散落在您的 classes.
然而,值得注意的是,对于后一种解决方案,您不会获得发布版本的性能改进,就好像您有大量日志记录,您在其中连接消息的字符串,这些仍将在运行时针对该方法进行评估调用(即使它们永远不会被打印出来)。
首先请不要将其视为重复问题,因为我已经尝试了该论坛的所有解决方案但未能得到我的答案。
来自我制作的 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 和 运行 时,所有日志仍然显示!我现在有什么新的事情要做吗?
在我开发的应用程序中,我们最终使用了不同的方法。我们仔细查看我们的日志记录语句,大多数仅在初始开发期间使用。我们会在功能完成后删除它们。
对于我们想要保留的日志语句,我们使用这种方法:
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
标记。
-assumenosideeffects
在设置 -dontoptimize
时被跳过 (relevant documentation),我相信这是 Android 提供的标准 ProGuard 配置文件的默认设置。
如果您想使用 -assumenosideeffects
,则必须使用 {your-sdk-dir}/tools/proguard/
目录中的 proguard-android-optimize.txt
配置文件。这也将应用于您在应用程序项目中使用的任何库,因此如果您担心的话,它们的日志记录也将被删除。
作为替代方案,您可以为 Android 的 Log
使用包装器 class,将所有调用包装在检查 BuildConfig.DEBUG
标志的条件中,这样更好,因为您将有一个单一的访问点来进行这些检查,而不是将它们散落在您的 classes.
然而,值得注意的是,对于后一种解决方案,您不会获得发布版本的性能改进,就好像您有大量日志记录,您在其中连接消息的字符串,这些仍将在运行时针对该方法进行评估调用(即使它们永远不会被打印出来)。