Исходный код не соответствует байт-коду для 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, вы должны это сделать.
Вот шаги, которые я выполнил:
- Узнайте, какая у вас сборка Android. На своем устройстве перейдите в "Настройки" -> "О телефоне" -> "Версия Android" и запишите значение "Номер сборки". Мой - QQ3A.200805.001.
- Найдите тег, соответствующий вашему номеру сборки, на этой странице: https://source.android.com/setup/start/build-numbers. Для моего номера сборки это тег: android-10.0.0_r41
- Найдите нужный файл на https://android.googlesource.com/. Используя google.com, я нашел его по адресу: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java.
- Определите репозиторий Android, в котором находится ваш файл. Глядя на предыдущий URL, я могу сделать вывод: https://android.googlesource.com/platform/frameworks/base/
- Возьмите это репо, используя свой тег. Или возьмите самую последнюю версию этого отдельного файла в Интернете, например: 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.
- Теперь у вас есть файл. Перейдите в каталог SDK, содержащий ошибочный файл: cd ~/Library/Android/sdk/sources/android-29/android/view/
- Сделайте резервную копию старого файла (cp -pr View.java View.java.orig), если хотите (вы всегда можете переустановить исходные файлы SDK, если вы ошиблись). Скопируйте новый файл в то же место.
- Теперь ваш отладчик будет использовать правильный файл! Вам нужно будет сделать это для каждого файла, на который жалуется ваш отладчик.
Надеюсь, это поможет кому-то еще в будущем. Я потратил много времени на то, чтобы понять это, и искренне надеюсь, что кому-то другому не придется тратить это время зря. 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), похоже, сломал его. Эмулятор либо блокирует свой пользовательский интерфейс, либо аварийно завершает работу при запуске, и отладчик не может к нему подключиться.
Таким образом, в настоящее время, похоже, нет способа решить первоначально опубликованную проблему.
ПОМОЩЬ!!