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

时间:2016-10-12 04:52:44

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

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

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

enter image description here

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

我真的很困惑。任何人都可以解释为什么我看到这条消息以及我如何解决它?

16 个答案:

答案 0 :(得分:28)

在AOSP中有一个未解决的问题,一些用户提供了可能的解决方案: https://code.google.com/p/android/issues/detail?id=225199&sort=-id&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars

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

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

答案 1 :(得分:10)

这是我的解决方案

如果你有多个版本的图书馆,它可能有帮助。

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

    enter image description here

  4. 点击箭头图标

  5. 你会得到这个

    enter image description here

  6. 双击以选择正确的lib(通常最高版本的lib是正确的)

    如果单击"禁用"错误地按下按钮,您可以在调试器设置中启用它

  7. enter image description here

    如果您没有获得第3步中的提示,也许您可​​以检查是否已检查设置选项。

答案 2 :(得分:8)

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

答案 3 :(得分:4)

如果您使用Gradle,则Gradle缓存可能存在问题。 (Reference)。唉,即使你跑了

gradle --refresh-dependencies

,它并不是真正的所有依赖项。一些垃圾仍然存在。 (Reference)。

因此,最确定(但极端和长期)的变体是从[user] /。gradle / caches清除所有内部。或者在那里找到你的问题项目并清除它的缓存。

答案 4 :(得分:1)

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

  1. 清洁版本
  2. 禁用即时运行
  3. 使缓存无效/重新启动

所有这些都失败了。

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

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

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

希望这有帮助!

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

  1. 转到“偏好设置”>即时运行:取消选中即时运行

  2. 转到Build>清理Build

  3. 重新运行应用程序

现在,调试正常运行。

答案 11 :(得分:0)

您可以创建AVD,选择等于您的tagetApi和r compileApi的API级别,

答案 12 :(得分:0)

所以我创建了一个帐户,只是为了帮助解决这个困扰很多人的问题,并且上述修复无效的地方。

如果收到此错误,但这里没有任何帮助。尝试单击“恢复程序播放按钮”,直到该程序结束并超过错误为止。然后单击“调试”旁边的控制台选项卡,然后阅读红色文本。

即使我的问题试图将值插入到空数组中,我仍然遇到该源代码错误。 Step 1 Click the resume button

Step 2 Click the console tab and read the red text

答案 13 :(得分:0)

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

答案 14 :(得分:-1)

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

答案 15 :(得分:-1)

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

由标记表示,是指单击行号所在的左侧并突出显示该行。 如果不清楚,请看图片。
从...来: flagged line 至: not flagged line