提问人:Crocodile 提问时间:10/12/2016 最后编辑:Crocodile 更新时间:10/21/2021 访问量:185433
在设备上调试时出现“源代码与字节码不匹配”
'Source code does not match the bytecode' when debugging on a device
问:
我有一个应用程序,我正在针对 API 级别 21 进行编译:
然后在具有 API 级别 23 的真实设备上调试它:
问题是当我尝试通过 Android 操作系统自己的类进行调试时,我得到“源代码与字节码不匹配”。为什么会这样?运行应用的测试设备是 API 级别 23,正在调试的源文件也是级别 23。
我真的很困惑。谁能解释一下为什么我会看到这条消息以及如何解决它?
答:
在 Google 的 IssueTracker 中有一个悬而未决的问题。
本期中给出的潜在解决方案(截至本文发布之日)是:
- 单击“生成”-“>”清除”
- 在“设置”->“生成、执行、部署”中禁用“即时运行”
评论
转到项目设置>工件。选择有问题的工件。有一个选项“包含在项目构建中”。这需要检查(启用)。对于旧版本的 IntelliJ,此选项为“生成时生成”。
如果您使用 Gradle,则可能是 Gradle 缓存的问题。(参考)。唉,即使你跑了
gradle --refresh-dependencies
,它并没有刷新真正的所有依赖项。一些垃圾仍然存在。(参考)。
因此,最确定(但激烈且漫长)的变体是从 [user]/.gradle/caches 中清除所有内部内容。或者在那里找到您的问题项目并仅清除其缓存。
可能这个错误消息可能有多个原因,我的情况与 OP 的情况不同,就我而言,这是由于需要额外库的第 3 方库造成的。
例如:您手动将 X.jar 添加到 LIB,但此 X.jar 需要 Z.jar 才能工作。
我花了一些时间才弄清楚,这个消息根本没有帮助。我必须调试应用程序,直到我到达崩溃类,并在该类中确保满足所有导入。
(部分:我添加了MercadoLibre-0.3.4.jar,这需要commons-httpclient.jar)
希望这有帮助!
您应该使用与 compileSdkVersion 具有相同 api 级别的 Android 模拟器。 就您而言,您应该使用具有 api 级别 21 的 Android 模拟器。
评论
这是我的解决方案:
如果您有多个库版本,这可能会有所帮助。
- 在 lib 源代码上设置断点
- 让代码运行到断点
- 你会得到这些提示
我错误地点击了“禁用”按钮,您可以在调试器设置中启用它
如果您没有步骤 3 中的提示,也许您可以检查是否检查了设置选项
评论
Android Studio 在应用中采用的源版本等于目标版本。使用与上述编译版本相等的源版本执行编译。所以,在你的项目中,要注意 Compile Version == Target Version(调整模块的build.gradle文件)。
我遇到了同样的问题并找到了解决方案。如果你有一行标记为红色,它会给你这个错误,但如果你取消标记所有行,它将正常工作。
通过标记,我的意思是当您单击行号所在的左侧并突出显示该行时。
如果不清楚,这里有图片。
从:标记行转到:未标记行
如果您启用了 ProGuard,也会发生这种情况。在 buildTypes 中,设置 minifyEnabled false、shrinkResources false、useProguard false
我在使用低功耗蓝牙 (BLE) 的应用程序上尝试了此处给出的解决方案。我试过了
- 干净的构建
- 禁用即时运行
- 使缓存失效/重新启动
所有这些都失败了。
我所做的是调试我认为收到警告的点,我仍然收到警告,但应用程序工作正常。您可以忽略该警告。
我尝试了这里给出的所有解决方案,但没有一个对我有用。在版本2019.1.3中,我只是清理并重建工件,它起作用了;首先执行,然后单击 或从同一位置。Build -> Build Artifacts... -> <select your artifact> -> Clean
Build
Rebuild
我的应用程序是在 API 级别 29 上编译的,但在 API 级别 28 上的真实设备上调试,我在 AndroidStudio 中收到警告,我修复了它认为这些步骤:source code does not match the bytecode
转到首选项>即时运行:取消选中即时运行
转到 Build>Clean Build
重新运行应用程序
现在,调试运行正常。
这些是对我有用的步骤(适用于 Mac 和 Windows):
- 点击“文件”
- 单击“使缓存失效/重新启动...”
- 选择:“无效并重新启动”
注意:对于小型项目来说,这将花费不到一分钟的时间,但由于我的项目很大(大约一百万行代码),因此需要 20 分钟。
您可以创建 AVD,选择 API 级别等于您的 tagetApi 和 compileApi,它对我有用。
因此,我创建了一个帐户,以便可以帮助解决困扰很多人并且上述修复程序不起作用的问题。
如果您收到此错误,并且此处没有任何帮助。尝试单击“恢复程序播放按钮”,直到程序完成错误。然后单击“调试”旁边的“控制台”选项卡并阅读红色文本。
即使我的问题试图将值插入空数组,我也收到了源代码错误。第 1 步:单击恢复按钮
评论
Resume program play button
这就是我收到此错误“源代码与字节码不匹配”的原因。我的原因与任何 API、编译器版本无关.....这是由于当我错误地在 else where 启动充气器时,将布局视图膨胀到根视图时(放在 android 应用程序代码的 onCreate 函数之上的“结果处理程序”代码的夹头)引起的。不知何故,调试器在设置断点并在此处停止时没有给我正确的提示(例如,充气机未初始化或具有实例)。
当我不小心多次添加同一个库时,这发生在我身上。
implementation 'androidx.appcompat:appcompat:1.1.0'
上面的库被多次添加。
如果清理、重建、使缓存失效和重新启动等技术不起作用,请尝试删除以前的 APK 并重新安装新的 APK。
评论