Log.d()
和Log.e()
来进行调试。我想知道如果我这样发布应用程序,用户会看到我放置的所有调试语句吗?即使他们连接了adb logcat,我是否需要采取特殊措施以防止用户查看调试日志?谢谢。Log.d()
和Log.e()
来进行调试。我想知道如果我这样发布应用程序,用户会看到我放置的所有调试语句吗?即使他们连接了adb logcat,我是否需要采取特殊措施以防止用户查看调试日志?谢谢。有时,保留日志记录语句可能非常糟糕: http://web.archive.org/web/20121222023201/http://vbsteven.com/archives/535
您可以使用ProGuard自动删除它们:
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** e(...);
}
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
目录下。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命令来设置日志级别。
用户(或任何具有日志访问权限的应用程序)不仅可以查看您的日志,而且您的日志还会使您的应用程序运行变慢并使用更多的电池电量。
编写日志,特别是从Java中编写,可能比您想象的要昂贵得多:仅在Java中构建字符串就需要很多工作。
市场上有一些应用程序,即使没有连接开发环境,也允许用户查看日志。
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);
}
}
...
}
在开发时可以使用它们。发布时,最好删除或混淆消息以保护PII(个人身份信息)。这里的答案非常有用:Android Log.v(),Log.d(),Log.i(),Log.w(),Log.e() - 何时使用每个?
这里有一个教你如何处理发布软件时的日志工具。发布前删除所有调试日志调用:是否有相应工具?
正如在android.developer.com中所说:
当您构建要传递到Log.d的字符串时,编译器使用StringBuilder,并且至少发生三个分配:StringBuilder本身,缓冲区和String对象。实际上,还会进行另一个缓冲区分配和复制,甚至对gc施加更大的压力。这意味着,如果您的日志消息被过滤掉,您可能正在执行重要的工作并承担重大开销。
这是链接: http://developer.android.com/reference/android/util/Log.html
日志记录指南
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);