Android Studio在使用旧API的设备上进行debugging时会显示来自compileSdkVersion的API的信息

我正在用Android Studio(AS)1.0.2进行debugging,在build.gradle中设置了compileSdkVersion 21。 当使用模拟器与API 21一切正常。 在具有API 19的设备上debugging时会出现问题。调用堆栈中的每一行(在AS中标记为“Frames”)都正确显示了与API 19匹配的函数名称,源文件和行号。但是,当我单击与其中一个框架源(例如Activity.java)相对应的行,AS不正确地打开并显示该文件的API 21版本而不是API 19版本。

在我的android sdk文件夹中,我有./sources/android-19和./sources/android-21

任何想法为什么AS显示文件的错误版本?

我尝试的东西(按顺序):

  • 重置Android Studio(通过删除〜/ .AndroidStudio *)
  • 将Android Studio更新到最新版本
  • 在带有API 21的仿真器上运行 – AS显示文件的正确版本(21)。
  • 将compileSdkVersion更改为19并在API 19设备上运行 – AS在调用堆栈中显示正确的行号,并在正确的行中打开正确的文件(API 19)。
  • 将compileSdkVersion更改为19并在API 21仿真器上运行 – AS在调用堆栈中显示对应于API 21的行号(在我看来,这是正确的行为),但是当点击它时,AS错误地打开了API 19版本的文件而不是API 21版本。

总而言之,当单击调用堆栈AS中的一行时,在debugging会话期间打开由compileSdkVersion表示的文件版本,而不是由设备/仿真器使用的文件版本。

在此解答工作解决scheme:

https://stackoverflow.com/a/32236703/1267536

完整内容:

我使用appcompat支持库相当多。 更改compileSdkVersion只会导致大量的编译错误。 如果您使用的是appcompat-21,则必须针对api 21进行编译,否则会出现编译错误。

如果您正在针对版本21进行debugging,此工作正常。但是,当您在Jelly Bean(API 17)上进行debugging时,您的debugging器将不断调用API 21源。 非常烦人,很难debugging。

我最终使用的解决scheme是非常hacky,但工作! 假设您正在尝试使用API​​ 17进行debugging。请执行以下操作:

  1. mv $ ANDROID_HOME / sources / android-21 $ ANDROID_HOME / sources / android-21-orig
  2. cp $ ANDROID_HOME / sources / android-17 $ ANDROID_HOME / sources / android-21
  3. 重新启动android studio,所以它会拿起正确的path。
  4. debugging

完成后不要忘记把所有的目录放回去。

这里是关于这个问题的android studio错误报告: https : //code.google.com/p/android/issues/detail?id=183976

在Intellij Idea(基于它的Android Studio)中打开项目并selectFile -> Project Structure... 在项目设置中select需要debugging的版本“project SDK”,select所有项目模块“project SDK”作为模块SDK。 之后,您可以将debugging连接附加到您的设备/模拟器,并看到适当的Android源。

您不需要在Intellij Idea中创build项目。

更改SDK中源文件的文件夹名称。 例如,您针对API级别23进行了编译,但是您正在testing和debugging的设备是API级别15.然后首先在debugging模式下编译并运行它,设置一个断点。 之后切换名称:

 $SDK_HOME$/sources/android-23/ -> $SDK_HOME$/sources/android-23-temp/ $SDK_HOME$/sources/android-15/ -> $SDK_HOME$/sources/android-23/ 

当这个完成的时候,这是一个打破断点的好时机。

此解决scheme假设您已经从SDKpipe理器安装了两个API级别的源。

尝试在真实设备上debugging您的应用程序,并使用设备的SDK级别进行编译。 调用堆栈中的行号可能会与设备提供的类“不同步”。

Android Studio无法可靠地为您的正在运行的设备提供正确的来源。 即使考虑到您正在debugging的设备的SDK版本,设备的固件也可以(并且可以)仍然从不同的源文件编译,并且只与API兼容。

我想这就是为什么Android Studio只显示目标设备提供的类的编译SDK版本。 它只是显示了编译器的参考实现。

链接到问题跟踪这个问题。

Android Studio 2.2修复了它,并且会跳转到与您实际运行的设备相对应的API级别的源(只要您安装了这些源)。 这是在这里宣布的。