我想知道debuggable true
语句的作用是什么:
// build.gradle
android
{
buildTypes
{
debug
{ debuggable true
}
}
}
我可以在没有模拟器的情况下进行调试(genymotion):断点工作;输出到android监视器的
Log.d(...)
语句;因为
debuggable
标志在debug
部分中,所以它似乎是多余的。它不应该在buildTypes
部分之外,向ide指示应该使用debug
构建类型吗?对于
debug
和release
构建类型之间的区别,获得一些简单的一般背景知识也是很好的。 最佳答案
在android上,调试器使用JDWP与虚拟机通信。启用调试后,vm将创建一个专用线程,该线程侦听jdwp通信量并响应请求。(也可以使用本地调试器,如gdb,但这是另一回事。)
在卖给消费者的设备上,通常不需要运行额外的线程,因此默认情况下,应用程序是不可调试的。此外,恶意软件可能使用调试器接口来检查或操作正在运行的应用程序,因此禁用它是最安全的。另一方面,在模拟器上运行的任何东西都应该是可调试的,因此默认行为是不同的。ro.debuggable
系统属性决定了这一点(adb shell getprop ro.debuggable
)。
应用程序清单中的debuggable
标志告诉vm应用程序正在开发中,无论应用程序是否在生产设备上运行,都应允许来自调试器的连接。
以上所有内容都与应用程序的运行时行为有关,而与生成无关。调试版本也不同于发布版本。将-g
标志传递到javac
将导致输出附加信息,并且有dx
选项将在.dex
文件中删除或保留附加调试信息。(我不知道梯度旗是如何与这些东西相互作用的。)