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

标签 java android android-studio android-8.0-oreo huawei-mobile-services

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

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

enter image description here

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

  1. 视频 View ,
  2. 媒体播放器,
  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

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

最佳答案

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

关于java - 华为系统文件"Source code does not match the bytecode",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51752026/

相关文章:

java - 在 Java 中创建子图像

android - Android 上的 EditText 输入数字作为密码样式

android - Android-将MP3从立体声编码为单声道

java - 将图像存储在 Realm 数据库中

java - 使用Java在DynamoDb中找不到QueryRequest的SetCount方法

java - 如果从 Mockito.doAnswer(...) 调用,为什么 Mockito.when(...).doReturn(...) 不能按预期工作

java - 将 jsf 项目转换为 Facelets 2.0 时出现的问题

android - 在多层架构中处理身份验证

android - 升级了android studio并使用gradle获取构建错误

macos - Android Studio 运行配置中的模块是什么?