如何在构建 Android 应用程序的发布版本之前删除所有调试日志记录调用?

2024-05-12

根据谷歌的说法,我必须“停用源代码中对 Log 方法的任何调用“在将我的 Android 应用程序发布到 Google Play 之前。摘自第 3 节出版清单 https://developer.android.com/studio/publish/preparing.html#turn-off-logging-and-debugging:

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

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

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

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

那么,有没有更好的源代码级方法来做到这一点?或者也许一些聪明的 ProGuard 语法可以有效但安全地删除所有日志行?


我发现一个更简单的解决方案就是忘记所有if检查所有地方并使用ProGuard http://proguard.sourceforge.net/删除任何Log.d() or Log.v()当我们调用 Ant 时方法调用release target.

这样,我们始终会为常规构建输出调试信息,而不必为发布构建进行任何代码更改。 ProGuard 还可以对字节码进行多次传递,以删除其他不需要的语句、空块,并且可以在适当的情况下自动内联短方法。

例如,这是一个非常基本的 Android ProGuard 配置:

-dontskipnonpubliclibraryclasses
-dontobfuscate
-forceprocessing
-optimizationpasses 5

-keep class * extends android.app.Activity
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
}

因此,您可以将其保存到一个文件中,然后从 Ant 调用 ProGuard,传入刚刚编译的 JAR 和您正在使用的 Android 平台 JAR。

也可以看看例子 http://proguard.sourceforge.net/manual/examples.html#androidapplication在 ProGuard 手册中。


更新(4.5年后):现在我用的是Timber https://github.com/JakeWharton/timber用于 Android 日志记录。

它不仅比默认的好一点Log实现 - 日志标签是自动设置的,并且很容易记录格式化的字符串和异常 - 但您也可以在运行时指定不同的日志记录行为。

在此示例中,日志记录语句只会在我的应用程序的调试版本中写入 logcat:

木材设置在我的Application onCreate() method:

if (BuildConfig.DEBUG) {
  Timber.plant(new Timber.DebugTree());
}

然后我可以在代码中的其他任何地方轻松记录:

Timber.d("Downloading URL: %s", url);
try {
  // ...
} catch (IOException ioe) {
  Timber.e(ioe, "Bad things happened!");
}

See the 木材示例应用程序 https://github.com/JakeWharton/timber/blob/dd94a22/timber-sample/src/main/java/com/example/timber/ExampleApp.java对于更高级的示例,其中所有日志语句在开发期间都发送到 logcat,而在生产中,不会记录任何调试语句,但错误会默默地报告给 Crashlytics。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在构建 Android 应用程序的发布版本之前删除所有调试日志记录调用? 的相关文章

随机推荐