Мы отлаживаем проблему с одним из наших приложений, которая затрагивает только устройства Huawei. Для его отладки мы приобрели P20 Lite ANE-LX1. Мы поместили несколько точек останова в наш код и исследуем полную трассировку стека. На устройстве установлен Android 8.0, и у нас есть тот же SDK, загруженный в нашу Android Studio.
Когда мы подключаем наше устройство к отладчику и пытаемся исследовать трассировку стека, мы получаем следующие ошибки в системных исходных файлах:
Поиграв с трассировкой стека, мы можем подтвердить, что действительно наши исходные файлы не соответствуют тому, что установлено на устройстве. Иногда отладчик указывает на строку, в которой вызывается functionA, и в трассировке стека мы видим, что вместо этого вызывается functionB. Эта проблема затрагивает следующие файлы, которые мы можем подтвердить:
VideoView,MediaPlayer,ContentProvider.Мы испробовали все возможные решения, которые смогли найти, включая очистку проекта, удаление любых дополнительных SDK из Android Studio, изменение настроек проекта - ничего не помогает решить эту проблему.
Это наводит нас на мысль, что Huawei устанавливает модифицированную версию Android 8.0 на свои устройства, поэтому мы не можем отлаживать трассировку стека для системных файлов. Мы связались с Huawei, чтобы прояснить этот вопрос.
А пока мы будем признательны, если вы поделитесь с нами любыми интересными идеями. Может быть, вы знаете, где взять исходные файлы, которые Huawei устанавливает на свои устройства? Или, может быть, вы знаете, как исправить это несоответствие между исходным кодом и байт-кодом каким-либо другим способом?
Следуя совету Роберта, я удалил исходные коды Android 26 и снова запустил приложение на своем Huawei. Как только я перескочил в файл VideoView, увидел такую картинку:
Я нажал «Скачать», и он начал скачивать исходные файлы:
После этого я смог войти в VideoView, и, похоже, он работал нормально. Однако после этой строки стало очевидно, что эти исходные файлы тоже неверны:
Когда я пытаюсь войти в функцию requestLayout, я получаю следующее:
И это явно неправильный результат. Фактически, если я нажимаю «Перейти к следующей строке», я снова вижу сообщение о несовпадении исходного кода с байт-кодом.
@Robert большое спасибо за ваш ответ. Не могли бы вы подробнее рассказать об этом? Дело в том, что у меня установлены исходники для Oreo 8.0. Когда я открываю VideoView или любой другой класс, я вижу все их функции вместе с их реализацией. Фактически, вы сами можете убедиться в этом на скриншоте, который я приложил к своему вопросу. Когда я перехожу в диспетчер SDK, выбираю Oreo 8.0 и нажимаю «Показать сведения о пакете», я вижу, что установлены Android SDK Platform 26 И исходники для Android 26. Вы уверены, что это неправильные источники?
Нет, это всего лишь первый выпуск от Google. Просто посмотрите на колонку редакции. Существует 10 версий API, но только одна для исходного кода. Кроме того, это источники AOSP от Google, а не от Huawei. Если вы хотите, чтобы код с вашего устройства извлекал соответствующие файлы odex и декомпилировал код. Тогда вы получите что-то подходящее. Или проверьте "Центр выпусков с открытым исходным кодом Huawei" для выпусков P20. Не уверен, что входит в их пакеты.
Кстати: AndroidStudio также имеет ограниченные возможности декомпиляции. Вы пытались удалить пакет «Источники для Android 26» и позволить Android Studio интерпретировать байт-код? Поскольку сообщение «Исходный код не соответствует байтовому коду» демонстрирует, что байтовый код уже был получен с устройства AndroidStudio, но он не использует его из-за существующих источников.
@Robert Я обновил свой ответ иллюстрацией того, что произойдет, если я удалю исходные файлы Android 26. К сожалению, похоже, что и этот подход не работает ...
Если есть несоответствие кода, как насчет того, чтобы попробовать установить приложение на другое устройство и начать его отладку. Ваше «Несоответствие кода» не имеет ничего общего с устройством Huawei. Это могло произойти где угодно. Если у вас нет другого устройства Huawei и вы действительно думаете, что это проблема конкретного устройства, я бы посоветовал вам создать эмулятор. Если это невозможно, поделитесь APK-файлом Huawei на другое устройство Android и начните его отладку. Используйте приложение ShareIt, чтобы поделиться файлом apk с другим устройством. Если проблема не исчезнет, вам необходимо установить новое приложение на устройство Huawei.
@Dennis, спасибо за ваш вклад. Причина, по которой я заинтересован в отладке этого исключительно на Huawei, заключается в том, что наше приложение не работает исключительно на Huawei. В частности, он не воспроизводит видео, загруженные либо в виде Zip-файла, либо в виде файла расширения. Одно и то же приложение работает на всех эмуляторах с одной и той же версией Android и на ВСЕХ других устройствах с той же версией Android. Кстати, все другие найденные нами приложения, в которых есть видео в Zip-файлах, также не могут воспроизводить их на моем Huawei. Это заставляет нас думать, что Huawei поставляет версию Android с ошибками.
Да, это происходит и с большинством устройств MI, если вы можете, попробуйте поделиться файлом APK с вашего устройства Huawei на другое устройство. Потому что текущая проблема заключается в том, что вы не можете отлаживать свое приложение. Поэтому нам следует сосредоточиться на том, чтобы выяснить, имеет ли наше устройство тот же код, который мы ожидаем.
Мой "MI" Я имею в виду устройства "Xiaomi"
@Dennis, мы уже проверили, что наш код выполняется одинаково на всех устройствах (и эмуляторах). Однако, учитывая разницу в результате на устройствах Huawei, очевидно, что на устройствах Huawei вызовы системных библиотек имеют другую логику. Пока мы не поймем, что это за логика, мы не сможем найти решение, чтобы смягчить такое поведение. Я боюсь, что запуск APK на другом устройстве ничего не даст, поскольку у других устройств правильная логика в их системных классах. Кстати, мы не тестировали на Xiomi - возможно, эти устройства тоже затронуты.
Какая у вас версия compileSDK? Работает ли это, если вы не отлаживаете, а просто перемещаетесь по коду? На других устройствах работает?




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