我发现一种更简单的解决方法是忘记所有的if检查,并只需在调用Ant的release
目标时,使用ProGuard来删除任何Log.d()
或Log.v()
方法调用。
这样,我们始终可以在常规构建中输出调试信息,而不必为发布版本进行任何代码更改。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。
另请参见ProGuard手册中的示例。
更新(4.5年后):现在我使用Timber进行Android日志记录。
它不仅比默认的Log
实现更好——日志标签会自动设置,并且很容易记录格式化字符串和异常,而且还可以在运行时指定不同的日志记录行为。
在此示例中,日志记录语句仅在我的应用程序的调试版本中写入logcat:
Timber在我的Application
的onCreate()
方法中设置:
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
那么在我的代码的任何其他地方,我都可以轻松记录日志:
Timber.d("Downloading URL: %s", url);
try {
// ...
} catch (IOException ioe) {
Timber.e(ioe, "Bad things happened!");
}
查看Timber示例应用,以获取更高级的示例。在开发过程中将所有日志语句发送到日志记录器,在生产环境中不记录调试语句,但静默报告错误至Crashlytics。