在设备调试时,“源代码与字节码不匹配”。

106

我有一个应用程序,正在针对API级别21进行编译: 输入图像描述

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

输入图像描述

问题是当我尝试通过Android操作系统自己的类进行调试时,我会收到“源代码与字节码不匹配”的消息。为什么会发生这种情况?正在运行应用程序的测试设备是API级别23,并且正在调试的源文件也是级别23。 *输入图像描述*

我很困惑。有人可以解释一下为什么会出现这个消息以及我该如何解决它吗?


看起来你设备上的 APK 版本比当前代码旧或不同。我知道这很明显,但你尝试过卸载应用并重新安装吗? - Akash Raghav
3
看起来这个错误与你的IDE的Intellij IDEA插件有关。我在这里找到了一个已经报告的错误 https://confluence.jetbrains.com/display/IDEADEV/IntelliJ+IDEA+2016.2+162.1812.2+Release+Notes。你能否请查看一下? - Febi M Felix
@Akash 我已经尝试过了。但是我正在调试的文件是 Android 操作系统的一部分 (ContentResolver),而不是我的应用程序。 - Crocodile
1
@FebiMathew 谢谢。这可能与 IDEA-159697 相同。这是在原始的 IntelliJ IDE 中修复的。我怎么知道这个修复出现在哪个 Android Studio IDE 版本中? - Crocodile
18个回答

53

在Google的IssueTracker中有一个开放问题,链接在此.

截至本篇文章发布日,该问题提供的潜在解决方案包括:

  • 点击“Build”->“Clean”
  • 在“Settings”->“Build, Execution, Deployment”中禁用Instant Run

25
无论是禁用即时运行还是在此链接中提供的其他解决方案,都对我没有起作用。 - mister270
@mister270 你找到另一个解决方案了吗?我再也没有遇到过这个问题,所以很难在这里调试并扩展我的答案。 - Michael Hoffmann
2
我提高了最低SDK版本并进行了一次干净的重建,这使问题“消失”了。然而,我对此解决方案并不满意,因为我想要一个更旧的最低SDK版本。 - mister270
8
以上的解决方案都没有对我起作用。我甚至没找到"Instant run"选项。使用Intellij调试真的很烦人,每次修改代码后都要进行干净的安装。 - coretechie

34

这是我的解决方案:

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

  1. 在库源代码上设置断点
  2. 让代码运行到断点处
  3. 你将得到以下提示

enter image description here

  1. 点击箭头图标

  2. 你将会得到这个

    enter image description here

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

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

enter image description here

如果在步骤3中你没有看到提示,也许你可以检查一下设置选项是否已经被勾选了。


4
备选源已启用,但未显示。没有下拉菜单(是的,我已安装了4个不同的API级别)。 - Stephen M -on strike-
在Gradle项目中,这并没有帮助我,我只是暂时从项目模块中删除了错误的库,这有所帮助,此外还使用了“转到帧”在正确的类中设置断点! - kisna

20

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


1
这对我有用。我的设备是API 22,所以将compileSdkVersion设置为22解决了问题。 - live-love
1
也适用于我。我正在使用安卓8.1.0(API 27)的物理设备,而我的电脑只安装了API 30的源代码。切换到具有API 30的模拟器解决了这个问题。(编译SDK版本与设备版本匹配) - Jason Robertson

5
如果您使用Gradle,可能是Gradle缓存的问题。(参考)。即使您运行以下命令,也无法解决问题。
gradle --refresh-dependencies

当前的问题是,它并没有真正地刷新所有依赖项,一些垃圾数据仍然存在。(参考)。

所以,最可靠的(但是比较激进和费时)方法是清空[user]/.gradle/caches下的所有内容。或者在其中找到你遇到问题的项目,只清空其缓存。


2

我的应用程序编译于API LEVEL 29,但在API LEVEL 28的真实设备上进行调试。我在AndroidStudio中收到了警告源代码与字节码不匹配。我通过以下步骤进行了修复:

  1. 进入“Preferences>Instant Run”:取消选中“即时运行”

  2. 进入“Build>Clean Build”

  3. 重新运行应用程序

现在,调试运行正常。


2
以下是我使用的步骤(适用于Mac和Windows):
  1. 点击“文件”
  2. 点击“使缓存失效/重新启动...”
  3. 选择:“使缓存失效并重新启动”
注意:对于小项目,这将花费不到一分钟的时间,但由于我的项目很大(大约有一百万行代码),需要花费20分钟左右。

1

我尝试了这里提供的所有解决方案,但都没有起作用。在2019.1.3版本中,我只需清理并重建构件即可使其工作;首先执行 Build -> Build Artifacts... -> <select your artifact> -> Clean 然后从同一位置点击 BuildRebuild


1

所以我创建了一个帐户,只是为了能够帮助解决这个问题,因为很多人都受到了困扰,而上面的修复方法并没有起作用。

如果你遇到了这个错误,但这里的内容都没有帮助到你。请尝试点击“恢复程序播放按钮”,直到程序完成错误之后再点击调试旁边的控制台选项卡并阅读红色文本。

即使我的问题是尝试将值插入到空数组中,我仍然遇到了源代码错误。 步骤1 点击恢复按钮

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


这看起来可能是一个很好的答案!在此帖子中,其他人已经添加了屏幕截图以帮助澄清需要执行哪些GUI操作。在“恢复程序播放按钮”周围加上红色框/箭头的屏幕截图可能会在这里有所帮助。 - Lenna
1
我添加了一些图片来帮助。不确定如何使它们显示,但它们在链接中。 - C K

0
你可以创建AVD,选择与你的目标API级别相等的API级别和编译API级别,这对我来说有效。

0

这也可能发生在您启用了ProGuard的情况下。在buildTypes中设置minifyEnabled false,shrinkResources false,useProguard false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接