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

use*_*447 12 performance android

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"));
}
Run Code Online (Sandbox Code Playgroud)

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

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

She*_*lum 12

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

public static void debug(String tag, String msg) {
    if (BuildConfig.DEBUG) {
        Log.d(tag, msg);
    }
}
Run Code Online (Sandbox Code Playgroud)


ran*_*dom 6

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

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