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

时间:2018-08-08 17:02:13

标签: java android android-studio android-8.0-oreo huawei

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

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

enter image description here

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

  1. VideoView
  2. MediaPlayer
  3. ContentProvider

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

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

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

更新1

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

enter image description here

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

enter image description here

此后,我得以进入VideoView,它似乎运行良好。但是,在这一行之后,很明显这些源文件也是错误的:

enter image description here

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

enter image description here

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

2 个答案:

答案 0 :(得分: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之后,这些文件通常在系统映像上为空,而是使用预编译的框架代码。

答案 1 :(得分:0)

我相信我在手机上遇到了类似的问题,但是我正在使用Google Pixel。最初,我担心电话被某种方式破坏。我认为华为不太可能出现问题,而Android Studio可能不会使源程序包保持最新。您的Component Installer屏幕截图显示了Android Studio正在下载SDK Source的修订版1,但大多数SDK使用的是更高版本。

我在其他地方在StackOverflow上详细说明了解决问题的方法:Source code does not match the bytecode for Android's View.java