在我的代码中使用Log.d()或Log.e()

8
我在我的安卓应用程序中一直使用Log.d()Log.e()来进行调试。我想知道如果我这样发布应用程序,用户会看到我放置的所有调试语句吗?即使他们连接了adb logcat,我是否需要采取特殊措施以防止用户查看调试日志?谢谢。
8个回答

7

1
您所提到的博客文章已被删除,连同整个博客一起删除。作者说:“所以我决定从零开始。新内容,新博客引擎和新设计。” - Tjaart
1
谢谢,我已经用存档版本替换了链接。 - Krylez
谢谢。在发布我的应用程序之前,我正在学习更多关于日志记录的知识。这篇文章非常有帮助。 - Tjaart

4
考虑使用 isLoggable() 方法:
检查指定标签的日志记录级别是否可用于指定级别。默认情况下,任何标签的级别都设置为 INFO。这意味着会记录 INFO 及以上级别的所有内容。在调用任何日志记录方法之前,请检查您的标签是否应该记录。您可以通过设置系统属性来更改默认级别:setprop log.tag.<YOUR_LOG_TAG> <LEVEL> 其中 LEVEL 是 VERBOSE、DEBUG、INFO、WARN、ERROR、ASSERT 或 SUPPRESS。SUPPRESS 会关闭与标签相关的所有日志记录。您还可以创建一个 local.prop 文件并在其中添加以下内容:log.tag.<YOUR_LOG_TAG>=<LEVEL>, 然后将其放置在 /data/local.prop 目录下。
个人建议,在发布阶段应该使用 Proguard 删除调试日志,只保留错误日志。
最好使用以下方式进行包装:
public class MyLog {

public static void d(String tag, String msg) {
   if (Log.isLoggable(tag, Log.DEBUG)) {
       Log.d(tag, msg);
}
}

public static void i(String tag, String msg) {
    if (Log.isLoggable(tag, Log.INFO)) {
     Log.i(tag, msg);
}
}  // and so on... 

您可以通过发出adb命令来设置日志级别


谢谢。您能帮我们理解 isLoggable() 的用法吗?我有这样的代码 Log.d(MYTAG, "debug statement"); 要使用 isLoggable(),这是否意味着我需要在每个地方都写 'if isLoggable(MYTAG, Log.DEBUG) { Log.d(MYTAG, "debug statment"); '? - michael
我修改了我的答案。Krylez的解决方案是最好的,这只是另一种选择。 - Reno

4

用户(或任何具有日志访问权限的应用程序)不仅可以查看您的日志,而且您的日志还会使您的应用程序运行变慢并使用更多的电池电量。

编写日志,特别是从Java中编写,可能比您想象的要昂贵得多:仅在Java中构建字符串就需要很多工作。


谢谢。我阅读了这篇文章:http://android-developers.blogspot.com/2010/09/proguard-android-and-licensing-server.html,学习如何在我的Android项目的build.xml文件中使用Proguard。但是它没有说明如何使用Proguard去除所有对Log.d和Log.e的调用。请问您能告诉我如何做到这一点吗? - michael

1

市场上有一些应用程序,即使没有连接开发环境,也允许用户查看日志。

CatLog 是我个人使用过的一个应用程序,它可以显示所有内容。

在我的应用程序中,我创建了一个包装类,可以通过布尔标志自行关闭。它还具有 TAG 参数在我的代码中通用的附加优点。

public class QLog {
    private static final String TAG = "MyAppTag";
    private static final boolean DEBUG_MODE = true;

    public static void d(String msg) {
        if(DEBUG_MODE) {
            Log.d(TAG, msg);
        }
    }
    ...
}

1

1

正如在android.developer.com中所说:

当您构建要传递到Log.d的字符串时,编译器使用StringBuilder,并且至少发生三个分配:StringBuilder本身,缓冲区和String对象。实际上,还会进行另一个缓冲区分配和复制,甚至对gc施加更大的压力。这意味着,如果您的日志消息被过滤掉,您可能正在执行重要的工作并承担重大开销。

这是链接: http://developer.android.com/reference/android/util/Log.html


0
如果您的用户是开发人员,并将设备连接到开发机器并打开 LogCat,则如果他与该应用程序交互,他将在 Logcat 上看到所有日志。当您要将应用程序发布给最终用户时,应删除这些日志。

那么,如果我构建一个“发布”版本,它不会自动执行Log.d()吗? - michael

0

日志记录指南

Log.v(String tag, String msg) (verbose)
Log.d(String tag, String msg) (debug)
Log.i(String tag, String msg) (information)
Log.w(String tag, String msg) (warning)
Log.e(String tag, String msg) (error)

To only show logs on debug builds:

if (BuildConfig.DEBUG) Log.d(TAG, "The value of x is " + x);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接