AndroidStudio:什么可以调试'做?

时间:2016-05-10 16:17:14

标签: android debugging android-studio build.gradle

我想确切知道debuggable true语句的作用:

// build.gradle
android
  {         
    buildTypes
      {
        debug
          { debuggable true
          }       
      }
  }

能够使用模拟器(genymotion)进行调试:断点有效; Log.d(...)语句输出到Android监视器;

由于debuggable标志里面 debug部分,所以无论如何它似乎都是多余的。它不应该在buildTypes部分之外,向ide表明应该使用debug构建类型吗?

让一些简单的外行人了解debugrelease buildtypes之间的差异,这也很不错。

2 个答案:

答案 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标志。这允许调试器在模拟器或设备上运行时附加到应用程序。