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

19

我们正在调试一个只影响华为设备的应用程序问题。为了进行调试,我们购买了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函数时,我会得到以下结果:

这里输入图片描述

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


2
所以您正在尝试进入提到的类中的一个方法?如果是,源代码将永远不会完全相同,因为Android SDK只包含API(通常是包含所有必要方法但为空方法的类),而不是源代码。因此,行号不匹配。如果您想获得源代码,则必须克隆AOSP项目(需要下载和存储数GB)。 - Robert
1
@Robert非常感谢您的回复。您能否详细说明一下?事实上,我已经安装了Oreo 8.0的源代码。当我打开VideoView或任何其他类时,我可以看到它们所有的函数以及它们的实现。实际上,您可以在我附加到问题中的截图中自行查看。当我进入SDK Manager,选择Oreo 8.0并单击“显示软件包详细信息”时,我看到Android SDK Platform 26和Android 26的源代码都已安装。您确定这些不是正确的源代码吗? - Andriy Gordiychuk
2
不,这只是谷歌的初始版本。只需查看修订栏即可。API有10个修订版本,但源代码只有一个。此外,这是来自谷歌的AOSP源代码,而不是华为使用的源代码。如果您想要从设备中提取代码,请提取相关的odex文件并反编译代码。然后你会找到匹配的内容。或者在“华为开放源代码发布中心”上查看P20版本。不确定他们的软件包中包含什么。 - Robert
1
顺便提一下:AndroidStudio的反编译能力也有限。您尝试过删除“Android 26源”包并让Android Studio解释字节码吗?正如“源代码与字节码不匹配”的消息所示,AndroidStudio已经从设备中检索到了字节码,但由于现有的源代码而未使用它。 - Robert
1
@Robert,我已经更新了我的答案,并附上了关于删除Android 26源文件会发生什么的说明。不幸的是,这种方法似乎也行不通... - Andriy Gordiychuk
显示剩余6条评论
2个回答

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后,系统映像上的这些文件通常为空,并使用预编译的框架代码。

0

我相信我在手机上遇到了类似的问题,但我使用的是Google Pixel。最初我担心手机被某种方式攻击了。我认为这不太可能是华为的问题,更可能是Android Studio没有及时更新源包的问题。您的组件安装程序截图显示Android Studio正在下载SDK Source的修订版1-然而,大多数SDK都使用较新的修订版。

我在StackOverflow的其他地方详细介绍了解决方案:Source code does not match the bytecode for Android's View.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接