为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ibeautiful 2019-07-01 11:06:32
在将应用程序发布到GooglePlay之前,如何删除所有调试日志调用?根据谷歌的说法,我必须“禁用源代码中对日志方法的任何调用“在发布我的Android应用程序之前,摘录自出版清单:在生成要发布的应用程序之前,请确保禁用日志记录并禁用调试选项。您可以通过删除源文件中对日志方法的调用来禁用日志记录。我的开源项目很大,每次发布时手工操作都很痛苦。此外,删除日志行可能很棘手,例如:if(condition)   Log.d(LOG_TAG, "Something");data.load();data.show();如果我对Log行进行注释,则条件将应用于下一行,而LOAD()不被调用。这样的情况是否很罕见,以至于我可以决定它不应该存在?这是在官方的清单上,所以我想很多人经常这样做。那么,如何有效而安全地删除所有的日志线路呢?
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

我发现一个更容易的解决办法是忘掉所有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。


查看完整回答
反对 回复 2019-07-01
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

我建议在某个地方设置一个静态布尔值,指示是否进行日志记录:

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 + ")");


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 647 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信