我想知道debuggable true语句的作用是什么:

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

我可以在没有模拟器的情况下进行调试(genymotion):断点工作;输出到android监视器的Log.d(...)语句;
因为debuggable标志在debug部分中,所以它似乎是多余的。它不应该在buildTypes部分之外,向ide指示应该使用debug构建类型吗?
对于debugrelease构建类型之间的区别,获得一些简单的一般背景知识也是很好的。

最佳答案

在android上,调试器使用JDWP与虚拟机通信。启用调试后,vm将创建一个专用线程,该线程侦听jdwp通信量并响应请求。(也可以使用本地调试器,如gdb,但这是另一回事。)
在卖给消费者的设备上,通常不需要运行额外的线程,因此默认情况下,应用程序是不可调试的。此外,恶意软件可能使用调试器接口来检查或操作正在运行的应用程序,因此禁用它是最安全的。另一方面,在模拟器上运行的任何东西都应该是可调试的,因此默认行为是不同的。ro.debuggable系统属性决定了这一点(adb shell getprop ro.debuggable)。
应用程序清单中的debuggable标志告诉vm应用程序正在开发中,无论应用程序是否在生产设备上运行,都应允许来自调试器的连接。
以上所有内容都与应用程序的运行时行为有关,而与生成无关。调试版本也不同于发布版本。将-g标志传递到javac将导致输出附加信息,并且有dx选项将在.dex文件中删除或保留附加调试信息。(我不知道梯度旗是如何与这些东西相互作用的。)

07-27 13:41