【问题标题】:Android studio shows sources from API of compileSdkVersion when debugging on device with older API在使用较旧 API 的设备上进行调试时,Android Studio 会显示来自 compileSdkVersion API 的源代码
【发布时间】:2015-02-24 15:14:49
【问题描述】:

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

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

知道为什么 A.S 会显示错误的文件版本吗?

我尝试过的事情(按顺序):

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

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

【问题讨论】:

  • 我想找到一个解决方案,其中compileSdkVersion 设置为 21,Android Studio 在 API 级别 19 设备上调试时会自动显示正确的源。我根本不想切换 compileSdkVersion,因为我的构建应该针对 API 级别 21。

标签: android api debugging android-studio


【解决方案1】:

Link to issue 跟踪此问题。

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

【讨论】:

  • 这不适用于 2.3.3。也许它被丢弃了,或者就像时差大脑一样,它只是不起作用。
  • 是的,它在 AS 3.4.2 上也不起作用 有时他们让我抓狂,当还有很多 bug 时他们会引入新功能!
  • 在 Logcat 视图中单击时仍然不会跳转到正确的源。
  • 在新的闪亮北极狐 2020.3.1(新版本编号方案)中仍然无法正常工作。只显示编译后的 SDK 版本的源代码。
【解决方案2】:

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

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

完成此操作后,就是下断点的好时机。

此解决方案假设您已从 SDK 管理器安装了两个 API 级别的源代码。

【讨论】:

  • 这是个好主意。这也应该适用于 Logcat(截至 Android Studio 4.0.1 版仍未修复)。
【解决方案3】:

在这里回答了有效的解决方案:

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

全部内容:

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

如果您针对版本 21 进行调试,这可以正常工作。但是当您在 Jelly Bean (API 17) 上进行调试时,您的调试器会不断将您转到 API 21 源代码。非常烦人且难以调试。

我最终使用的解决方案非常老套,但很有效!假设您正在尝试针对 API 17 进行调试。请执行以下操作:

  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 以便它选择正确的路径。
  4. 调试

完成后不要忘记将所有目录放回原处。

以下是有关此问题的 android studio 错误报告: https://code.google.com/p/android/issues/detail?id=183976

【讨论】:

【解决方案4】:

在 Intellij Idea(基于它的 Android Studio)中打开您的项目并选择File -> Project Structure...。在项目设置中,将“项目 SDK”选择为您需要调试的版本,并为所有项目模块选择“项目 SDK”作为模块 SDK。之后,您可以将调试连接附加到您的设备/模拟器并查看正确的 Android 源代码。

您无需在 Intellij Idea 中构建项目。

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多