AndroidStudio:“可调试”有什么作用?

dsd*_*dsd 6 debugging android android-studio build.gradle

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

// build.gradle
android
  {         
    buildTypes
      {
        debug
          { debuggable true
          }       
      }
  }
Run Code Online (Sandbox Code Playgroud)

能不使用仿真器(genymotion)进行调试:断点工作; Log.d(...)输出到 Android Monitor的语句;

由于debuggable标志位于debug部分内,因此无论如何似乎都是多余的。它不应该在该buildTypes部分之外,向ide指示debug应该使用构建类型吗?


debugrelease构建类型 之间的区别进行一些简单的外行一般背景理解也会很好。

fad*_*den 6

在 Android 上,调试器使用JDWP与虚拟机通信。启用调试后,VM 会创建一个专用线程来侦听 JDWP 流量并响应请求。(也可以使用本机调试器,例如 gdb,但那是另一种鱼。)

在出售给消费者的设备上,通常不需要运行额外的线程,因此默认情况下应用程序不可调试。此外,恶意软件可能会使用调试器界面来检查或操纵正在运行的应用程序,因此禁用它是最安全的。另一方面,在模拟器上运行的任何东西都应该是可调试的,所以那里的默认行为是不同的。该ro.debuggable系统属性确定该(adb shell getprop ro.debuggable)。

debuggable应用清单中的标志告诉 VM 应用正在开发中,无论应用是否在生产设备上运行,都应该允许来自调试器的连接。

以上所有内容都与应用程序的运行时行为有关,而不是构建。调试版本也不同于发布版本。将-g标志传递给javac会导致输出附加信息,并且有一些dx选项可以去除或保留.dex文件中的附加调试信息。(我不知道 gradle 标志如何与这些交互。)


Lar*_*fer 1

它会导致 Android gradle 插件在生成时在应用程序清单中包含可调试标志。这允许调试器在模拟器或设备上运行时附加到应用程序。