Переход на Android 8.0

В Android 8.0 (уровень API 26) появились новые функции и API, а также изменилось поведение системы. В этом документе описаны основные этапы переноса приложений на Android 8.0.

  1. Обеспечьте совместимость с Android 8.0

    Убедитесь, что приложение полностью совместимо с новой версией платформы. На этом этапе не нужно использовать новые API или менять targetSdkVersion приложения, но могут потребоваться незначительные изменения.

  2. Обновите целевую версию и используйте функции Android 8.0

    Когда вы будете готовы воспользоваться новыми функциями платформы, обновите targetSdkVersion до 26, убедитесь, что приложение продолжает работать правильно, и начните использовать новые API.

Обеспечьте совместимость с Android 8.0

Цель этого этапа – убедиться, что существующее приложение работает в Android 8.0 (уровень API 26). Некоторые изменения платформы могут повлиять на работу приложения, поэтому вам может потребоваться внести корректировки. Однако использовать новые API или менять targetSdkVersion не нужно.

Как обеспечить совместимость с Android 8.0

Подготовка устройства с Android 8.0

  • Если у вас есть совместимое устройство (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P или Nexus Player), следуйте инструкциям по прошивке.
  • или скачайте образ системы Android 8.0 для Android Emulator. В SDK Manager в разделе Android 8.0 он называется Google APIs Intel x86 Atom System Image.

    Примечание. Образ системы Android 8.0 доступен для скачивания в Android Studio 3.0 и более поздних версиях. Подробную информацию вы найдете в разделе Как получить Android 8.0 SDK.

Проведите тестирование на совместимость

В основном проверка совместимости с Android 8.0 (уровень API 26) включает в себя те же действия, что и подготовка приложения к выпуску. Рекомендуем ознакомиться с рекомендациями по обеспечению качества приложений и рекомендациями по тестированию.

Однако есть и другой аспект тестирования. В Android 8.0 внесены изменения, которые могут повлиять на работу приложения или даже нарушить ее, даже если вы не меняете targetSdkVersion. Поэтому важно ознакомиться с основными изменениями в таблице 1 и протестировать все исправления, которые вы внедряете для адаптации к изменениям.

Таблица 1. Основные изменения, которые затрагивают все приложения, работающие на устройствах с Android 8.0.

Изменить Сводка Дополнительные материалы
Редкое обновление данных о местоположении в фоновом режиме Если ваше приложение получает данные о местоположении от фоновой службы, то в Android 8.0 (уровень API 26) это происходит реже, чем в более ранних версиях Android. В частности, фоновая служба не может получать обновления местоположения чаще нескольких раз в час. Однако когда приложение находится на переднем плане, частота обновления местоположения не меняется. Ограничения на доступ к данным о местоположении в фоновом режиме
Больше не поддерживается net.hostname Запрос системного свойства net.hostname возвращает нулевой результат. Нет
Новое исключение из send(DatagramPacket) Метод send(DatagramPacket) выдает ошибку SocketException, если ранее выполненный метод connect(InetAddress, int) не сработал. Изменения в поведении: подключение к сети и HTTP(S)
Правильные методы NullPointerException из AbstractCollection AbstractCollection.removeAll(null) и AbstractCollection.retainAll(null) теперь всегда вызывают NullPointerException. Ранее NullPointerException не вызывалось, если коллекция была пустой. Это изменение приводит поведение в соответствие с документацией. Изменения в поведении: обработка коллекций
Правильное значение NullPointerException из Currency.getDisplayName(null) Вызов Currency.getDisplayName(null) вызывает NullPointerException. Изменения в поведении: региональные настройки и интернационализация

Более подробный список изменений в поведении Android 8.0 (уровень API 26) можно найти в статье Изменения в поведении Android 8.0.

Обновите целевую версию и используйте функции Android 8.0

В этом разделе объясняется, как включить полную поддержку Android 8.0 (уровень API 26), обновив targetSdkVersion до 26 и добавив новые функции, доступные в Android 8.0.

Помимо новых API, в Android 8.0 внесены некоторые изменения в поведение, когда вы обновляете targetSdkVersion до 26. Поскольку некоторые изменения в поведении могут потребовать изменения кода, чтобы избежать сбоев, сначала следует понять, как изменение targetSdkVersion может повлиять на ваше приложение, ознакомившись со всеми изменениями в поведении приложений, предназначенных для Android 8.0.

Примечание. Прежде чем оптимизировать приложение для Android 8.0, необходимо выполнить описанные выше действия, чтобы обеспечить совместимость с платформой.

Пошаговое руководство по обновлению целевой версии и использованию функций Android 8.0

Как получить Android 8.0 SDK

Чтобы получить пакеты SDK для создания приложения с Android 8.0 (уровень API 26), используйте последнюю версию Android Studio (рекомендуется Android Studio 3.0 или более поздняя). В Android Studio 3.0 и более поздних версиях есть инструменты, которые помогают работать с функциями Android 8.0, такими как адаптивные значки и скачиваемые шрифты. Если эти функции вам пока не нужны, вы можете использовать стабильную версию Android Studio 2.3.3, чтобы создать приложение для Android 8.0 и использовать новые API.

Чтобы настроить любую из версий Android Studio, выполните следующие действия:

  1. Запустите Android Studio и откройте SDK Manager, нажав Tools (Инструменты) > SDK Manager.
  2. На вкладке SDK Platforms (Платформы SDK) установите флажок Show Package Details (Показать сведения о пакете). В разделе Android 8.0 Preview проверьте следующее:
    • Android SDK Platform 26
    • API Google Intel x86 Atom System Image (требуется только для эмулятора).
  3. Перейдите на вкладку SDK Tools и установите флажки рядом со всеми элементами, для которых доступны обновления (нажмите на каждый флажок, в котором есть тире ). В список должны входить последние версии следующих обязательных элементов:
    • Android SDK Build-Tools 26.0.0
    • Android SDK Platform-Tools 26.0.0
    • Android Emulator 26.0.0
  4. Нажмите ОК, чтобы установить все выбранные пакеты SDK.

Теперь вы готовы к разработке приложений для Android 8.0.

Обновите конфигурацию сборки

Обновите compileSdkVersion, targetSdkVersion и библиотеку поддержки до последних доступных версий, например:

android {
  compileSdkVersion 26

  defaultConfig {
    targetSdkVersion 26
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    google()

    // If you're using a version of Gradle lower than 4.1, you must instead use:
    // maven {
    //     url 'https://maven.google.com'
    // }
}

Удалите широковещательные приемники из файла манифеста

В Android 8.0 (уровень API 26) появились новые ограничения для широковещательных приемников, поэтому вам следует удалить все приемники, зарегистрированные для неявных широковещательных намерений. Если вы их оставите, это не приведет к ошибкам при сборке или выполнении приложения, но они не будут работать в Android 8.0.

Трансляции, на которые может отвечать только ваше приложение, – явные намерения трансляции и трансляции, отправленные специально в название пакета вашего приложения, – продолжают работать так же в Android 8.0.

Из этого правила есть исключения. Список неявных широковещательных рассылок, которые по-прежнему работают в приложениях для Android 8.0, можно найти в разделе Исключения для неявных широковещательных рассылок.

Тестирование приложения для Android 8.0

После выполнения описанных выше действий вы можете создать приложение и протестировать его, чтобы убедиться, что оно правильно работает на устройствах с Android 8.0 (уровень API 26). Рекомендуем ещё раз ознакомиться с основными требованиями к качеству приложений и рекомендациями по тестированию.

Если вы создаете приложение с параметром targetSdkVersion, равным 26, вам нужно знать о некоторых изменениях платформы. Некоторые из этих изменений могут существенно повлиять на работу приложения или даже привести к его сбою, даже если вы не используете новые функции Android 8.0.

В таблице 2 приведен список этих изменений со ссылками на дополнительную информацию.

Таблица 2. Основные изменения, которые затронут приложения, если для параметра targetSdkVersion задано значение 26.

Изменить Сводка Дополнительные материалы
Конфиденциальность Android 8.0 (уровень API 26) не поддерживает использование системных свойств net.dns1, net.dns2, net.dns3 и net.dns4. Изменения в поведении: конфиденциальность
Принудительно примененные сегменты с возможностью записи и выполнения В Android 8.0 (уровень API 26) для нативных библиотек действует правило, согласно которому данные не должны быть исполняемыми, а код – доступным для записи. Изменения в поведении: нативные библиотеки
Проверка заголовка и разделов ELF Динамический компоновщик проверяет больше значений в заголовке ELF и заголовках разделов и возвращает ошибку, если они недействительны. Изменения в поведении: нативные библиотеки
Уведомления В приложениях, предназначенных для Android 8.0 (уровень API 26), необходимо реализовать один или несколько каналов уведомлений, чтобы отправлять уведомления пользователям. Обзор API: уведомления
Метод List.sort() Реализации этого метода больше не могут вызывать Collections.sort(), иначе приложение будет выдавать исключение из-за переполнения стека. Изменения в поведении: работа с коллекциями
Метод Collections.sort() В реализациях List Collections.sort() теперь выдает ConcurrentModificationException. Изменения в поведении: обработка коллекций

Более подробный список изменений в поведении Android 8.0 (уровень API 26) можно найти в статье Изменения в поведении Android 8.0.

Чтобы узнать больше о новых функциях и API, доступных в Android 8.0 (уровень API 26), прочитайте статью Функции и API Android 8.0.