我正在尝试调试我的 Android 应用程序。当调试器到达 View.java 文件时,我收到消息“源代码与字节码不匹配”。我可以看到调试器位于文件的错误部分。有谁知道如何解决这个问题吗?
我正在 Android 10 (API 29) 设备上进行调试。在 Android Studio 首选项 -> 外观和行为 -> 系统设置 -> Android SDK 中,我已确保所有内容都是最新的。我还多次清理和重建,删除缓存,重新启动 Android Studio 和设备,卸载/重新安装,将 Android Studio 更新到 4.0.1。在模块设置中,“编译 Sdk 版本”为 29,目标 SDK 版本和最小 SDK 版本为 29。没有任何帮助或没有任何效果。类似的帖子中建议了其中的许多步骤。
它尝试打开的 View.java 文件位于:~/Library/Android/sdk/sources/android-29/android/view/View.java。这应该是正确的文件,但当我收到错误消息时,调试器位于文件的错误部分。
戴上我的黑帽子,让我们假设我的笔记本电脑的 View.java 对于该 API 级别是正确的:我的手机是否可以运行非标准代码,有什么方法可以检测或排除它吗?
最佳答案
我想我已经弄清楚发生了什么,并且当 Android SDK 文件发生此问题时,我已经找到了解决方案。可怕的是,Android SDK Platform更新到了Revision 5,但是源码包却没有更新。目前仍处于修订版 1!为什么会发生这种情况,我无法解释:一个理性的人会期望两者同步。此屏幕截图显示源代码与 Android Studio 下载的二进制文件不匹配:
解决此问题的唯一方法是手动下载所需的文件并在 SDK 源目录中手动修补它们。它很难看,也没有必要,但如果您确实想单步执行特定的 SDK 文件,则必须这样做。
了解您拥有的 Android 版本。在您的设备上,转到“设置”->“关于手机”->“Android 版本”,然后记下“版本号”值。我的是QQ3A.200805.001。
使用此页面查找与您的内部版本号相对应的标签:https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds 。对于我的内部版本号,标签是:android-10.0.0_r41
下载此标签的 AOSP 源代码。如果您是第一次这样做,这需要很长时间。请参阅https://stackoverflow.com/a/14353644/259718有关如何执行此操作的示例。
复制文件以覆盖部分源目录: cp -pr ~/android_src/frameworks/base/core/java/android/* ~/Library/Android/sdk/sources/android-29/android/(使用适合您环境的正确位置,这里我使用 android-29 进行编译)
虽然并非 android 源文件夹中的所有目录都被覆盖,但核心 android 文件会被覆盖。这些构成了大部分源 Material 。如果您需要其他目录(例如“filterpacks”),则必须在其他 AOSP 目录中找到该目录(例如“filterpacks”的 Frameworks/base/media)。
以下是我获取一个单独文件所遵循的步骤:
- 在 https://android.googlesource.com 上查找您需要的文件。使用 google.com,我在以下位置找到了它:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java
- 确定您的文件所在的 Android 存储库。查看前面的 URL,我可以推断出它位于: https://android.googlesource.com/platform/frameworks/base/
- 使用您的标签获取该存储库。或者在线获取该标签对该单个文件的最新版本,例如:https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java ,修订版 18c0fbf。
- 要下载单个文件,请将“?format=text”添加到 URL 以获取 Base64 编码版本。然后解码:cat file | base64 --解码。
- 现在您已经有了文件。转到包含错误文件的 SDK 目录:cd ~/Library/Android/sdk/sources/android-29/android/view/
- 如果需要,请备份旧文件 (cp -pr View.java View.java.orig)(如果搞砸了,您可以随时重新安装 SDK 源文件)。将新文件复制到同一位置。
- 现在,您的调试器将使用正确的文件!您必须对调试器提示的每个文件执行此操作。
我希望这对将来的其他人有帮助。我花了很多时间来解决这个问题,我真诚地希望其他人不必浪费这些时间。 Google 需要保持源包与发布包一致。纵观过去的所有 SDK 版本,没有一个源码包与最新版本同步。也许调试 SDK 文件的另一种丑陋方法是使用与 Revision #1 源包匹配的 Revision #1 SDK 发行版本。
关于java - 源代码与 Android 的 View.java 的字节码不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63556563/