Android Q Beta 1 — Обзор изменений для разработчиков

Хотите узнать больше интересных новостей из мира Android разработки — подписывайтесь на Telegram канал Android Broadcast

13 марта 2019 Google представил первую beta версию Android Q. Всего планируется 6 beta версий перед релизом, который состоится в 3-м квартале 2019. Как всегда, самое сладкое нас будет ждать в Beta 3, которую представят с открытием Google I/O 2019.

План выхода версий Android Q

Вектор изменений в новой версии Android направлен на улучшение безопасности: обновление системы разрешений, ограничение доступа к файлам на внешнем хранилище, больше возможностей пользователю для контроля доступа приложений к различным данным и выполнению операций. Одно из нововведений — поддержка сгибаемых смартфонов, но его не представляется возможным проверить из-за отсутствия устройства или эмулятора.

Уже сейчас обладатели Pixel любого поколения могут установить бета версию, причем в этом году ее уже можно получить по воздуху. Для этого вам надо вступить в Android Beta Program.

Не рекомендую ставить эту версию Android на свое личное устройство, так как прошивка имеет известные проблемы и не готова для повседневного использования.

Давайте подробнее рассмотрим, что изменится для разработчиков при адаптации приложения для Android Q.

Безопасность

Доступ к файлам

Изменения затрагивают способы чтения/записи файлов на внешнем хранилище и безопасность данных:

Ограничения запуска Activity из фона

Чтобы не мешать пользователю, в новой версии Android теперь нельзя простым вызовом startActivity(Intent) запустить новую Activity. Приложение в Android Q может запустить Activity в случае если:

  • Приложение имеет видимое окно, например Activity с которой взаимодействует пользователь.
  • Другое приложение, с которым сейчас взаимодействует пользователь отправляет PendingIntent, относящийся к вашему приложению.
  • Система отправляет PendingIntent, относящийся к вашему приложению, например, нажатие на уведомление в системной панели.
  • Система отправляет broadcast вашему приложению, например ACTION_SECRET_CODE. В исключение попадают только те broadcast, которые потенциально могут запустить UI (список их я не нашел).
Замечание: приложение не считается видимым, если не имеет видимых Activity и имеет только Foreground Service.

Ограничения применяются для всех приложений, независимо от targetSdk вашего приложения. Вместо запуска Activity предлагается показывать уведомления со всей необходимой информацией для пользователя.

Ограничения доступа приложений к местоположению пользователя

Объявление Foreground Service, который имеет доступ к геопозиции

Изменения в данных и идентификаторах

Изменения в данной категории касаются всех приложений, независимо от targetSdk≤ 28.

Прочие ограничения

Изменения в системных разрешениях

Новые функции и API в Android Q

Безопасность

Wi-Fi и Bluetooth

Телефония

Медиа и графика

C Dynamic Depth вы можете сделать эффекты blur и boken в вашем приложение
  • Поддерка Vulkan 1.1.
  • Поддержка ANGLE — проект в Chrome который реализует ES слой поверх Vulkan. Подробнее смотрите ANGLE.
  • Добавлена поддержка open source кодека AV1 и Opus. AV1 позволяет предоставлять трансляцию видео высокого качества на Android устройствах, используя меньшую пропускную способность.
    Opus — это кодек, оптимизированный для речи и стриминга музыки. Также Opus включает поддержку HRD10+ для видео с расширенным динамическим диапазоном на устройствах.

Settings Panels

Новое API в Android Q — Settings Panel, которое позволяет показывать настройки пользователю в контексте вашего приложения. Это убирает необходимость выхода пользователя из вашего приложения, чтобы включить NFC или подключиться к точке доступа.

Пример работы Settings Panel на пример Chrome

Сейчас в настройках можно сконфигурировать подключение к интернету, NFC и громкость. Кастомизировать диалог нельзя, он системный.

Роли (Roles)

В Android Q представлено стандартное средство — роли. Механизм позволяет задавать в системе приложение по умолчанию для определенной функции — роли. Это позволяет ОС предоставлять приложению расширенный доступ к системным функциям, основываясь на распространненых сценариях использования приложения. Каждая роль представляет собой один сценарий, например проигрывание музыки, просмотр фотографий в галерее или отправку SMS сообщений.

В Android Q Beta 1 есть следующие роли:

Внимание: список ролей и функций, соответствующих им, может измениться в будущих Beta версиях

Для того, чтобы получить роль, приложение должно соответствовать опеределенным требованиям. Если приложение потеряет свою роль, это вызовет потерю соответствующего доступа.

Больше подробностей читайте здесь.

Улучшения в Sharing

Sharing Shortcuts API

Механизм Direct Share API заменён новым Sharing Shortcuts API. Sharing Shortcut API позволяет вместо получения результатов по запросу публиковать их заранее, работая по аналогии с ShortcutManager. Это решает проблему низкой скорости Direct Share, так как старый механизм работал по принципу Pull, а новый — по Push.

Sharing Shortcut API очень похож по работе с ShortcutManager, поэтому авторы API просто расширили ShortcutInfo чтобы упростить работу с этими API.

Пример работы Sharing Shortcut

Больше подробностей о Sharing Shirtcuts API можно найти здесь.

Direct Share останется работать, но будет иметь более низкий приоритет, чем Sharing Shortcuts.

Android Runtime (ART)

  • Улучшение в производительности ART, которое позволяет ускорить запуск приложений и потреблять меньше памяти, без необходимости модификации чего либо со стороны разработчиков.
  • Агрегированные ART профили, которые загружаются вместе с APK из Google Play. В отличие от работы на предыдущих версиях ОС, теперь собирается анонимная информация с нескольких устройств, а не только с одного.
  • ART больше не позволяет выполнять dex2oat из процесса приложения, теперь только система может генерировать oat файлы.
  • Скорость запуска процесса Zygote стала быстрее.
  • Образ Heap-а приложения содержит больше данных, позволяющих ускорить загрузку образа.
  • Добавлен Generation Garbage Collection в ART Concurrent Copying (CC) Garbage Collector. Generational CC более эффективный, так как собирает объекты young-generation отдельно, что делает стоимость очистки памяти более низкой по сравнению с full-heap GC.

Прочие изменения

Важно! Многие изменения еще не активированы, так как первая Beta предназчена только ознакомления разработчиков с изменением поведения ОС. Их можно включить через ADB либо в Developers Options.

Очень много интересных изменений происходят внутри Android SDK и не освещаются подробно. Я решил покопаться в API Diff Report и рассказать о том, что я обнаружил

Важно: информации о некоторых классах/интерфейсах очень мало и она может измениться в будущих Beta.

Новые классы

ZygotePreload

ZygotePreload — это интерфейс, который должен реализовывать класс, отвечающий за предзагрузку кода и данных приложения, которые будут доступны всем изолированным Service-ам, которые укажут в AndroidManifest android:useAppZygote=”true”.

Media API 2

В пакете android.media добавлены классы MediaPlayer2, MediaSession2, MediaController2 и пр. с версией “2” в конце имени. Суть отличий пока я найти не смог, ждем Google I/O.

RecoverableSecurityException

Новый exception RecoverableSecurityException, которые расширяет SecurityException и содержит информацию как пользователь может исправить проблему.

StatusBarManager

StatusBarManager дает возможность управлять Status Bar из приложения

Android Parcel

Добавлена поддержка boolean, ArrayMap<String, *> и List<Parcelable>

FileUtils

Файловые утилиты для копирования данных и закрытия некоторых источников, игнорируя ошибки.

android.graphics.font

Новый пакет, содержащий классы по работе со шрифтами: созданием, получением данных из них. Также появилась возможность получить системные шрифты.

Systrace

В класе Trace добавлена возможность записи выполнения асинхронных секций с помощью beginAsyncSection(String methodName, int cookie) и задание счетчика с setCounter (String counterName, long counterValue).

Deprecated

Notification

Добавлена возможность задавать системе может ли она генерировать action на основе контекста, например, для ответа на сообщение.

Одна из интересных новых API NotificationManager.setNotificationDelegate(String deleage), который позволяет задать приложение, которое может постить уведомления от имени вашего приложения. При этом запуск вашего приложения происходить не будет.

ZenPolicy

ZenPolicy определяет разрешать ли определенным уведомлениям проигрывать звуки и показывать визуальные эффекты, когда устройство находиться в “Do Not Disturb” режиме. К сожалению, я не смог найти где применяется этот класс.

Developers Options

Также произошло немного изменений в Developers Options:

  • Невозможно принудительно задать темную тему. Настройка была удалена. Теперь это можно сделать только через adb
  • “Allow background Activity starts” позволяющим принудительно вступить в силу новым изменениям
  • “Force desktop mode”. О режиме десктопа уже ходили спойлеры, но пока от него только тумблер в настройках разработчика. Ждем Google I/O
  • “Restrict SMS & call log access” включает доступ к SMS и журналу звонков только приложениям для SMS и звонков по умолчанию
  • “Disable device identifiers restrictions” отключает новые ограничения по доступу к постоянным идентификаторам устройства

В заключение скажу, что обновление ОС получилось довольно интересным. Я считаю, что Google, начиная с Android 6 Marshmallow, взяла правильный курс на более строгий доступ к функционалу системы сторонними приложениями и увеличению безопасности работы пользователя, что заставляет разработчиков делать более качественный и безопасный софт. Также улучшению системы способствует то, что Google заставляет разработчиков раз в год адаптировать приложения под более новые версии ОС. Остается дождаться Google I/O 7–9 мая, чтобы узнать самые интересные анонсы, касательно Android Q и других продуктов Google.