从生产android应用程序中删除日志记录的最佳方法是什么.似乎proguard没有完全做到这一点,字符串仍然写入,所以我想知道从生产代码中删除日志记录的最佳解决方案是什么?
zap*_*apl 25
IMO最佳解决方案是在您调用日志记录方法的任何地方编写如下代码.
if (SOME_LOG_CONSTANT) Log.d(TAG, "event:" + someSlowToEvaluateMethod());
Run Code Online (Sandbox Code Playgroud)
通过更改1常量,您可以删除每个不需要的日志记录.这样,后面的部分if (false)甚至不应该进入你的.class文件,因为编译器可以完全删除它(它是无法访问的代码).
这也意味着如果将其包装在其中,则可以从发布软件中排除整个代码块if.这甚至是一些无法做到的事情.
在SOME_LOG_CONSTANT可BuildConfig.DEBUG如果你使用SDK工具R17及以上.根据构建类型,该常量会自动更改.谢谢@Christopher
使用Timber,它是一个很好的库来配置你的日志:https: //github.com/JakeWharton/timber
使用示例:Timber.d("活动创建");
配置示例:
public class ExampleApp extends Application {
@Override public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) {
Timber.plant(new DebugTree());
} else {
Timber.plant(new CrashReportingTree());
}
}
/** A tree which logs important information for crash reporting. */
private static class CrashReportingTree extends Timber.Tree {
@Override protected void log(int priority, String tag, String message, Throwable t) {
if (priority == Log.VERBOSE || priority == Log.DEBUG) {
return;
}
FakeCrashLibrary.log(priority, tag, message);
if (t != null) {
if (priority == Log.ERROR) {
FakeCrashLibrary.logError(t);
} else if (priority == Log.WARN) {
FakeCrashLibrary.logWarning(t);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
配置Release for Application会让您Log在发布应用程序之前简单地删除命令.
您可以通过删除源文件中对Log方法的调用来停用日志记录.
我所做的是创建一个专有的静态日志方法,读取这样的全局布尔值:
class MyLog {
private static final boolean LOGGING = true; //false to disable logging
public static void d(String tag, String message) {
if (LOGGING) {
Log.d(tag, message);
}
}
/* ... same for v, e, w, i */
}
Run Code Online (Sandbox Code Playgroud)
在想要记录的任何地方使用它.
MyLog.d("Tag", "This will only work with LOGGING true");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9856 次 |
| 最近记录: |