"Исходный код не совпадает с байт-кодом" при отладке на устройстве
У меня есть приложение, которое я компилирую на уровне API 21:
а затем отладить его на реальном устройстве с уровнем API 23:
Проблема в том, что при попытке отладки через собственные классы ОС Android я получаю "Исходный код не соответствует байт-коду". Почему это происходит? Тестовое устройство, на котором работает приложение, - это уровень API 23, а отлаживаемый исходный файл - также уровень 23.
Я действительно смущен. Может кто-нибудь объяснить, почему я вижу это сообщение и как я могу это исправить?
18 ответов
Существует открытая проблема для этого в AOSP, где некоторые пользователи предложили возможные решения: https://code.google.com/p/android/issues/detail?id=225199&sort=-id&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
Потенциальные решения, данные там (на дату этого поста):
- Нажмите Build-> Очистить
- Отключить Мгновенный запуск, в Настройки-> Построение, Выполнение, Развертывание
Вот мое решение
если у вас есть более одной версии библиотеки, это может помочь.
- установить точку останова в исходном коде lib
- пусть код работает до точки останова
вы получите эти советы
щелкните значок стрелки
ты получишь это
двойной щелчок, чтобы выбрать правильную библиотеку (обычно максимальная версия библиотеки верна)
если вы по ошибке нажали кнопку "отключить", вы можете включить ее в настройках отладчика
Если вы не получили подсказки в шаге 3, возможно, вы можете проверить, проверили ли вы параметры настройки.
Вы должны использовать эмулятор Android с тем же уровнем API, что и compileSdkVersion. В вашем случае вам следует использовать эмулятор Android с уровнем API 21.
Если вы используете Gradle, это, вероятно, проблема с кэшем Gradle. ( Ссылка). Увы, даже если вы бежите
gradle --refresh-dependencies
, это не обновляет действительно все зависимости. Некоторый мусор остается. ( Ссылка).
Итак, самый верный (но радикальный и длинный) вариант - очистить все внутри от [user]/. Gradle/caches. Или найти там свой проблемный проект и очистить только его кеши.
Вот шаги, которые сработали для меня (как для Mac, так и для Windows):
- Щелкните "Файл"
- Нажмите "Недействительные кеши / перезапустить..."
- Выберите: "Сделать недействительным и перезапустить"
- Подождите 20 минут
Мое приложение скомпилировано на уровне API 29, но отладка на реальном устройстве на уровне API 28. Я получил предупреждение source code does not match the bytecode
в AndroidStudio. Я исправил эти шаги:
Перейдите в "Настройки"> "Мгновенный запуск": снимите флажок "Мгновенный запуск".
Перейдите в Сборка> Чистая сборка
ЗАПУСТИТЕ приложение повторно
Теперь отладка проходит нормально.
Поэтому я создал учетную запись, чтобы помочь решить эту проблему, которая беспокоит множество людей и где указанные выше исправления не работают.
Если вы получили эту ошибку, и здесь ничего не помогает. Попробуйте нажимать кнопку "Возобновить воспроизведение программы", пока программа не завершит работу после ошибки. Затем щелкните вкладку консоли рядом с отладкой и прочтите красный текст.
Я получал эту ошибку исходного кода, хотя моя проблема заключалась в попытке вставить значение в нулевой массив. Шаг 1 Нажмите кнопку возобновления
Я попробовал все приведенные здесь решения, и ни одно из них не помогло мне. В версии 2019.1.3 я просто очищал и перестраивал артефакт, и он работал; сначала сделатьBuild -> Build Artifacts... -> <select your artifact> -> Clean
затем щелкните Build
или Rebuild
с того же места.
Это также может произойти, если вы включили ProGuard. В buildTypes установите minifyEnabled false, shrinkResources false, useProguard false
Вероятно, это сообщение об ошибке может иметь более чем одну причину, мой случай не был похож на тот, что был в OP, в моем случае это было связано со сторонней библиотекой, которая требовала дополнительных библиотек.
Например: вы вручную добавляете X.jar в свою LIB, но для работы этого X.jar требуется Z.jar.
Мне потребовалось некоторое время, чтобы понять, что сообщение не помогает вообще. Мне приходилось отлаживать приложение, пока я не достиг класса сбоя, и в этом классе убедиться, что все операции импорта выполнены.
(Particualry: я добавил MercadoLibre-0.3.4.jar, который требует commons-httpclient.jar)
Надеюсь это поможет!
Если методы очистки, восстановления, аннулирования кеша, перезапуска и т. Д. Не работают, попробуйте удалить предыдущий APK и переустановить новый APK.
Это случилось со мной, когда я случайно добавил одну и ту же библиотеку несколько раз.
implementation 'androidx.appcompat:appcompat:1.1.0'
Вышеупомянутая библиотека добавлялась несколько раз.
Я попробовал решения, приведенные здесь, работая над приложением, которое использовало Bluetooth Low Energy(BLE). Я старался,
- Чистая сборка
- Отключен Мгновенный Бег
- Недействительные кэши / перезапуск
все это не удалось.
То, что я сделал, было отладка точек, где я думал, что получаю предупреждение, я все еще получал предупреждение, но приложение работало нормально. Вы можете игнорировать предупреждение.
Вы можете создать AVD, выбрать уровень API, равный вашему tagetApi и compileApi, у меня это работает.
вот причина, по которой я получил эту ошибку «исходный код не соответствует байт-коду». Моя причина не имеет ничего общего с каким-либо API, версией компилятора ... Это вызвано тем, что я увеличиваю представление макета в корневом представлении, в то время как я ошибочно запускаю инфлятор в другом месте (фрагмент "обработчика результатов" код, который помещается поверх функции onCreate кода приложения Android). Почему-то отладчик не дает мне правильного намека на это (например, инфлятор не инициализирован или имеет экземпляр), когда установлена точка останова, и остановитесь здесь.
Перейдите в Настройки проекта> Артефакты. Выберите артефакт, с которым возникла проблема. Есть опция "Включить в сборку проекта". Это нужно проверить (включить). Для более старых версий IntelliJ этот параметр "Сделать на сборке".
Android Studio использует исходную версию, равную целевой версии в вашем приложении. Компиляция выполняется с исходной версией, равной вышеупомянутой версии компиляции. Поэтому позаботьтесь о том, чтобы в вашем проекте Compile Version == Target Version (измените файл build.gradle модуля).
У меня была такая же проблема, и я нашел решение. Если у вас есть линия, помеченная красным, это выдаст вам эту ошибку, но если вы снимите пометку со всех строк, она будет работать нормально.
под флагом я имею в виду, когда вы нажимаете на левой стороне, где номера строк, и это выделяет линию. Если это не ясно, вот картинки.
перейти от: отмеченной строки к: не отмеченной линии