在设备上调试时出现“源代码与字节码不匹配”

'Source code does not match the bytecode' when debugging on a device

提问人:Crocodile 提问时间:10/12/2016 最后编辑:Crocodile 更新时间:10/21/2021 访问量:185433

问:

我有一个应用程序,我正在针对 API 级别 21 进行编译:enter image description here

然后在具有 API 级别 23 的真实设备上调试它:

enter image description here

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

我真的很困惑。谁能解释一下为什么我会看到这条消息以及如何解决它?

java android android-studio android-debug android-6.0.1-棉花糖

评论

0赞 Akash Raghav 10/12/2016
您设备中的 APK 似乎较旧或与当前代码不同。我知道这很明显,但您是否尝试卸载过该应用程序并再次安装?
3赞 Febi M Felix 10/12/2016
该错误似乎与您的IDE的Intellij IDEA插件有关。我可以在这里找到一个报告的错误 confluence.jetbrains.com/display/IDEADEV/...。你能经历一下吗?
0赞 Crocodile 10/12/2016
@Akash我已经试过了。但是我正在调试的文件是 Android 操作系统 (ContentResolver) 的一部分,而不是我的应用程序。
1赞 Crocodile 10/12/2016
@FebiMathew 谢谢。它可能与 IDEA-159697 相同。这是普通 IntelliJ IDE 中的修复。我如何知道此修复程序出现在哪个 Android Studio IDE 版本中?

答:

53赞 Michael Hoffmann 11/13/2016 #1

在 Google 的 IssueTracker 中有一个悬而未决的问题

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

  • 单击“生成”-“>”清除”
  • 在“设置”->“生成、执行、部署”中禁用“即时运行”

评论

25赞 mister270 5/8/2017
禁用 Instant Run 或此链接中的任何其他解决方案都不适合我。
0赞 Michael Hoffmann 5/13/2017
@mister270 你找到另一个解决方案了吗?我再也没有遇到过这个问题,所以我很难调试它并在这里扩展我的答案。
2赞 mister270 5/16/2017
我提高了最低限度的 sdk 并进行了干净的重建,这使问题“消失”。但是,我对这个解决方案不满意,因为我想要一个较旧的最小 sdk。
8赞 coretechie 6/22/2018
上述解决方案都不适合我。我什至没有找到即时运行选项。使用 INteelij 进行调试真是太烦人了。每次更改代码后,我都必须进行全新安装。
0赞 Swathi 6/29/2017 #2

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

5赞 Gangnus 8/28/2017 #3

如果您使用 Gradle,则可能是 Gradle 缓存的问题。(参考)。唉,即使你跑了

gradle --refresh-dependencies

,它并没有刷新真正的所有依赖项。一些垃圾仍然存在。(参考)。

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

0赞 Federico Alvarez 9/27/2017 #4

可能这个错误消息可能有多个原因,我的情况与 OP 的情况不同,就我而言,这是由于需要额外库的第 3 方库造成的。

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

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

(部分:我添加了MercadoLibre-0.3.4.jar,这需要commons-httpclient.jar)

希望这有帮助!

20赞 Uriel Frankel 1/10/2018 #5

您应该使用与 compileSdkVersion 具有相同 api 级别的 Android 模拟器。 就您而言,您应该使用具有 api 级别 21 的 Android 模拟器。

评论

1赞 live-love 2/20/2018
这对我有用。我的设备是 API 22,因此将 compileSdkVersion 设置为 22 解决了这个问题。
1赞 Jason Robertson 12/3/2020
也为我工作。我使用的是使用 Android 8.1.0 (API 27) 的物理设备,我的计算机只安装了 API 30 的源代码。切换到带有 API 30 的模拟器解决了这个问题。(compileSDKVersion 现在与设备版本匹配)
34赞 Jeffery Ma 4/29/2018 #6

这是我的解决方案:

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

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

enter image description here

  1. 单击箭头图标

  2. 你会得到这个

    enter image description here

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

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

enter image description here

如果您没有步骤 3 中的提示,也许您可以检查是否检查了设置选项

评论

4赞 Stephen M -on strike- 5/1/2019
备用源已启用,但未显示。没有下拉列表(是的,我安装了 4 个不同的 API 级别)。
0赞 kisna 4/4/2020
在 gradle 项目中,这无济于事,我只是继续暂时从项目模块中删除了错误的库,这很有帮助,除了使用拖放到帧的正确类中的断点之外!
-1赞 medynets 7/20/2018 #7

Android Studio 在应用中采用的源版本等于目标版本。使用与上述编译版本相等的源版本执行编译。所以,在你的项目中,要注意 Compile Version == Target Version(调整模块的build.gradle文件)。

-2赞 Joe Giusti 10/5/2018 #8

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

通过标记,我的意思是当您单击行号所在的左侧并突出显示该行时。 如果不清楚,这里有图片。
从:标记行转到:未标记行

0赞 ashishdhiman2007 12/21/2018 #9

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

0赞 Asjad Sohail 2/6/2019 #10

我在使用低功耗蓝牙 (BLE) 的应用程序上尝试了此处给出的解决方案。我试过了

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

所有这些都失败了。

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

1赞 KaraKaplan 6/25/2019 #11

我尝试了这里给出的所有解决方案,但没有一个对我有用。在版本2019.1.3中,我只是清理并重建工件,它起作用了;首先执行,然后单击 或从同一位置。Build -> Build Artifacts... -> <select your artifact> -> CleanBuildRebuild

2赞 NANA 9/27/2019 #12

我的应用程序是在 API 级别 29 上编译的,但在 API 级别 28 上的真实设备上调试,我在 AndroidStudio 中收到警告,我修复了它认为这些步骤:source code does not match the bytecode

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

  2. 转到 Build>Clean Build

  3. 重新运行应用程序

现在,调试运行正常。

2赞 Positive Navid 2/2/2020 #13

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

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

注意:对于小型项目来说,这将花费不到一分钟的时间,但由于我的项目很大(大约一百万行代码),因此需要 20 分钟。

0赞 iceyang1989 3/20/2020 #14

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

1赞 C K 11/17/2020 #15

因此,我创建了一个帐户,以便可以帮助解决困扰很多人并且上述修复程序不起作用的问题。

如果您收到此错误,并且此处没有任何帮助。尝试单击“恢复程序播放按钮”,直到程序完成错误。然后单击“调试”旁边的“控制台”选项卡并阅读红色文本。

即使我的问题试图将值插入空数组,我也收到了源代码错误。第 1 步:单击恢复按钮

步骤2:单击控制台选项卡并阅读红色文本

评论

0赞 Lenna 11/18/2020
这看起来可能是一个很好的答案!这篇文章中的其他人添加了屏幕截图,以帮助阐明需要采取哪些 GUI 操作。带有红色框/箭头的屏幕截图在这里可能很有用。Resume program play button
1赞 C K 11/19/2020
我添加了一些图像来提供帮助。不知道如何让它们显示,但它们在链接中,我还没有足够的代表来发布图像,所以链接必须做。
0赞 張蘇耀 7/20/2021 #16

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

0赞 Bharat Lalwani 8/12/2021 #17

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

implementation 'androidx.appcompat:appcompat:1.1.0'

上面的库被多次添加。

0赞 lilly lilly 10/20/2021 #18

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