对于华为的系统文件,"源代码与字节码不匹配"

And*_*huk 17 java android android-studio huawei android-8.0-oreo

我们正在调试一个仅影响华为设备的应用程序的问题.为了调试它,我们购买了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

按照Robert的建议,我卸载了Android 26的源代码并在我的华为上再次运行应用程序.我一进入VideoView文件,就看到以下图片:

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

当我尝试进入该requestLayout功能时,我得到了这个:

在此输入图像描述

这显然是一个错误的结果.事实上,如果我点击"Step to the next line",我会再次看到有关源代码与字节码不匹配的消息.

Woj*_*ski 1

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