在将应用程序发布到GooglePlay之前,如何删除所有调试日志调用?

在将应用程序发布到GooglePlay之前,如何删除所有调试日志调用?

根据谷歌的说法,我必须“禁用源代码中对日志方法的任何调用“在发布我的Android应用程序之前,摘录自出版清单:

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

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

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

如果我对Log行进行注释,则条件将应用于下一行,而LOAD()不被调用。这样的情况是否很罕见,以至于我可以决定它不应该存在?

这是在官方的清单上,所以我想很多人经常这样做。
那么,如何有效而安全地删除所有的日志线路呢?


ibeautiful
浏览 648回答 3
3回答

30秒到达战场

我发现一个更容易的解决办法是忘掉所有if到处检查然后用ProGuard剔除任何Log.d()或Log.v()方法调用Ant时调用release目标。这样,我们就可以将调试信息输出到常规构建中,而不必为发布版本进行任何代码更改。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。另见实例在护卫队手册里。更新(4.5年后):现在我用木材用于Android日志记录。它不仅比默认的好一点Log实现-日志标记是自动设置的,并且很容易记录格式化的字符串和异常-但是您也可以在运行时指定不同的日志记录行为。在本例中,日志记录语句只会在我的应用程序的调试构建中写入logcat:木材建在我的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!");}见木材样品应用程序更高级的例子是,在开发过程中,所有的日志语句都被发送到logcat,在生产过程中,没有记录调试语句,但是错误会悄悄地报告给Crashlytics。

扬帆大鱼

我建议在某个地方设置一个静态布尔值,指示是否进行日志记录:class MyDebug {   static final boolean LOG = true; }然后,无论您想在哪里登录代码,只需这样做:if (MyDebug.LOG) {   if (condition) Log.i(...); }现在,当您将MyDebug.LOG设置为false时,编译器将删除这些检查中的所有代码(因为它是一个静态的最终结果,它在编译时知道代码不被使用)。对于较大的项目,您可能希望开始在单个文件中使用布尔值,以便能够在需要时轻松地启用或禁用在那里的日志记录。例如,这些是窗口管理器中的各种日志常量:static final String TAG = "WindowManager";static final boolean DEBUG = false;static final boolean DEBUG_FOCUS = false;static final boolean DEBUG_ANIM = false;static final boolean DEBUG_LAYOUT = false;static final boolean DEBUG_RESIZE = false;static final boolean DEBUG_LAYERS = false;static final boolean DEBUG_INPUT = false;static final boolean DEBUG_INPUT_METHOD = false;static final boolean DEBUG_VISIBILITY = false;static final boolean DEBUG_WINDOW_MOVEMENT = false;static final boolean DEBUG_ORIENTATION = false;static final boolean DEBUG_APP_TRANSITIONS = false;static final boolean DEBUG_STARTING_WINDOW = false;static final boolean DEBUG_REORDER = false;static final boolean DEBUG_WALLPAPER = false;static final boolean SHOW_TRANSACTIONS = false;static final boolean HIDE_STACK_CRAWLS = true;static final boolean MEASURE_LATENCY = false;具有相应的代码,如:    if (DEBUG_FOCUS || DEBUG_WINDOW_MOVEMENT) Log.v(         TAG, "Adding window " + window + " at "         + (i+1) + " of " + mWindows.size() + " (after " + pos + ")");
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android