'Source code does not match the bytecode' 在设备上调试时

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

我有一个正在根据 API 级别 21 编译的应用程序:

然后在真机上用API级别23调试:

问题是当我尝试通过 Android OS 自己的 类 进行调试时,我得到 'Source code does not match the bytecode'。为什么会这样?该应用运行所在的测试设备是API 23级,正在调试的源文件也是23级。

我真的很困惑。任何人都可以解释为什么我会看到此消息以及如何修复它吗?

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

问题中给出的潜在解决方案(截至本post日期)是:

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

转到“项目设置”>“工件”。 Select 有问题的神器。有一个选项"Include in project build"。这需要检查(启用)。对于旧版本的 IntelliJ,此选项为 "Make on build"。

如果使用Gradle,可能是Gradle缓存有问题。 (Reference)。唉,就算你运行

gradle --refresh-dependencies

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

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

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

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

我花了一些时间才弄清楚,这条消息根本没有帮助。我不得不调试应用程序,直到出现崩溃 class,并且在那个 class 中确保所有导入都得到满足。

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

希望对您有所帮助!

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

这是我的解决方案:

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

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

  1. 单击箭头图标

  2. 你会得到这个

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

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

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

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

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

by flagged 我的意思是,当您单击行号所在的左侧时,它会突出显示该行。 如果不清楚这里有图片。
从...来: flagged line 到: not flagged line

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

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

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

所有这些都失败了。

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

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

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

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

  2. 转到构建>清理构建

  3. 重新运行应用程序

现在,调试运行正常。

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

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

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

您可以创建 AVD,select API 级别等于您的 targetApi 和 compileS,它适用于我。

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

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

即使我的问题是试图将一个值插入到空数组中,我还是遇到了源代码错误。 Step 1 Click the resume button

Step 2 Click the console tab and read the red text

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

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

implementation 'androidx.appcompat:appcompat:1.1.0'

上面的库被添加了多次。

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