当前位置: 首页 > 知识库问答 >
问题:

华为系统文件“源代码与字节码不匹配”

廖臻
2023-03-14

我们正在调试我们的一个应用程序的问题,该问题只影响华为设备。为了调试它,我们购买了P20 Lite Ane-LX1。我们在代码中放置了一些断点,并正在调查整个堆栈跟踪。该设备安装了Android8.0,我们在Android Studio下载了相同的SDK。

当我们将设备附加到调试器并试图调查堆栈跟踪时,系统源文件中会出现以下错误:

在使用堆栈跟踪之后,我们可以确认源文件确实与设备上安装的文件不一致。有时,调试器会指向调用functionA的一行,而在堆栈跟踪中,我们看到调用的是functionB。我们可以确认受此问题影响的文件有:

  1. 视频查看,
  2. MediaPlayer
  3. ContentProvider.

我们已经尝试了所有可能的解决方案,包括清理项目,从Android Studio中删除任何额外的SDK,修改项目设置--没有任何帮助解决这个问题。

这让我们相信华为在他们的设备上安装了一个修改版的Android8.0,这就是为什么我们不能调试系统文件的堆栈跟踪。我们确实联系了华为,试图澄清这一点。

同时,如果你能向我们提出任何相关的想法,我们将不胜感激。也许你知道从哪里获得华为安装在他们设备上的源文件?或者您知道如何以其他方式修复源代码和字节码之间的不匹配?

按照罗伯特的建议,我卸载了Android 26的源代码,并在我的华为上再次运行了该应用程序。我一跳入videoview文件,就看到了下面的图片:

我点击“下载”,它开始下载源文件

在此之后,我能够单步执行videoview,它似乎工作得很好。但是,在这行之后,很明显这些源文件也是错误的:

当我尝试单步执行RequestLayout函数时,我得到以下结果:

而且这显然是一个错误的结果。事实上,如果我单击“Step to next Line”,我会再次看到关于源代码与字节码不匹配的消息。

共有1个答案

闾丘京
2023-03-14

显然,华为分叉了AOSP并修改了它的来源。这是许多制造商所做的,只要源代码通过兼容性测试套件,这是完全没有问题的。我自己在华为P20上看到了与定制ROM相关的加密视频播放问题。

回到正题,您可以从/system/framework/arm/boot.oat或boot-framework.oat或/system/framework/boot.vdex获得在设备上运行的确切框架代码。我不知道这些文件是如何结构的,但它在Android版本和制造商之间有所不同。一旦通过adb pull获得这些文件(您肯定需要root来完成此操作),您就可以使用dex2jar或其他工具执行OAT->dex、dex->jar,您将获得源代码。传统上,可以从/system/framework/framework.jar获得框架代码,但是在引入ART之后,这些文件在系统映像上通常是空的,而使用预编译的框架代码。

 类似资料:
  • 我正在尝试调试我的Android应用程序。当调试器到达view.java文件时,我会收到“源代码与字节码不匹配”的消息。我可以看到调试器在文件的错误部分。有人知道怎么修吗? 我正在Android10(API29)设备上调试。在Android Studio首选项->外观和行为->系统设置->Android SDK中,我已经确保所有内容都是最新的。我还多次清理和重建,删除缓存,重新启动Android

  • 然后使用API级别23在实际设备上调试: 我真的很困惑。谁能解释一下为什么我会看到这条信息,以及我该如何修复它?

  • 问题内容: 我继承了一个Java项目,并且对Eclipse没有太多的经验。在包资源管理器中,我可以看到所有类的项目概述,但是当我尝试编辑其中的任何类时,都会显示未找到源代码。当我查看源代码时,似乎应该在其中。我假设在将代码从源代码控制中拉出时,路径必须与原始路径有所不同。是否有一种简单的方法告诉IDE仅将代码文件连接到类? 真正奇怪的是,在同一目录中找到了“某些”文件,而没有找到。到目前为止,不能

  • 我正在运行SonarQube 5.6版本,我正在尝试集成。NET与声纳的应用。在运行sonar runner之后,我收到了这个警告消息 Roslyn检测到的编码和SonarQu使用的编码与文件xxx不匹配。SonarQube编码为“windows-1252”,Roslyn编码为“UTF-8”。文件将被跳过。 这将导致0分析,因为将跳过所有文件。一种方法是改变。从VisualStudio到windo

  • 尽管维基百科上对遗留系统的定义是: 一种旧的方法、旧的技术、旧的计算机系统或应用程序。 但是实际上,当你看到某个网站宣称用新的框架来替换旧的框架的时候,你应该知晓他们原有的系统是遗留系统。人们已经不想在上面工作了,很多代码也不知道是干什么的,也没有人想去深究——毕竟不是自己的代码。判断是否是遗留代码的条件很简单,维护成本是否比开发成本高很多。 几乎无法维护 代码遗失 逻辑不清 没有文档或者不够详细

  • 我的应用程序崩溃了,我的设备上有一个NPE。在使用ACRA接收的堆栈跟踪中,行号引用了两个源代码类和。对于,没有一个行号与任何源代码版本中的行号匹配。我的设备没有自定义ROM。这是一款运行Android4.03的Galaxy S2。 下面是堆栈跟踪: 如果查看不同版本的源代码,您可以自己检查数字是否匹配。 例如,在Android4.03的源代码中,位于第1892行,而我的堆栈跟踪显示它位于第202