根据谷歌,我必须在发布我的Android应用程序谷歌播放之前“停用源代码中的Log方法的任何调用”。出版清单第3节节选:

在构建应用程序发布之前,请确保禁用了日志记录并禁用了调试选项。您可以通过删除源文件中对Log方法的调用来禁用日志记录。

我的开源项目很大,每次发布都要手动完成,这很痛苦。此外,删除Log行可能很棘手,例如:

if(condition)
  Log.d(LOG_TAG, "Something");
data.load();
data.show();

如果注释Log行,则该条件将应用于下一行,并且可能不会调用load()。这样的情况是否罕见到我可以决定它不应该存在?

那么,是否有更好的源代码级方法来做到这一点呢?或者是一些聪明的ProGuard语法,有效但安全地删除所有Log行?


当前回答

将以下内容添加到proguard-rules.txt文件中

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

其他回答

我会考虑使用roboguice的日志记录工具,而不是内置的android.util.Log

它们的功能会自动禁用发布版本的调试和详细日志。 此外,您还可以免费获得一些漂亮的功能(例如,可定制的日志记录行为,每个日志的额外数据等等)

使用proguard可能是相当麻烦的,除非您有一个很好的理由(禁用日志不是一个好理由),否则我不会经历配置和使其与应用程序一起工作的麻烦。

这就是我过去在我的android项目上所做的。

在Android Studio我们可以做类似的操作,Ctrl+Shift+F从整个项目(命令+Shift+F在MacOs)和Ctrl+Shift+R替换((命令+Shift+R在MacOs))

如果你可以运行全局替换(一次),然后保留一些编码惯例,你可以遵循Android框架中经常使用的模式。

而不是写作

Log.d(TAG, string1 + string2 + arg3.toString());

把它当作

if (BuildConfig.DEBUG) Log.d(TAG, string1 + String.format("%.2f", arg2) + arg3.toString());

现在proguard可以从优化版的DEX中删除StringBuilder和它使用的所有字符串和方法。使用proguard-android- optimization .txt,你就不用担心android.util了。

android {
  …
  buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}

与Android Studio gradle插件,BuildConfig。DEBUG非常可靠,因此不需要额外的常数来控制剥离。

ProGuard将在你的发布版本中为你做这件事,现在来自android.com的好消息是:

http://developer.android.com/tools/help/proguard.html

ProGuard工具通过删除未使用的代码和用语义模糊的名称重命名类、字段和方法来缩小、优化和混淆代码。结果是一个更小的.apk文件,更难以进行反向工程。由于ProGuard使应用程序更难进行反向工程,因此当应用程序使用对安全性敏感的特性时,例如在应用程序授权时,使用它是很重要的。

ProGuard集成到Android构建系统中,所以你不需要手动调用它。ProGuard仅在以发布模式构建应用程序时运行,因此在以调试模式构建应用程序时不必处理混淆的代码。运行ProGuard是完全可选的,但强烈推荐。

本文档介绍如何启用和配置ProGuard,以及如何使用retrace工具解码混淆的堆栈跟踪

使用kotlin很简单,只需声明几个顶级函数

val isDebug: Boolean
    get() = BuildConfig.DEBUG

fun logE(tag: String, message: String) {
    if (isDebug) Log.e(tag, message)
}

fun logD(tag: String, message: String) {
    if (isDebug) Log.d(tag, message)
}