我想确切知道debuggable true
语句的作用:
// build.gradle
android
{
buildTypes
{
debug
{ debuggable true
}
}
}
我我能够使用模拟器(genymotion)进行调试:断点有效; Log.d(...)
语句输出到Android监视器;
由于debuggable
标志里面 debug
部分,所以无论如何它似乎都是多余的。它不应该在buildTypes
部分之外,向ide表明应该使用debug
构建类型吗?
让一些简单的外行人了解debug
和release
buildtypes之间的差异,这也很不错。
答案 0 :(得分:4)
在Android上,调试器使用JDWP与虚拟机进行通信。启用调试后,VM将创建一个专用线程,用于侦听JDWP流量并响应请求。 (它也可以使用本机调试器,例如gdb,但这是一个不同的鱼。)
在销售给消费者的设备上,通常不需要运行额外的线程,因此默认情况下应用程序不可调试。此外,恶意软件可能会使用调试器界面来检查或操作正在运行的应用程序,因此禁用它是最安全的。另一方面,在模拟器上运行的任何东西都应该是可调试的,因此默认行为是不同的。 ro.debuggable
系统属性决定了这一点(adb shell getprop ro.debuggable
)。
应用程序清单中的debuggable
标志告诉VM该应用程序正在开发中,无论应用程序是否在生产设备上运行,都应允许来自调试器的连接。
以上所有内容都与应用程序的运行时行为有关,而不是构建。调试版本也与发布版本不同。将-g
标志传递给javac
会导致输出其他信息,并且dx
个选项将删除或保留.dex
文件中的其他调试信息。 (我不知道gradle标志如何与这些标志相互作用。)
答案 1 :(得分:1)
它会导致Android gradle插件在生成时在应用程序清单中包含debuggable标志。这允许调试器在模拟器或设备上运行时附加到应用程序。