"Source code does not match the bytecode" 华为系统文件

"Source code does not match the bytecode" for system files on Huawei

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

当我们将设备连接到调试器并尝试调查堆栈跟踪时,我们在系统源文件中发现以下错误:

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

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

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

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

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

更新 1

听从罗伯特的建议,我在我的华为上再次卸载了 Android 26 和 运行 应用程序的源代码。一跳进VideoView文件,就看到了下图:

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

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

当我尝试进入 requestLayout 函数时,我得到了这个:

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

显然华为分叉了 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 后,这些文件在系统映像上通常是空的,而是使用预编译的框架代码。

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

我在 Whosebug 的其他地方详细说明了我的问题的解决方案: