Исходный код не соответствует байт-коду для Android View.java

Я пытаюсь отладить свое приложение для Android. Когда отладчик переходит к файлу View.java, я получаю сообщение "Исходный код не соответствует байт-коду". Я вижу, что отладчик находится не в той части файла. Кто-нибудь знает, как это исправить?

Я отлаживаю устройство Android 10 (API 29). В настройках Android Studio -> Внешний вид и поведение -> Системные настройки -> Android SDK я убедился, что все обновлено. Я также несколько раз очищал и перестраивал, удалял кеши, перезапускал Android Studio и устройство, удалял / переустанавливал, обновлял Android Studio до 4.0.1. В настройках модуля "Версия компиляции Sdk" - 29, а целевая версия SDK и минимальная версия SDK - 29. Ничего не помогает и не дает никакого эффекта. Многие из этих шагов были предложены в похожих постах.

Файл View.java, который он пытается открыть, находится по адресу: ~/Library/Android/sdk/sources/android-29/android/view/View.java. Это должен быть правильный файл, но отладчик находится не в той части файла, пока я получаю сообщение об ошибке.

Надев черную шляпу, предположим, что View.java моего ноутбука подходит для этого уровня API: может ли мой телефон работать с нестандартным кодом, и есть ли способ обнаружить это или исключить его?

2 ответа

Решение

Думаю, я понял, что происходит, и у меня есть решение этой проблемы, когда это происходит с файлами Android SDK. Пугает то, что платформа Android SDK обновляется до версии 5, но исходный пакет не обновляется. Он все еще находится на Ревизии 1! Почему это произошло, я не могу объяснить: разумный человек мог бы ожидать, что оба будут синхронизированы. Этот снимок экрана показывает, что исходный код не соответствует двоичному файлу, загруженному Android Studio:

Единственный способ обойти это - вручную загрузить нужные файлы и вручную исправить их в исходном каталоге SDK. Это некрасиво, в этом нет необходимости, но если вы действительно хотите пройти через определенный файл SDK, вы должны это сделать.

Вот шаги, которые я выполнил:

  1. Узнайте, какая у вас сборка Android. На своем устройстве перейдите в "Настройки" -> "О телефоне" -> "Версия Android" и запишите значение "Номер сборки". Мой - QQ3A.200805.001.
  2. Найдите тег, соответствующий вашему номеру сборки, на этой странице: https://source.android.com/setup/start/build-numbers. Для моего номера сборки это тег: android-10.0.0_r41
  3. Найдите нужный файл на https://android.googlesource.com/. Используя google.com, я нашел его по адресу: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java.
  4. Определите репозиторий Android, в котором находится ваш файл. Глядя на предыдущий URL, я могу сделать вывод: https://android.googlesource.com/platform/frameworks/base/
  5. Возьмите это репо, используя свой тег. Или возьмите самую последнюю версию этого отдельного файла в Интернете, например: https://android.googlesource.com/platform/frameworks/base/+log/refs/tags/android-10.0.0_r41/core/java/android/view/View.java, ревизия 18c0fbf.
    • Чтобы загрузить отдельный файл, добавьте к URL-адресу "? Format = text", чтобы получить версию в кодировке base64. Затем расшифруйте его: cat file | base64 --decode.
  6. Теперь у вас есть файл. Перейдите в каталог SDK, содержащий ошибочный файл: cd ~/Library/Android/sdk/sources/android-29/android/view/
  7. Сделайте резервную копию старого файла (cp -pr View.java View.java.orig), если хотите (вы всегда можете переустановить исходные файлы SDK, если вы ошиблись). Скопируйте новый файл в то же место.
  8. Теперь ваш отладчик будет использовать правильный файл! Вам нужно будет сделать это для каждого файла, на который жалуется ваш отладчик.

Надеюсь, это поможет кому-то еще в будущем. Я потратил много времени на то, чтобы понять это, и искренне надеюсь, что кому-то другому не придется тратить это время зря. Google необходимо поддерживать соответствие исходных пакетов пакетам выпуска. Если посмотреть на все предыдущие выпуски SDK, ни один из исходных пакетов, похоже, не синхронизирован с последней версией выпуска. Возможно, еще один уродливый способ отладки файлов SDK - использовать версию выпуска SDK № 1, соответствующую исходному пакету редакции № 1.

К сожалению, решение любопытного_георга работает только в том случае, если на устройстве установлена ​​версия Android, созданная непосредственно из опубликованных источников Google. Производители устройств не обязаны этого делать, а лицензия Apache, используемая Google, в отличие от GPL, не обязывает издателей производных работ предоставлять доступ к их источникам.

Мое устройство — Samsung Galaxy S21, а номер сборки установленного Android — SP1A.210812.016.G998BXXU4BULF, который, конечно же, не указан в https://source.android.com/setup/start/build-numbers#source . -code-tags-and-builds.

Версии источников с тегом 210812.016, перечисленные там,

210812.016.A1 android-12.0.0_r3 Вт 24 августа 18:43:39 2021210812.016.A2 android-12.0.0_r25 Вт 24 августа 18:43:39 2021210812.016.B1 android-12.0.0_r30 Пт: 284 декабря 23 4 2021 210812.016.C1 android-12.0.0_r31 Сб, 25 декабря, 00:36:35 2021

Все они имеют одинаковую версию View.Java, и Android Studio сообщает, что это не та версия, которая установлена ​​на моем устройстве. Даже изменение комментария может запутать отладчик, поскольку он ищет код в строке с определенным номером.

На данный момент я также не могу выполнять отладку с помощью эмулятора, который предположительно будет иметь подлинную версию Google для Android, начиная с последней версии Android Studio (Android Studio BumbleBee | 2021.1.1 Patch 2, Build #AI-211.7628.21.2111.8193401, построен 17.02.2022), похоже, сломал его. Эмулятор либо блокирует свой пользовательский интерфейс, либо аварийно завершает работу при запуске, и отладчик не может к нему подключиться.

Таким образом, в настоящее время, похоже, нет способа решить первоначально опубликованную проблему.

ПОМОЩЬ!!

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