【问题标题】:Released app displays debug strings? [duplicate]发布的应用程序显示调试字符串? [复制]
【发布时间】:2025-12-24 06:50:06
【问题描述】:

可能重复:
Remove all debug logging calls before publishing: are there tools to do this?

也许我误解了这个概念,但调试日志消息不应该只显示在未发布的应用程序中吗?

我已经用“文件”-“导出”编译了我的应用程序,它应该删除由代码的“Log.d(..)”转储的所有消息。但是,当我在运行 Eclipse 的同时运行这个通过 USB 连接的版本时,我看到各种调试消息在 LogCat 中公开显示。

我现在有点担心 - 据我记得,ProGuard 应该在创建发布版本时自动调用,但它似乎将调试 cmets 留在了应用程序中(但其他方面似乎可以工作,因为函数名称已被混淆我也可以在 Logcat 中看到)。

【问题讨论】:

标签: android eclipse debugging


【解决方案1】:

发布版本不会自动删除日志。而且您不应该(推荐)手动删除它们,因为您需要在为下一个版本等开发时将它们添加回来......,

最推荐的方式是使用Proguard

它的作用是:将删除字节码中的日志,使其在源代码中可用。

实现或使用:

Remove all debug logging calls before publishing: are there tools to do this?

除了删除日志之外,proguard 还可以通过多种方式帮助优化您的应用。

http://proguard.sourceforge.net/

【讨论】:

  • 但据我所知,在 Eclipse 下创建发布版本时会自动调用 Proguard?
  • 但是它被禁用了。此外,您需要对其进行配置。或者至少知道基本配置做什么和不做什么
【解决方案2】:

它不会删除日志语句!!!您可以手动删除它们,并将其作为更新提交,以防您发布应用程序。

更好的方法是,创建一个类,如 Globals,并在其中放置一个标志,即 isDevelopement

public class Globals
{
    static boolean isDevelopment = 1;

    public static void log(String tag, String message)
    {
      if(isDevelopment==1)
         Log.d(tag,message);
    }
}

在每个有日志语句的地方,都可以这样称呼它

Globals.log("TAG", "MESSAGE");

这样,当您发布时,您只需将 isDevelopment 更改为 0。日志就会消失。在处理它时,只需将其更改为 1。

希望对你有帮助

【讨论】:

  • @nitinreddy 不推荐这种方法,因为这里的日志仍在创建中,但只是不显示。因此,不会有任何性能提升。它只是为了避免显示日志。虽然问题只是关于显示,但最好使用最好的解决方案。
  • 你错了。日志不是一开始就写的。它不是关于展示,而是关于写作。
【解决方案3】:

我想我找到了问题的原因 - 我有

-assumenosideeffects class android.util.Log {
   public static *** d(...);
   public static *** i(...);
   public static *** v(...);
}

在我本地的 proguard-project.txt 中,但尽管有一行

proguard.config=${sdk.dir}\\tools\\proguard\\proguard-android-optimize.txt:proguard-project.txt

在我的 project.properties 文件中,proguard-project.txt 似乎从未因任何原因被使用过。 我已将日志删除参数添加到我的 proguard-android-optimize.txt 中,它现在可以工作了,导出应用程序时会删除日志。

【讨论】: