在Android中删除生产代码中的日志logging?

什么是从生产Android应用程序中删除日志logging的最好方法。 看来,proguard并没有完全做到这一点,string仍然被写入,所以我想知道什么是从生产代码中删除日志logging的最佳解决scheme?

Solutions Collecting From Web of "在Android中删除生产代码中的日志logging?"

国际海事组织的最佳解决scheme是编写如下所示的代码,无论您何时调用日志logging方

if (SOME_LOG_CONSTANT) Log.d(TAG, "event:" + someSlowToEvaluateMethod()); 

通过更改1常数,您可以将每个不需要的日志删除。 这样if (false)背后的部分甚至if (false)应该进入你的.class文件,因为编译器可以完全移除它(它是无法访问的代码)。

这也意味着你可以从发布软件中排除整个代码块,如果你把它们包装在那里。 这是甚至proguard不能做的事情。

如果您使用SDK Tools r17及更高版本,则SOME_LOG_CONSTANT可以是BuildConfig.DEBUG 。 该常数会根据构buildtypes自动更改。 Thx @Christopher

使用木材,这是一个很好的库来configuration你的日志: https : //github.com/JakeWharton/timber

使用示例:Timber.d(“Activity Created”);

configuration示例:

 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); } } } } 

configuration您的发布应用程序告诉您只需删除Log命令,然后再发布您的应用程序。

您可以通过删除对源文件中的日志方法的调用来停用日志logging。

我所做的是创build一个专有的静态日志方法,读取一个像这样的全局布尔值:

 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 */ } 

在任何你想要login的地方使用这个。

 MyLog.d("Tag", "This will only work with LOGGING true"); 

我build议你看看这个日志扩展类 。

它使您能够对日志进行良好的控制。 例如,您可以禁用所有日志(感谢configuration文件)或只是某些包或类的日志。

此外,它增加了一些有用的function(例如,你不必为每个日志传递标签)。

我build议你看Roboguice – http://code.google.com/p/roboguice/ – 如果你使用内置的Ln函数,它将自动不会login一个签名的APK。 它简化了大量的其他Android样板。 你可以看到它在与行动的基础上 – https://github.com/achuinard/basedroid

您可以使用DebugLog类。 当应用程序被释放时,所有日志都被DebugLog禁用。 它为开发人员提供了更易于理解的DDMS日志。

防爆;

 DebugLog.e("your message"); 

只需将此方法添加到您的代码中,并使用Logd而不是Log.d

 private static final String TAG = "your own tag to recognize log entries from this app"; public static void Logd(String txt) { if (BuildConfig.DEBUG&&BuildConfig.BUILD_TYPE.equals("debug")) Log.d(TAG,txt); } 

我知道这个string仍然会被评估,但是我们在额外的处理时间里说的是微秒。 没有人会注意到应用程序速度的差异,除非你在循环中进行数千次的logging。

DEBUG和BUILD_TYPE可在Android Studio中使用。 DEBUG布尔值是build.gradle文件中的“debuggable”选项:

 buildTypes { debug { debuggable true runProguard false proguardFile getDefaultProguardFile('proguard-android.txt') } release { debuggable false runProguard true proguardFile getDefaultProguardFile('proguard-android.txt') } } 

在Android Studio中运行时,BUILD_TYPE会自动设置为“debugging”。

因此,如果您将debuggable设置为false,或者用户具有发行版本,那么日志将会消失。

最好的办法是从我的经验来处理这个问题,

  • 首先在login时检查BuildConfig.DEBUG标志以打印日志。

     Class LogUtils{ public static void log(Class clazz, String message) { if (BuildConfig.DEBUG) {//log only in debug mode Log.d(clazz.getSimpleName(), message); } } } 
  • 然后启用minify到您的应用程序模块gradle文件,这将使proguard优化您的二进制文件

     android { buildTypes { release { minifyEnabled true //shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } } 

这将保持debugging日志在您的debugging版本。 但是在你的发行版本中, if (BuildConfig.DEBUG)条件从来就不是真的,因此proguard会从你的二进制文件中去掉不可用的日志代码。