Android的调试日志在运行时真的被剥离了吗?

时间:2013-03-06 03:30:19

标签: android performance

Android文档(http://developer.android.com/reference/android/util/Log.html)说:

  

除了在开发期间,不应将详细编译到应用程序中。调试日志在运行时编译但被剥离。始终保留错误,警告和信息日志

我刚做了一个测试。在我的活动中,我写道:

private static String test(String what) {
    Log.e("test", "I am called with argument: " + what);
    return what;
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.v("test", "log level: " + test("v"));
    Log.d("test", "log level: " + test("d"));
    Log.i("test", "log level: " + test("i"));
    Log.w("test", "log level: " + test("w"));
    Log.e("test", "log level: " + test("e"));
}

我将我的项目导出为apk文件,然后我在手机上安装了这个apk。我在手机上运行这个应用程序,然后查看了日志。在那里,我看到函数测试被调用了五次,并且对Log.something函数的所有五次调用都导致其文本被写入日志。

Log.d调用在运行时是否真的被剥离了?

3 个答案:

答案 0 :(得分:12)

没有。你必须自己做。您可以像这样制作自己的Log.d包装器:

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

答案 1 :(得分:6)

此问题已报告here,并于2012年3月在ADT 17.0.0中提供了解决方案

  

添加了一项功能,允许您仅在调试模式下运行某些代码。 Builds现在生成一个名为BuildConfig的类,其中包含一个DEBUG常量,该常量根据您的构建类型自动设置。您可以检查代码中的(BuildConfig.DEBUG)常量以运行仅调试函数。

答案 2 :(得分:0)

删除日志的最佳方法可能是ProGuard

检查此问题 'Android Proguard, removing all Log statements and merging packages'