"Исходный код не соответствует байт-коду" для системных файлов на Huawei
Мы отлаживаем проблему с одним из наших приложений, который затрагивает только устройства Huawei. Чтобы отладить его, мы приобрели P20 Lite ANE-LX1. Мы установили некоторые точки останова в нашем коде и исследуем полную трассировку стека. На устройстве установлено Android 8.0, и у нас есть тот же SDK, который загружен в нашей Android-студии.
Когда мы присоединяем наше устройство к отладчику и пытаемся исследовать трассировку стека, мы получаем следующие ошибки в исходных файлах системы:
После игры с трассировкой стека, мы можем подтвердить, что наши исходные файлы не соответствуют тому, что установлено на устройстве. Иногда отладчик указывает на строку, где вызывается functionA
A, а в трассировке стека мы видим, что вместо этого вызывается functionB
B. На эти файлы, на которые мы можем подтвердить, влияют следующие проблемы:
-
VideoView
, -
MediaPlayer
, -
ContentProvider
.
Мы пробовали все возможные решения, которые мы могли найти, включая очистку проекта, удаление любых дополнительных SDK из Android Studio, изменение параметров проекта - ничто не помогает решить эту проблему.
Это заставляет нас думать, что Huawei устанавливает модифицированную версию Android 8.0 на своих устройствах, поэтому мы не можем отлаживать трассировку стека для системных файлов. Мы обратились к Huawei, чтобы попытаться прояснить это.
Тем временем, мы будем благодарны, если вы сможете бросить на нас какие-либо соответствующие идеи. Может быть, вы знаете, где взять исходные файлы, которые Huawei устанавливает на своих устройствах? Или, может быть, вы знаете, как исправить это несоответствие между исходным кодом и байт-кодом каким-то другим способом?
Обновление 1
Следуя совету Роберта, я удалил исходные коды для Android 26 и снова запустил приложение на своем Huawei. Как только я прыгнул в файл VideoView
, я увидел следующую картинку:
Я нажал "Загрузить" и начал загружать исходные файлы:
После этого я смог войти в VideoView
и, похоже, работал нормально. Однако после этой строки стало очевидно, что эти исходные файлы также неверны:
Когда я пытаюсь войти в функцию requestLayout
я получаю следующее:
И это, очевидно, неправильный результат. На самом деле, если я нажму "Переход к следующей строке", я снова увижу сообщение о несоответствии исходного кода с байт-кодом.
Ответы
Ответ 1
Судя по всему, 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 эти файлы часто бывают пустыми в системных образах, и вместо них используется предварительно скомпилированный код фреймворка.