【问题标题】:'Source code does not match the bytecode' when debugging on a device在设备上调试时“源代码与字节码不匹配”
【发布时间】:2017-02-20 19:00:43
【问题描述】:

我有一个针对 API 级别 21 编译的应用程序:

然后在具有 API 级别 23 的真实设备上对其进行调试:

问题是当我尝试通过 Android 操作系统自己的类进行调试时,我得到“源代码与字节码不匹配”。为什么会这样?应用程序运行的测试设备是 API 级别 23,被调试的源文件也是级别 23。

我真的很困惑。谁能解释我为什么会看到此消息以及如何修复它?

【问题讨论】:

  • 看起来您设备中的 apk 比当前代码旧或不同。我知道这很明显,但您是否尝试卸载该应用一次并重新安装?
  • 似乎该错误与您的 IDE 的 Intellij IDEA 插件有关。我可以在这里找到报告的错误confluence.jetbrains.com/display/IDEADEV/…。你能通过那个吗?
  • @Akash 我试过了。但我正在调试的文件是 Android 操作系统 (ContentResolver) 的一部分,而不是我的应用程序。
  • @FebiMathew 谢谢。它可能与 IDEA-159697 相同。这是 vanilla IntelliJ IDE 中的修复程序。我如何知道此修复程序出现在哪个 Android Studio IDE 版本中?

标签: java android android-studio android-debug android-6.0.1-marshmallow


【解决方案1】:

如果清理、重建、无效缓存和重启等技术不起作用,请尝试删除之前的 APK 并重新安装新的 APK。

【讨论】:

    【解决方案2】:

    这发生在我不小心多次添加同一个库时。

    implementation 'androidx.appcompat:appcompat:1.1.0'
    

    上述库被多次添加。

    【讨论】:

      【解决方案3】:

      这些是对我有用的步骤(适用于 Mac 和 Windows):

      1. 点击“文件”
      2. 点击“使缓存失效/重新启动...”
      3. 选择:“无效并重新启动”

      注意:小项目不到一分钟,但由于我的项目很大(大约一百万行代码),所以需要 20 分钟。

      【讨论】:

        【解决方案4】:

        这就是为什么我收到此错误“源代码与字节码不匹配”的原因。我的原因与任何API,编译器版本无关.....这是由于将布局视图膨胀为根视图而我错误地在其他地方启动了膨胀器(“结果处理程序”放在android应用程序代码的onCreate函数之上的代码)。当设置断点并在此处停止时,调试器不知何故没有给我正确的提示(例如,充气机未初始化或有实例)。

        【讨论】:

          【解决方案5】:

          所以我创建了一个帐户,以便帮助解决这个困扰很多人的问题,并且上面的修复方法不起作用。

          如果您收到此错误,但这里没有任何帮助。尝试单击“恢复程序播放按钮”,直到程序完成错误。然后点击调试旁边的控制台标签,阅读红色文字。

          即使我的问题是尝试将值插入空数组,我也收到了源代码错误。 Step 1 Click the resume button

          Step 2 Click the console tab and read the red text

          【讨论】:

          • 这看起来可能是一个很好的答案!这篇文章中的其他人添加了屏幕截图,以帮助阐明需要采取哪些 GUI 操作。 Resume program play button 周围带有红色框/箭头的屏幕截图在这里可能很有用。
          • 我添加了一些图片来提供帮助。不知道如何让它们显示,但它们在链接中我没有足够的代表来发布图像,所以链接必须这样做。
          【解决方案6】:

          有一个open issue for this in Google's IssueTracker

          问题中给出的潜在解决方案(截至本文发布之日)是:

          • 点击构建 -> 清理
          • 在设置 -> 构建、执行、部署中禁用即时运行

          【讨论】:

          • 禁用 Instant Run 或此链接中的任何其他解决方案都不适合我。
          • @mister270 你找到其他解决方案了吗?我再也没有遇到过这个问题,所以我很难在这里调试它并扩展我的答案。
          • 我提高了最低 sdk 并进行了干净的重建,使问题“消失”。但是我对这个解决方案并不满意,因为我想要一个旧的 min sdk。
          • 以上解决方案都不适合我。我什至没有找到即时运行选项。使用 INteelij 进行调试非常烦人。每次更改代码后,我都必须进行全新安装。
          【解决方案7】:

          这是我的解决方案:

          如果您有多个库版本,这可能会有所帮助。

          1. 在 lib 源代码上设置断点
          2. 让代码运行到断点
          3. 你会得到这些提示

          1. 点击箭头图标

          2. 你会得到这个

          3. 双击选择正确的库(通常最高版本的库是正确的)

          我误点击了“禁用”按钮,你可以在调试器设置中启用它

          如果你没有第三步的提示,也许你可以检查一下你是否检查了设置选项

          【讨论】:

          • 替代来源已启用,但不显示。没有下拉菜单(是的,我安装了 4 个不同的 API 级别)。
          • 在一个 gradle 项目中,这没有帮助,我只是暂时从项目模块中删除了错误的库,这有帮助,除了在正确的类中使用 drop to frame 的断点!
          【解决方案8】:

          你可以创建 AVD,选择 API Level 等于你的 tagetApi 和 compileApi,它对我有用。

          【讨论】:

            【解决方案9】:

            我的应用程序在 API LEVEL 29 上编译,但在 API LEVEL 28 上在真实设备上调试。我在 AndroidStudio 中收到警告 source code does not match the bytecode。我通过以下步骤修复了它:

            1. 转到首选项>即时运行:取消选中即时运行

            2. 转到构建>清理构建

            3. 重新运行应用

            现在,调试运行正常。

            【讨论】:

              【解决方案10】:

              我尝试了这里给出的所有解决方案,但没有一个对我有用。在 2019.1.3 版本中,我只是清理并重建了工件,它就起作用了;先做Build -> Build Artifacts... -> <select your artifact> -> Clean,然后在同一个地方点击BuildRebuild

              【讨论】:

                【解决方案11】:

                我在开发使用蓝牙低功耗 (BLE) 的应用程序时尝试了此处提供的解决方案。我试过了,

                1. 干净的构建
                2. 已禁用即时运行
                3. 使缓存无效/重新启动

                所有这些都失败了。

                我所做的是调试我认为收到警告的点,我仍然收到警告但应用程序运行正常。您可以忽略警告。

                【讨论】:

                  【解决方案12】:

                  如果您启用了 ProGuard,也会发生这种情况。在 buildTypes 中设置 minifyEnabled 为 false,shrinkResources 为 false,useProguard 为 false

                  【讨论】:

                    【解决方案13】:

                    我遇到了同样的问题并找到了解决方案。如果你有一个标记为红色的行,它会给你这个错误,但如果你取消标记所有的行,它会正常工作。

                    标记是指当您单击左侧行号所在的位置并突出显示该行时。 如果不清楚,这里有图片。
                    从...来: flagged line 到: not flagged line

                    【讨论】:

                      【解决方案14】:

                      Android Studio 在您的应用程序中采用与目标版本相同的源版本。使用等于上述编译版本的源版本执行编译。因此,请注意在您的项目中编译版本 == 目标版本(调整模块的 build.gradle 文件)。

                      【讨论】:

                        【解决方案15】:

                        您应该使用与 compileSdkVersion 具有相同 api 级别的 Android 模拟器。 在您的情况下,您应该使用 API 级别为 21 的 Android 模拟器。

                        【讨论】:

                        • 这对我有用。我的设备是 API 22,因此将 compileSdkVersion 设置为 22 即可解决问题。
                        • 也为我工作。我在使用 Android 8.1.0 (API 27) 的物理设备上,我的计算机只安装了 API 30 的源。切换到具有 API 30 的模拟器解决了它。 (compileSDKVersion 现在匹配设备版本)
                        【解决方案16】:

                        此错误消息可能有多个原因,我的情况与 OP 中的情况不同,在我的情况下,这是由于需要额外库的第 3 方库。

                        例如:您手动将 X.jar 添加到您的 LIB,但此 X.jar 需要 Z.jar 才能工作。

                        我花了一些时间才弄清楚,这条消息根本没有帮助。我必须调试应用程序,直到遇到崩溃类,并在该类中确保所有导入都得到满足。

                        (特别是:我添加了 MercadoLibre-0.3.4.jar,需要 commons-httpclient.jar)

                        希望这会有所帮助!

                        【讨论】:

                          【解决方案17】:

                          如果你使用 Gradle,那可能是 Gradle 缓存的问题。 (Reference)。唉,即使你跑了

                          gradle --refresh-dependencies
                          

                          ,它并没有真正刷新所有依赖项。一些垃圾残留。 (Reference)。

                          所以,最确定(但激烈且冗长)的变体是从 [user]/.gradle/caches 中清除所有内容。或者在那里找到您的问题项目并仅清除其缓存。

                          【讨论】:

                            【解决方案18】:

                            转到项目设置 > 工件。选择有问题的工件。有一个选项“包含在项目构建中”。这需要检查(启用)。对于旧版本的 IntelliJ,此选项为“Make on build”。

                            【讨论】:

                              猜你喜欢
                              • 2017-06-29
                              • 2018-01-30
                              • 1970-01-01
                              • 2020-12-12
                              • 2019-01-16
                              • 1970-01-01
                              • 1970-01-01
                              • 2015-12-05
                              相关资源
                              最近更新 更多