"Вихідний код не відповідає байт-коду" під час налагодження на пристрої


79

У мене є програма, яку я компілюю за API рівня 21: введіть тут опис зображення

а потім налагодити його на реальному пристрої з рівнем API 23:

введіть тут опис зображення

Проблема полягає в тому, що коли я намагаюся налагоджувати власні класи ОС Android, я отримую "Вихідний код не відповідає байт-коду". Чому це відбувається? Тестовим пристроєм, на якому працює програма, є рівень API 23, а вихідним файлом, який налагоджується, також є рівень 23. * введіть тут опис зображення *

Я справді розгублений. Хто-небудь може пояснити, чому я бачу це повідомлення і як я можу це виправити?


схоже, що apk у вашому пристрої старіший або відрізняється від поточного коду. Я знаю, що це очевидно, але чи намагалися ви один раз видалити програму та встановити її знову?
Akash Raghav

2
Здається, помилка пов’язана з плагіном Intellij IDEA вашого IDE. Я міг знайти тут повідомлення про помилку confluence.jetbrains.com/display/IDEADEV/… . Не могли б ви пройти через це?
Febi M Felix

@Akash Я спробував це. Але файл, який я налагоджую, є частиною ОС Android (ContentResolver), а не моєї програми.
Крокодил

1
@FebiMathew Дякую. Це може бути те саме, що IDEA-159697. Це виправлення у ванільному IDE IntelliJ. Як мені дізнатися, в якій збірці IDE Android Studio з’являється це виправлення?
Крокодил

Відповіді:


40

Для цього у Google IssueTracker є відкрита проблема .

Потенційні рішення, наведені у випуску (станом на дату цього повідомлення):

  • Клацніть Будувати -> Очистити
  • Вимкніть миттєвий запуск у Налаштуваннях -> Збірка, виконання, розгортання

12
Ні вимкнення миттєвого запуску, ні будь-яке інше рішення в цьому посиланні не допомогло мені.
mister270

@ mister270 Ви знайшли інше рішення? Я більше ніколи не стикався з цією проблемою, тому мені важко налагодити її та розгорнути свою відповідь тут.
Майкл Гофман

2
Я перевищив мінімальний SDK і зробив чисту перебудову, яка змусила проблему "зникнути". Однак я не задоволений цим рішенням, оскільки я хотів старіший min sdk.
mister270

3
Жодне з наведених вище рішень не допомогло мені. Я навіть не знайшов опції миттєвого запуску. Настільки дратує налагодження за допомогою INteelij. Мені доводиться чистити інсталяцію після кожної зміни коду.
Блюдо

17

Ось моє рішення:

Якщо у вас декілька версій бібліотеки, це може допомогти.

  1. встановити точку зупинки у вихідному коді lib
  2. нехай код працює до точки зупинку
  3. ви отримаєте ці поради

введіть тут опис зображення

  1. клацніть піктограму зі стрілкою

  2. ви отримаєте це

    введіть тут опис зображення

  3. двічі клацніть, щоб вибрати правильну бібліотеку (зазвичай найвища версія бібліотеки правильна)

Я помилково натиснув кнопку "вимкнути", ви можете ввімкнути її в налаштуваннях налагоджувача

введіть тут опис зображення

Якщо у вас немає підказок на кроці 3, можливо, ви можете перевірити, чи перевіряли ви параметри налаштування


4
Альтернативні джерела ввімкнено, але вони не відображаються. Не випадає (і так, у мене встановлено 4 різних рівні API).
Стівен М - на страйку -

У проекті gradle це не допомогло, я просто продовжив і тимчасово видалив неправильну бібліотеку з Модулів проекту, і це допомогло, крім точки зупинку в потрібному класі, використовуючи падіння до кадру!
kisna

11

Ви повинні використовувати емулятор Android з тим самим рівнем API, що і compileSdkVersion. У вашому випадку вам слід використовувати емулятор Android з рівнем api 21.


1
Це спрацювало для мене. Моїм пристроєм був API 22, тому встановлення compileSdkVersion на 22 вирішило проблему.
live-love

Також працював у мене. Я був на фізичному пристрої, який використовував Android 8.1.0 (API 27), і на моєму комп’ютері були встановлені лише джерела для API 30. Перехід на емулятор з API 30 вирішив це. (compileSDKVersion тепер відповідає версії пристрою)
Джейсон Робертсон

5

Якщо ви використовуєте Gradle, це, мабуть, проблема з кешами Gradle. ( Довідково ). На жаль, навіть якщо ви біжите

gradle --refresh-dependencies

, це не оновлює насправді всі залежності. Залишилось трохи сміття. ( Довідково ).

Отже, найпевніший (але радикальний і довгий) варіант - очистити все внутрішнє з кеш-пам’яті [user] /. Або знайти там свій проблемний проект і очистити лише його кеші.


1

Я спробував усі наведені тут рішення, і жодне з них не працювало для мене. У версії 2019.1.3 я просто очищаю та відновлюю артефакт, і він спрацював; спочатку зробіть, Build -> Build Artifacts... -> <select your artifact> -> Cleanпотім натисніть Buildабо Rebuildз того самого місця.


1

Це кроки, які працювали для мене (як для Mac, так і для Windows):

  1. Клацніть на "Файл"
  2. Клацніть на "Вимкнути кеш / перезапустити ..."
  3. Виберіть: "Скасувати та перезапустити"
  4. Зачекайте 20 хвилин

0

Перейдіть до Налаштування проекту> Артефакти. Виберіть артефакт, який має проблему. Існує опція "Включити у збірку проекту". Це потрібно перевірити (увімкнути). Для старих версій IntelliJ ця опція має значення "Зробити на збірці".


0

Можливо, це повідомлення про помилку може мати більше однієї причини, мій випадок не був схожий на той із OP, у моєму випадку це було пов’язано зі сторонніми бібліотеками, які потребували додаткових бібліотек.

Наприклад: ви вручну додаєте X.jar у свій LIB, але для цього X.jar потрібно, щоб Z.jar працював.

Мені потрібно було колись зрозуміти, повідомлення зовсім не допомагало. Мені довелося налагоджувати програму, поки не дійшов до аварійного класу, і в цьому класі переконайтесь, що всі імпорти були задоволені.

(Особливості: я додав MercadoLibre-0.3.4.jar, який вимагав commons-httpclient.jar)

Сподіваюся, це допомагає!


0

Це також може статися у випадку, якщо ви активували ProGuard. У buildTypes встановіть minifyEnabled false, shrinkResources false, useProguard false


0

Я спробував наведені тут рішення під час роботи над додатком, який використовував Bluetooth Low Energy (BLE). Я намагався,

  1. Чиста збірка
  2. Вимкнений миттєвий запуск
  3. Зневірити кеші / перезапустити

все це не вдалося.

Що я зробив, це налагодження пунктів, де я думав, що отримую попередження, я все ще отримав попередження, але програма працювала нормально. Ви можете нехтувати попередженням.


0

Мій додаток компілюється на рівні API 29, але налагодження на реальному пристрої на рівні API 28. Я отримав попередження source code does not match the bytecodeв AndroidStudio.

  1. Перейдіть до Налаштування> Миттєвий запуск: зніміть позначку з миттєвого запуску

  2. Перейдіть до команди Build> Clean Build

  3. Повторно запустіть програму

Тепер налагодження працює нормально.


0

Ви можете створити AVD, вибрати рівень API, що дорівнює вашому tagetApi іr compileApi, це працює для мене.


0

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

Якщо ви отримуєте цю помилку, і тут нічого не допомагає. Спробуйте натискати кнопку "Відновити програвання програми", поки програма не закінчить помилку. Потім натисніть на вкладці консолі поруч із налагодженням і прочитайте червоний текст.

Я отримував цю помилку вихідного коду, хоча моя проблема намагалася вставити значення в нульовий масив. Крок 1 Натисніть кнопку відновлення

Крок 2 Клацніть вкладку консолі та прочитайте червоний текст


Схоже, це може бути чудовою відповіддю! Інші в цій публікації додали знімки екрану, щоб допомогти уточнити, які дії графічного інтерфейсу потрібно вжити. Тут Resume program play buttonможе бути корисним знімок екрана з червоним полем / стрілкою навколо .
Ленна

1
Я допоміг кілька зображень. Не знаю, як змусити їх відображатись, але вони є у посиланнях. У мене поки що недостатньо представників, щоб розміщувати зображення, тому посиланням доведеться робити.
CK

-1

Android Studio приймає вихідну версію, рівну цільовій версії у вашому додатку. Компіляція виконана з вихідною версією, рівною вищезгаданій версії компіляції. Отже, подбайте про те, щоб у вашому проекті Compile Version == Target Version (налаштувати файл build.gradle модуля).


-2

У мене була та ж проблема, і я знайшов рішення. Якщо у вас є рядок, позначений червоним, це дасть вам цю помилку, але якщо зняти позначку з усіх рядків, це буде працювати нормально.

під позначкою я маю на увазі, коли ви натискаєте ліву сторону, де знаходяться номери рядків, і вона виділяє лінію. Якщо це незрозуміло, ось фотографії.
перейти від: позначеного рядка до: не позначеного рядка

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.