java - 源代码与 Android 的 View.java 的字节码不匹配

标签 java android android-studio

我正在尝试调试我的 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 下载的二进制文件不匹配:

mismatched source and sdk

解决此问题的唯一方法是手动下载所需的文件并在 SDK 源目录中手动修补它们。它很难看,也没有必要,但如果您确实想单步执行特定的 SDK 文件,则必须这样做。

  1. 了解您拥有的 Android 版本。在您的设备上,转到“设置”->“关于手机”->“Android 版本”,然后记下“版本号”值。我的是QQ3A.200805.001。

  2. 使用此页面查找与您的内部版本号相对应的标签:https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds 。对于我的内部版本号,标签是:android-10.0.0_r41

  3. 下载此标签的 AOSP 源代码。如果您是第一次这样做,这需要很长时间。请参阅https://stackoverflow.com/a/14353644/259718有关如何执行此操作的示例。

  4. 复制文件以覆盖部分源目录: 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/

    相关文章:

    java - 检查github上是否有游戏的新版本

    Java SVG Salamander 线性渐变未显示

    java - Android 健壮的线程架构?异步任务与线程/处理程序与服务/线程

    android - 从 Android Studio 停止 Android adb

    java - HTML 单元基础失败

    android - 如何将文件添加到 Android 项目,将其部署到设备,然后打开它?

    android - mp4 容器中的多路复用原始 h264

    android - 获取 HttpResponse 对象作为来自 Android 中的 Volley api 的响应而不是 jsonobject 或字符串

    java - Android:接听电话、向来电者播放音频、捕获来电者输入

    java - 如何将 $ 符号附加到指定宽度且右对齐的字段中的浮点值?