华为系统上的系统文件的“源代码与字节码不匹配”更新 1

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

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

enter image description here

使用堆栈跟踪后,我们可以确认我们的源文件确实与设备上安装的内容不对应。有时,调试器指向调用的行,在堆栈跟踪中,我们看到它被调用了。我们可以确认受此问题影响的文件是:functionAfunctionB

  1. VideoView,
  2. MediaPlayer,
  3. ContentProvider.

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

这导致我们相信华为在其设备上安装了Android 8.0的修改版本,这就是为什么我们无法调试系统文件的堆栈跟踪的原因。我们确实联系了华为,试图澄清这一点。

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

更新 1

根据Robert的建议,我卸载了Android 26的源代码,并在我的华为上再次运行该应用程序。当我跳入文件时,我看到了下图:VideoView

enter image description here

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

enter image description here

在此之后,我能够进入,它似乎工作正常。但是,在此行之后,很明显这些源文件也是错误的:VideoView

enter image description here

当我尝试单步执行该函数时,我得到这个:requestLayout

enter image description here

这显然是一个错误的结果。实际上,如果我单击“单步执行到下一行”,我会再次看到有关源代码与字节码不匹配的消息。


答案 1

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

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


答案 2

我相信我在手机上遇到了类似的问题,但我使用的是Google Pixel。我最初担心手机以某种方式受到损害。我认为这不太可能是华为的问题,而更有可能是Android Studio没有保持源包最新的问题。组件安装程序屏幕截图显示 Android Studio 正在下载 SDK 源代码的修订版 1,但大多数 SDK 使用的是更高版本。

我在StackOverflow的其他地方详细介绍了我的问题的解决方案:源代码与Android的View的字节码不匹配.java


推荐