"Исходный код не соответствует байт-коду" для системных файлов на Huawei

Мы устраняем проблему с одним из наших приложений, которая касается только устройств Huawei. Для отладки мы купили P20 Lite ANE-LX1. Мы разместили несколько точек останова в нашем коде и исследуем трассировку полного стека. На устройстве установлен Android 8.0, и в нашей Android Studio загружен тот же SDK.

Когда мы подключаем наше устройство к отладчику и пытаемся исследовать трассировку стека, мы получаем следующие ошибки в системных исходных файлах:

Поиграв с трассировкой стека, мы можем подтвердить, что наши исходные файлы действительно не соответствуют тому, что установлено на устройстве. Иногда отладчик указывает на строку, где functionA называется, и в трассировке стека, мы видим, что functionB называется вместо. Файлы, которые мы могли бы подтвердить, подвержены этой проблеме:

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

Мы испробовали все возможные решения, которые могли найти, включая очистку проекта, удаление любых дополнительных SDK из Android Studio, изменение настроек проекта - ничего не помогает решить эту проблему.

Это наводит нас на мысль, что Huawei устанавливает модифицированную версию Android 8.0 на свои устройства, поэтому мы не можем отлаживать трассировку стека для системных файлов. Мы связались с Huawei, чтобы попытаться уточнить это.

В то же время, мы были бы признательны, если бы вы могли поделиться с нами какими-либо актуальными идеями. Может быть, вы знаете, где взять исходные файлы, которые Huawei устанавливает на свои устройства? Или, может быть, вы знаете, как исправить это несоответствие между исходным кодом и байт-кодом другим способом?

Обновление 1

Следуя совету Роберта, я удалил исходные коды для Android 26 и снова запустил приложение на своем Huawei. Как только я прыгнул в VideoView файл, я увидел следующую картину:

Я нажал "Скачать", и он начал скачивать исходные файлы:

После этого я смог вступить в VideoView и это, казалось, работало нормально. Однако после этой строки стало очевидно, что эти исходные файлы также неверны:

Когда я пытаюсь шагнуть в requestLayout Функция я получаю это:

И это явно неверный результат. Фактически, если я нажимаю "Перейти к следующей строке", я снова вижу сообщение о несоответствии исходного кода байт-коду.

0 ответов

Видимо, Huawei разветвил AOSP и изменил его источники. Это то, что делают многие производители, и это прекрасно, пока источник проходит тест на совместимость. Я сам видел проблемы воспроизведения зашифрованного видео на Huawei P20, связанные с их подходом к настройке ПЗУ.

Но вернемся к сути - вы можете получить точный код фреймворка, работающий на вашем устройстве, из /system/framework/arm/boot.oat или boot-framework.oat или /system/framework/boot.vdex. Я не знаю точно, как эти файлы структурированы, но это варьируется между версиями Android и между производителями. Как только вы получите эти файлы с помощью adb pull (для этого вам, безусловно, нужен root), вы можете выполнить oat->dex, dex-> ​​jar, используя dex2jar или другие инструменты, и вы получите исходный код. Традиционно можно было получить код фреймворка из /system/framework/framework.jar, но после появления ART эти файлы часто бывают пустыми в системных образах, и вместо них используется предварительно скомпилированный код фреймворка.

Я считаю, что столкнулся с аналогичной проблемой на своем телефоне, но я использую Google Pixel. Изначально я был обеспокоен тем, что телефон каким-то образом скомпрометирован. Я думаю, что это менее вероятная проблема с Huawei и, скорее, проблема с тем, что Android Studio не обновляет исходные пакеты. Снимок экрана вашего установщика компонентов показывает, что Android Studio загружает версию 1 исходного кода SDK, но большинство SDK используют более позднюю версию.

Я подробно описал решение моей проблемы в другом месте на Stackru: исходный код не соответствует байт-коду для Android View.java.

Другие вопросы по тегам