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

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

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

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

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

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

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

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

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

Обновление 1

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

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

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

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

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

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

Когда я пытаюсь войти в функцию requestLayout, я получаю следующее:

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

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

Итак, вы пытаетесь использовать метод одного из упомянутых классов? Если да, исходный код никогда не будет прежним, потому что Android SDK содержит только API (обычно классы со всеми необходимыми методами, но пустыми методами), а не исходный код. Следовательно, номера строк не совпадают. Если вам нужен исходный код, вам нужно клонировать проект AOSP (требуется несколько ГБ для загрузки и хранилища).

Robert 09.08.2018 20:19

@Robert большое спасибо за ваш ответ. Не могли бы вы подробнее рассказать об этом? Дело в том, что у меня установлены исходники для Oreo 8.0. Когда я открываю VideoView или любой другой класс, я вижу все их функции вместе с их реализацией. Фактически, вы сами можете убедиться в этом на скриншоте, который я приложил к своему вопросу. Когда я перехожу в диспетчер SDK, выбираю Oreo 8.0 и нажимаю «Показать сведения о пакете», я вижу, что установлены Android SDK Platform 26 И исходники для Android 26. Вы уверены, что это неправильные источники?

Andriy Gordiychuk 10.08.2018 18:51

Нет, это всего лишь первый выпуск от Google. Просто посмотрите на колонку редакции. Существует 10 версий API, но только одна для исходного кода. Кроме того, это источники AOSP от Google, а не от Huawei. Если вы хотите, чтобы код с вашего устройства извлекал соответствующие файлы odex и декомпилировал код. Тогда вы получите что-то подходящее. Или проверьте "Центр выпусков с открытым исходным кодом Huawei" для выпусков P20. Не уверен, что входит в их пакеты.

Robert 10.08.2018 21:03

Кстати: AndroidStudio также имеет ограниченные возможности декомпиляции. Вы пытались удалить пакет «Источники для Android 26» и позволить Android Studio интерпретировать байт-код? Поскольку сообщение «Исходный код не соответствует байтовому коду» демонстрирует, что байтовый код уже был получен с устройства AndroidStudio, но он не использует его из-за существующих источников.

Robert 10.08.2018 21:07

@Robert Я обновил свой ответ иллюстрацией того, что произойдет, если я удалю исходные файлы Android 26. К сожалению, похоже, что и этот подход не работает ...

Andriy Gordiychuk 11.08.2018 16:38

Если есть несоответствие кода, как насчет того, чтобы попробовать установить приложение на другое устройство и начать его отладку. Ваше «Несоответствие кода» не имеет ничего общего с устройством Huawei. Это могло произойти где угодно. Если у вас нет другого устройства Huawei и вы действительно думаете, что это проблема конкретного устройства, я бы посоветовал вам создать эмулятор. Если это невозможно, поделитесь APK-файлом Huawei на другое устройство Android и начните его отладку. Используйте приложение ShareIt, чтобы поделиться файлом apk с другим устройством. Если проблема не исчезнет, ​​вам необходимо установить новое приложение на устройство Huawei.

Daksh Gargas 11.08.2018 16:44

@Dennis, спасибо за ваш вклад. Причина, по которой я заинтересован в отладке этого исключительно на Huawei, заключается в том, что наше приложение не работает исключительно на Huawei. В частности, он не воспроизводит видео, загруженные либо в виде Zip-файла, либо в виде файла расширения. Одно и то же приложение работает на всех эмуляторах с одной и той же версией Android и на ВСЕХ других устройствах с той же версией Android. Кстати, все другие найденные нами приложения, в которых есть видео в Zip-файлах, также не могут воспроизводить их на моем Huawei. Это заставляет нас думать, что Huawei поставляет версию Android с ошибками.

Andriy Gordiychuk 11.08.2018 16:48

Да, это происходит и с большинством устройств MI, если вы можете, попробуйте поделиться файлом APK с вашего устройства Huawei на другое устройство. Потому что текущая проблема заключается в том, что вы не можете отлаживать свое приложение. Поэтому нам следует сосредоточиться на том, чтобы выяснить, имеет ли наше устройство тот же код, который мы ожидаем.

Daksh Gargas 11.08.2018 16:50

Мой "MI" Я имею в виду устройства "Xiaomi"

Daksh Gargas 11.08.2018 17:01

@Dennis, мы уже проверили, что наш код выполняется одинаково на всех устройствах (и эмуляторах). Однако, учитывая разницу в результате на устройствах Huawei, очевидно, что на устройствах Huawei вызовы системных библиотек имеют другую логику. Пока мы не поймем, что это за логика, мы не сможем найти решение, чтобы смягчить такое поведение. Я боюсь, что запуск APK на другом устройстве ничего не даст, поскольку у других устройств правильная логика в их системных классах. Кстати, мы не тестировали на Xiomi - возможно, эти устройства тоже затронуты.

Andriy Gordiychuk 11.08.2018 17:13

Какая у вас версия compileSDK? Работает ли это, если вы не отлаживаете, а просто перемещаетесь по коду? На других устройствах работает?

Mike 16.08.2018 16:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
11
3 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Судя по всему, 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 используют более позднюю версию.

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

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