В Android 8.0 (уровень API 26) появились новые функции и API, а также изменилось поведение системы. В этом документе описаны основные этапы переноса приложений на Android 8.0.
- Обеспечьте совместимость с Android 8.0
Убедитесь, что приложение полностью совместимо с новой версией платформы. На этом этапе не нужно использовать новые API или менять
targetSdkVersionприложения, но могут потребоваться незначительные изменения. - Обновите целевую версию и используйте функции Android 8.0
Когда вы будете готовы воспользоваться новыми функциями платформы, обновите
targetSdkVersionдо 26, убедитесь, что приложение продолжает работать правильно, и начните использовать новые API.
Обеспечьте совместимость с Android 8.0
Цель этого этапа – убедиться, что существующее приложение работает в Android 8.0 (уровень API 26). Некоторые изменения платформы могут повлиять на работу приложения, поэтому вам может потребоваться внести корректировки. Однако использовать новые API или менять targetSdkVersion не нужно.
Подготовка устройства с 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 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, выполните следующие действия:
- Запустите Android Studio и откройте SDK Manager, нажав Tools (Инструменты) > SDK Manager.
- На вкладке SDK Platforms (Платформы SDK) установите флажок Show Package Details (Показать сведения о пакете). В разделе Android 8.0 Preview проверьте следующее:
- Android SDK Platform 26
- API Google Intel x86 Atom System Image (требуется только для эмулятора).
- Перейдите на вкладку SDK Tools и установите флажки рядом со всеми элементами, для которых доступны обновления (нажмите на каждый флажок, в котором есть тире
). В список должны входить последние версии следующих обязательных элементов:
- Android SDK Build-Tools 26.0.0
- Android SDK Platform-Tools 26.0.0
- Android Emulator 26.0.0
- Нажмите ОК, чтобы установить все выбранные пакеты 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.