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


78

我有一个根据API级别21进行编译的应用程序: 在此处输入图片说明

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

在此处输入图片说明

问题是当我尝试通过Android OS自己的类进行调试时,得到“源代码与字节码不匹配”。为什么会这样呢?应用运行的测试设备为API级别23,正在调试的源文件也为级别23。 *在此处输入图片说明*

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


您设备中的apk看起来比当前代码旧或不同。我知道它很明显,但是您是否尝试过一次卸载该应用程序并再次安装?
Akash Raghav

2
似乎该错误与您的IDE的Intellij IDEA插件有关。我可以在confluence.jetbrains.com/display/IDEADEV/…中找到报告的错误。你能经历一下吗?
Febi M Felix

@Akash我已经尝试过了。但是我调试通过的文件是Android OS(ContentResolver)的一部分,而不是我的应用程序。
鳄鱼

1
@FebiMathew谢谢。它可能与IDEA-159697相同。这是香草IntelliJ IDE中的修复程序。我怎么知道此修复程序出现在哪个Android Studio IDE中?
鳄鱼

Answers:


39

Google的IssueTracker中对此有一个未解决的问题

截至本帖子发布之日,本期中提供的潜在解决方案是:

  • 单击生成->清理
  • 在设置->构建,执行,部署中禁用即时运行

11
禁用Instant Run或此链接中的任何其他解决方案都没有对我有用。
mister270

@ mister270您找到其他解决方案了吗?我再也没有遇到过这个问题,因此很难调试它并在此处扩展答案。
Michael Hoffmann

1
我提高了最小的sdk并进行了干净的重建,使问题“消失了”。但是,我对这个解决方案不满意,因为我想要一个更老的min sdk。
mister270 '17

3
以上解决方案均不适合我。我什至没有找到“即时运行”选项。使用INteelij进行调试非常烦人。每个代码更改后,我都必须进行全新安装。

17

这是我的解决方案:

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

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

在此处输入图片说明

  1. 点击箭头图标

  2. 你会得到这个

    在此处输入图片说明

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

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

在此处输入图片说明

如果步骤3中没有提示,则可以检查是否已检查设置选项


4
替代来源已启用,但未显示。没有下拉列表(是的,我安装了4个不同的API级别)。
斯蒂芬M-罢工

在gradle项目中,这无济于事,我只是继续从临时的Project Modules中删除了错误的库,这对我们有所帮助,除了正确的类中的断点(使用drop-frame)!
kisna

10

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


1
这对我有用。我的设备是API 22,因此将compileSdkVersion设置为22可以解决此问题。
live-love

5

如果使用Gradle,可能是Gradle缓存存在问题。(参考)。las,即使您跑步

gradle --refresh-dependencies

,实际上并没有刷新所有依赖项。一些垃圾仍然存在。(参考)。

因此,最确定(但又冗长又冗长)的变体是清除[user] /。gradle / caches中的所有内容。或者在此处找到问题项目并仅清除其缓存。


3

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

  1. 点击“文件”
  2. 单击“无效的缓存/重新启动...”
  3. 选择:“无效并重新启动”
  4. 等待20分钟

1

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


0

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


0

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

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

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

(粒子性:我添加了MercadoLibre-0.3.4.jar,它需要commons-httpclient.jar)

希望这可以帮助!


0

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


0

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

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

所有这些都失败了。

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


0

我的应用程序是在API LEVEL 29上编译的,但是在API LEVEL 28的真实设备上进行了调试。我source code does not match the bytecode在AndroidStudio中得到了警告。

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

  2. 转到构建>清理构建

  3. 重新运行该应用

现在,调试正常。


0

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


-1

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


-2

我遇到了同样的问题,找到了解决方案。如果您用红色标记一行,则会出现此错误,但是如果取消标记所有行,它将正常工作。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.