我发现一个简单得多的解决方案是,当我们调用Ant release
目标时,忘记所有的if
个判断,只使用ProGuardgo 除所有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手册中的the examples.
Update (4.5 years later):现在我用Timber来记录Android.
它不仅比默认的Log
实现稍微好一些-日志(log)标记是自动设置的,而且很容易记录格式化的字符串和异常-而且您还可以在运行时指定不同的日志(log)记录行为.
在此示例中,日志(log)记录语句将仅在我的应用程序的调试版本中写入logcat:
木材采用my 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 sample app,其中所有日志(log)语句都在开发期间发送到logcat,并且在生产中不记录调试语句,但错误会自动报告给Crashlytics.