Студия Android показывает источники из API compileSdkVersion при отладке на устройстве со старым API

Я отлаживаю с помощью Android Studio (AS) 1.0.2 с помощью compileSdkVersion 21, установленного в build.gradle. При использовании эмулятора с API 21 все работает нормально. Проблема возникает при отладке на устройстве, имеющем API 19. Каждая строка в стеке вызовов (помеченная как «Фреймы» в AS) правильно показывает имя функции, исходный файл и номер строки, соответствующий API 19. Однако, когда я нажимаю на один Строк, которые соответствуют одному из источников структуры (например, Activity.java), AS некорректно открывается и отображает версию файла API 21, а не версию API 19.

В моей папке sdk для Android у меня есть оба ./sources/android-19 и ./sources/android-21

Любая идея, почему AS отображает неправильную версию файла?

Вещи, которые я пробовал (по порядку):

  • Сброс Android Studio (удаление ~ / .AndroidStudio *)
  • Обновите Android Studio до последней версии
  • Работа на эмуляторе с API 21 – AS показывает правильную версию (21) файлов.
  • Изменение команды compileSdkVersion на 19 и запуск на устройстве API 19 – AS показывает правильные номера строк в стеке вызовов и открывает правильную версию (API 19) файлов в правильной строке.
  • Изменение команды compileSdkVersion на 19 и запуск эмулятора API 21 – AS показывает, что в стеке вызовов номера строк, соответствующие API 21 (что мне кажется правильным поведением), однако, при нажатии на него AS ошибочно открывает API 19, а не версии API 21.

Подводя итог, при нажатии на строку в стеке вызовов AS открывается версия файла, представленная compileSdkVersion, а не та, которая используется устройством / эмулятором во время сеанса отладки.

Ответ на решение здесь:

https://stackoverflow.com/a/32236703/1267536

Полное содержание:

Я довольно часто использую библиотеку поддержки приложений. Изменение команды compileSdkVersion приводит к массивным ошибкам компиляции. Если вы используете appcompat-21, вы должны скомпилировать его против api 21 или получить ошибки компиляции.

Это отлично работает, если вы отлаживаетесь против версии 21. Но когда вы отлаживаете Jelly Bean (API 17), ваш отладчик продолжает отбрасывать вас в источник API 21. Очень раздражает и трудно отлаживать.

Решение, которое я использовал, очень хаки, но работает! Предположим, вы пытаетесь отлаживать API 17. Сделайте следующее:

  1. Mv $ ANDROID_HOME / sources / android-21 $ ANDROID_HOME / sources / android-21-orig
  2. Cp $ ANDROID_HOME / sources / android-17 $ ANDROID_HOME / sources / android-21
  3. Перезапустите андроид-студию, чтобы получить правильные пути.
  4. Отлаживать

Просто не забудьте поместить все каталоги обратно после того, как вы закончите.

Вот отчет об ошибке в этой статье: https://code.google.com/p/android/issues/detail?id=183976

Откройте свой проект в Intellij Idea (на основе Android Studio) и выберите « File -> Project Structure... . В настройке проекта выберите «проект SDK» для версии, которую нужно отлаживать, и выберите для всех модулей проекта «проект SDK» в качестве модуля SDK. После этого вы можете подключить отладочное соединение с вашим устройством / эмулятором и посмотреть правильный источник Android.

Вам не нужно строить проект в Intellij Idea.

Попробуйте отладить приложение на реальном устройстве, скомпилировав его с уровнем SDK устройства. Номера строк в стеках вызовов, вероятно, будут «не синхронизированы» для классов, предоставляемых устройством.

Android Studio не может надежно предоставить правильные источники для вашего запущенного устройства. Даже если в нем будет учитываться версия SDK устройства, от которого вы отлаживаете, прошивка устройства (и, возможно, будет) будет скомпилирована из разных исходных файлов и будет просто совместима с API.

Я думаю, именно поэтому Android Studio просто показывает компилируемые версии SDK классов, предоставляемых целевым устройством. Он просто показывает ссылочную реализацию компилятора.

Измените временное имя папки исходных файлов в SDK. Например, вы скомпилированы против уровня API 23, но устройство, которое вы тестируете и отлаживаете, является уровнем API 15. Затем сначала скомпилируйте и запустите его в режиме отладки, установите точку останова. После этого измените имена:

 $SDK_HOME$/sources/android-23/ -> $SDK_HOME$/sources/android-23-temp/ $SDK_HOME$/sources/android-15/ -> $SDK_HOME$/sources/android-23/ 

И когда это будет сделано, самое время поразить точку останова.

Это решение предполагает, что вы установили оба уровня уровня API из диспетчера SDK.

Ссылка на вопрос, который отслеживает эту проблему.

Android Studio 2.2 исправляет это и перейдет к источникам уровня API, который соответствует тому, на котором вы на самом деле работаете (пока у вас установлены эти источники). Об этом было объявлено.