【问题标题】:Android Studio steps into wrong sdk sourceAndroid Studio 步入错误的 sdk 源
【发布时间】:2020-05-23 21:36:04
【问题描述】:

我有以下 build.gradle 设置。

compileSdkVersion 21
buildToolsVersion '21.1.1'

defaultConfig {
    minSdkVersion 18
    targetSdkVersion 21
}

问题是,当我在 KitKat 设备(Genymotion 或 Device 上为 19)上进入 Android SDK 源时,它仍然坚持进入 Android-21 源而不是 19。

更改任何上述设置只会破坏我的应用程序的编译,因为我有 v21 代码。所有 19 个调用都得到了适当的保护,并且代码在 19 上工作,只是源代码链接不正确。

Stack Overflow 兄弟姐妹们提前干杯!

【问题讨论】:

  • 请检查您的 AndroidManifest.xml 文件并确保这些值也未在此处定义。有时 sdk 版本和构建工具也在清单中定义。
  • 我不认为这一定是受支持的。如果您想在 API 19 上进行调试,也许最简单的方法是(暂时)针对它进行构建。或者您可以尝试使用源目录中的符号链接来伪造它(即,指定 api 21 以便构建 jar 是正确的,但将它的源 jar 符号链接到 api 19 之一)或一些晦涩的 IDE 设置。 为什么需要追踪 Android 本身的源头? 这应该很少需要,请记住,很多功能位于 IPC 的另一端,您无法追踪无论如何。
  • @ChrisStratton :当您进入驻留在设备上的 android.jar(19) 时,您应该进入构建它的源代码,而不是构建我的应用程序的源代码反对。 “为什么要追溯安卓本身的源头?”一大堆理由。我每天至少两次进入 SDK(仅因为这个问题在 21 日)。现在我试图提供跨 sdk 支持,它们在后台运行不同。我想通过逐步了解原因。
  • 您希望调试器如何管理它?如果这是一个真实且紧迫的需求,而不是在调试器中低头,您可能会更好地查看源版本的差异 - 当然 假设 Android 实际安装在您的device 反映了上游源的相应版本。
  • @ChrisStratton 设备上的 android 是 AOSP,所以在我开始支持 v21 之前,它已正确进入源代码。我的调试器怎么知道 android.jar 是 v19?好问题....

标签: android debugging android-studio


【解决方案1】:

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


虽然 Android Studio 2.2 中的修复适用于公共/标准构建,但如果设备使用自定义构建(即他们对框架的某些部分进行了一些更改并为其分配了专有构建 ID),那么“修复”将找不到最匹配的来源。以下技术有助于获得与相应 API 级别更匹配的源版本:

  1. 编译应用程序而不做任何更改。
  2. 在调试模式下启动应用程序(并且可以选择在断点处中断)。
  3. 转到File > Project Structure,找到您的app 模块(或/和可选的任何其他模块)并将Compile Sdk Version 更改为与您正在调试的设备匹配的一个(即19) .
  4. 进入框架代码 - 它应该进入 SDK 19 源代码。

警告:这会导致 Studio 同步并重新评估您的代码,可能会导致问题。因此,暂时更改此设置可能会为您提供正确的源代码,但您可能必须将其更改回以下次构建。 (正如@Null Pointer 指出的那样)这是一种不完美但有用的技术。

【讨论】:

  • 虽然这可行,但如果您使用 appcompat 支持库,它会惨遭失败。
  • 很好的解决方法!或者您可以直接将 build.gradle 的“compileSdkVersion”修改为您的目标级别,然后单击同步,它会做同样的事情。 :)
  • 这会改变构建路径,问题是如何改变源路径,如果进入SDK源,您需要与目标设备匹配。
  • 它似乎不固定。我正在使用 AndroidStudio 2.3,但它仍然显示错误的文件。当我进入 View.java 时,它向我显示了来自 SDK API-25 的那个(作为我的 compileSdkVersion),但它正在运行到 API 23 设备中。
  • 这不起作用,它更改 build.gradle 并立即同步项目并关闭调试器,最终无法编译应用程序。这是完全错误的建议。
【解决方案2】:

正如另一个答案中提到的,它已在 Android Studio 2.2 (bug report) 中修复。

但是,即使在 Android Studio 3.0 中,它仍然不适合我 只有在我在“设置”中选中“显示替代源切换器”后它才开始工作。

screenshot

【讨论】:

  • 我使用的是 Android Studio 3.5.3,并且该选项已被选中。在具有 29 个编译目标的 API 21 设备上运行,调试器将我带到不匹配的 API 29 源并且不显示源切换器。该应用支持的所有来源均已安装。
  • 对我也没有帮助。
【解决方案3】:

如果您尝试在运行 android 5.0.x Lollipop 映像的模拟器上调试源代码会怎样?它是否突出显示了正确的来源?我也一直在努力解决这个问题,我得出的结论是问题是由于硬件供应商对 android 源的自定义。

我一直在尝试在运行 4.4.2 KitKat 的三星设备上单步调试 Android 源代码。有些文件排列得很好,有些文件错了几行,其余的则不正常。 Instrumentation.java 是我经常发现自己的一个。它偏离了 5 行左右。

那么为什么我认为供应商定制了android源?我在 ActivityThread.java 和 Instrumentation.java 中逐步完成了应用程序启动。即使源不对齐,调试器仍将正确执行。我在 grepcode.com 上交叉引用了我使用 android 源代码的例程。最终,我看到调试器进入了一个函数调用,该函数调用在 grepcode 上发布的任何版本的 java 文件中都不存在。

这里是一个具体的例子:ActivityThread.HandleLaunchActivity。我目睹了调试器进行这些调用

unscheduleGcIdler          : present in android source
intent.getWindowStyle      : not present. Samsung customization?
handleConfigurationChanged : present

如果我是对的,那么调试器应该正确地单步调试模拟图像,因为它不包含供应商自定义代码。

【讨论】:

  • 它是特定于供应商的构建,因此没有排队。我取得的最大成功是通过运行 5.0 的 Genymotion。 Genymotion 运行 AOSP,它完美地排列。当您不知道您的 ListView 正在做什么来搞砸示例的行视图时,它非常宝贵。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多