Всё, что нужно знать об Android 15: архивирование, защита данных и новые API

Android 15 ворвался в наши жизни с новым усилением безопасности и удобством разработки. Сёрфер Полина, Android-разработчик в Surf, всё посмотрела, попробовала, проанализировала и теперь расскажет, что же там такого интересного. 

Пристальное внимание создатели 15-й версии уделили защите данных пользователей, в том числе, обновлениям в управлении персональной информацией и создании защищенной зоны Private Space для приложений с дополнительной аутентификацией. 

Ещё одно любопытное нововведение — активная поддержка планшетов и складных устройств, новые API и улучшенные инструменты. В Android Studio теперь можно менять размеры экранов виртуальных устройств — теперь разработка адаптивных приложений станет проще.

Что нового

Контроль использования приложений на переднем дисплее

Пользователи теперь будут решать, какие приложения смогут активировать передний дисплей при складывании устройства, а какие — нет. Это позволит, например, включать его для игр и видео.

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

Постоянная панель задач

Теперь можно выбрать панель задач для устройств с большими экранами. Она может быть временная или постоянная.

По сути, это укороченная версия обычной панели задач Android, которую можно вывести с помощью «смахивания» в нижней части экрана. А ещё можно сделать так, чтобы она отображалась постоянно. 

Так, четыре приложения доступны с панели задач. Пятая иконка даёт доступ к селектору для быстрого открытия других приложений в режиме разделенного экрана.

Поддержка складных телефонов 

32f25ff637003f170bdba0a4be0e29ab.jpeg

Android 15 улучшил поддержку складных устройств: Samsung Galaxy Z Fold и Motorola Razr. Разработчики ввели новые API и функции, которые позволяют приложениям адаптироваться к различным конфигурациям экрана и переключениям между режимами (подробности ищите в рекомендациях для разработчиков).

Ещё появилась функция непрерывности. Она позволяет автоматически переключаться между внутренним и внешним дисплеем при закрытии и открытии устройства. Когда смартфон складывается, изображение с внутреннего дисплея переводится на внешний.

Внешний дисплей теперь можно использовать для просмотра презентаций и видео или для воспроизведения музыки, а внутренний — для заметок или управления слайдами. 

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

Адаптивная вибрация 

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

Зачем это нужно? Чтобы, к примеру, увеличить силу вибрации в шумной обстановке и уменьшить её, когда пользователь находится в тихом месте.

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

Архивирование приложений

a3e694a193b73818b4cec5349e718387.png

Киллер фича Android 15 — архивирование. Оно позволяет сохранять данные приложений без их полного удаления — процесс восстановления более удобным. Эта функция также может быть полезна для управления пространством на устройствах с ограниченной памятью.

Допустим, на вашем устройстве есть старая-добрая GTA: San Andreas. Она весит 2,5 ГБ — это не считая пользовательских данных, которые она собирает. 

Вдруг настаёт момент, когда памяти устройства начинает не хватать. И вы решаете удалить эту игру — нет у вас времени в неё играть.

Вы её удалили, всё отлично. Но потом вы снова решаете вернуться в игру. 

Вы её переустанавливаете и… начинате играть с нуля — все ваши достижения, машины, дома в игре — все исчезло. Потому что пользовательские данные удалены. Что делать? Страдать Проходить заново.  

Так вот функция архивирования поможет сохранить эти данные, не удаляя его полностью.

Архивирование позволяет уменьшить «вес» приложения с 4 ГБ до 270 МБ.

Управление виджетами

Виджеты теперь становятся неактивными при принудительной остановке приложения.

Предиктивная анимация возврата

4fb0daf82712ab960bacfe173115ac54.gif

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

Мультимедиа

Улучшенное управление HDR

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

c8b6dd5c29ecf18628ff878fa9cdd4f5.png

Разработчики смогут адаптировать параметры воспроизведения в зависимости от способностей устройства. Например, видеоплеер сможет автоматически определять тип экрана (HDR или SDR) и настраивать яркость и контрастность. 

Поддержка динамической громкости 

Android 15 внедрил стандарт громкости CTA-2075. Он помогает избежать резких изменений уровня громкости при переключении между разными мультимедийными источниками. Это особенно полезно для пользователей, которые часто меняют контент на больших экранах.

О чём тут речь? Когда ваш телефон на всю улицу начнёт орать песню из игры, хотя вы просто зашли собрать урожай, вы точно будете не в восторге. Но Android 15 всё исправил.

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

Режим веб-камеры высокого качества 

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

Расширенные возможности работы с аудио 

Новые API упрощают интеграцию с устройствами MIDI и поддерживают виртуальные MIDI-приложения. 

Теперь музыкальные приложения смогут управлять синтезаторами так же, как если бы они использовали USB-устройства MIDI 2.0.

Частичная демонстрация экрана

18ba08765a418fa87c74f9eb6e857d20.png

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

Поддержка страниц размером 16 КБ


Android 15 теперь поддерживает устройства с 16 КБ страницами памяти. 

Требует пересборки приложений, использующих NDK-библиотеки, для корректной работы на таких устройствах.

Устройства будут работать быстрее и эффективнее. Поддержка страниц уменьшит время загрузки приложений и системы, улучшит работу камеры и снизит потребление энергии.

Поддержка Private Space

Отличия Private Space в Android 15

Характеристика

Android 15

Другие версии Android / Аналоги (например, Samsung)

Степень защиты

Создаёт зашифрованное пространство для приложений и файлов, защищенное дополнительной аутентификацией

Использует сторонние приложения для защиты данных: «Safe Folder» в Google Files

Интеграция в систему

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

Часто требует установки сторонних решений для обеспечения аналогичной функциональности

Скрытие пространства

Возможность полностью скрыть Private Space из списка приложений и исключить уведомления

В большинстве случаев скрытие зависит от настроек сторонних приложений

Управление учетными записями

Рекомендуется создание отдельной учетной записи для управления данными

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

Автоматическая блокировка

Возможность настройки автоматической блокировки Private Space после периода бездействия

Автоматическая блокировка может быть реализована, но не всегда доступна в стандартных настройках

Сохранение данных

Все данные и приложения в Private Space изолированы от основного пространства устройства

Аналогичные функции могут быть реализованы, но с ограничениями на взаимодействие с основным пространством

Новый тип службы переднего плана — mediaProcessing

Этот тип службы подходит для операций типа перекодирования медиафайлов. Службы mediaProcessing могут работать до 6 часов в течение 24-часового периода.

Управление аудиопотоком

При достижении пределов ресурсов все открытые аудиотреки отменяются. Это может повлиять на приложения, которые работают с аудио.

Изменения в поведении служб переднего плана

Введены ограничения на время работы служб dataSync и mediaProcessing — максимум 6 часов за 24 часа. Для корректного завершения служб нужно реализовать метод Service.onTimeout (int, int).

Удаление PNG-формата эмодзи

В Android 15 больше нет старого шрифтп эмодзи (NotoColorEmojiLegacy.ttf), остались только векторные файлы. Придётся адаптировать приложения для использования новых форматов.

Ограничения на запуск служб при получении BOOT_COMPLETED

Новые ограничения запрещают запуск служб приоритета (dataSync, camera и других.) при получении широковещательного сообщения BOOT_COMPLETED.

Рекомендации для разработчиков

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

Для использования новых API нужно обновить файл build.gradle:

android {
    compileSdkVersion "35"
    defaultConfig {
        targetSdkVersion "35"
    }
}

Поддерживаемые устройства

Работаем с Android 15

Чтобы начать работать с Android 15, мы можем выбрать один из следующих подходов:

  • установка на устройство Google Pixel;

  • настройка эмулятора Android;

  • получение общего образа системы (GSI).

Установка Android Studio

Для разработки под Android 15 нужно установить последнюю версию Android Studio (Koala Feature Drop | 2024.1.2 или выше)

После — настраиваем SDK:

1. Открываем меню: Инструменты > Диспетчер SDK.
2. Выбираем пакет Android SDK Platform 35.
3. Устанавливаем последнюю версию Build-Tools.

Чтобы реализовать функцию непрерывности в Android 15 в Android Studio, используем новые API. Они помогают адаптировать приложения к конфигурациям экрана и переключениям между режимами. Давайте разберёмся, как реализовать эту функцию.

Реализация функции непрерывности

Адаптивный интерфейс

С помощью Configuration определяем текущее состояние экрана (сложенный или разложенный) и устанавливаем макет.

override fun onConfigurationChanged(newConfig: Configuration) {
	super.onConfigurationChanged(newConfig)
    
	if (newConfig.isScreenWide()) {
    	// Измените макет для широкого экрана
    	setContentView(R.layout.activity_wide)
	} else {
    	// Измените макет для узкого экрана
    	setContentView(R.layout.activity_narrow)
	}
}

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

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

val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
displayManager.registerDisplayListener(object : DisplayManager.DisplayListener {
	override fun onDisplayAdded(displayId: Int) {
    	// Логика при добавлении дисплея
	}

	override fun onDisplayRemoved(displayId: Int) {
    	// Логика при удалении дисплея
	}

	override fun onDisplayChanged(displayId: Int) {
    	// Логика при изменении состояния дисплея
    	updateContentForDisplay(displayId)
	}
}, null)

// Переключение контента между экранами
private fun updateContentForDisplay(displayId: Int) {
	val display = displayManager.getDisplay(displayId)
	if (display != null && display.isValid) {
    	// Получите информацию о текущем контенте и перенесите его на другой экран
    	transferContentToExternalDisplay()
	}
}

Изменения в поведении приложений

Изменения в API-level 35 повлияют на совместимость приложений по нескольким аспектам.

Ужесточение требований к целевому уровню API 

С 31 августа 2024 года все новые приложения и обновления должны поддерживать Android 14 (API 34) или выше. 

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

Изменения в разрешениях на доступ к мультимедиа 

В Android 15 появились новые разрешения для доступа к медиафайлам. Например, READ_MEDIA_VISUAL_USER_SELECTED. Приложения смогут получить доступ только к тем файлам, которые выбрал пользователь.

if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED), REQUEST_CODE)
}

Ограничения на запуск активностей из фоновых процессов

Приложения, которые работают в фоновом режиме, столкнулись с более строгими ограничениями на запуск активностей. 

Чтобы эти активности запустить, нужно указать разрешение.

 // Пример использования ActivityOptions для разрешения запуска активности из фона
   val options = ActivityOptions.makeBasic().setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
   pendingIntent.send(context, requestCode, options.toBundle())

Необходимость явного указания опции при использовании PendingIntent 

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

 // Создание PendingIntent с опцией для запуска активности из фона
   val pendingIntent = PendingIntent.getActivity(
       context,
       requestCode,
       intent,
       PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
   )

Опция BIND_ALLOW_ACTIVITY_STARTS 

Если приложение связывается с сервисом другого приложения, которое находится в фоновом режиме, необходимо использовать флаг BIND_ALLOW_ACTIVITY_STARTS.

// Пример связывания с сервисом с использованием нового флага
   val serviceIntent = Intent(context, MyService::class.java)
   context.bindService(serviceIntent, serviceConnection, Context.BIND_AUTO_CREATE or Context.BIND_ALLOW_ACTIVITY_STARTS)

Запрет на автоматический переход в foreground

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

Ограничение на отправку implicit intents 

Implicit intents теперь могут быть доставлены только экспортируемым компонентам. Если компонент не экспортирован, стоит использовать явный intent.

 // Пример явного intent
   val explicitIntent = Intent(this, MyActivity::class.java)
   startActivity(explicitIntent)

Исключение для mutable pending intents 

Если приложение создает изменяемый PendingIntent с intent, который не указывает компонент или пакет, система выбрасывает исключение.

// Создание безопасного PendingIntent
   val pendingIntent = PendingIntent.getActivity(
       context,
       requestCode,
       explicitIntent,
       PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
   )

Опции для запуска активности из фона 

Чтобы разрешить запуск активности из фона с использованием PendingIntent, нужно указать опцию.

// Установка опции для разрешения запуска активности из фона
   val options = ActivityOptions.makeBasic().setPendingIntentBackgroundActivityStartMode(
       ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED
   )
  
   pendingIntent.send(context, requestCode, options.toBundle())

Проверка на наличие разрешений 

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

   if (ContextCompat.checkSelfPermission(context, Manifest.permission.SOME_PERMISSION) == PackageManager.PERMISSION_GRANTED) {
       pendingIntent.send()
   } else {
       // Запрос разрешений
       ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.SOME_PERMISSION), REQUEST_CODE)
   }

Изменения в обработке состояния приложения

Если приложение находится в состоянии остановки (Stopped State), все PendingIntents будут удалены. Приложение получит BOOT_COMPLETED broadcast после выхода из этого состояния.

Запрет на динамическую загрузку кода 

Динамически загружаемый код теперь должен помечаться атрибутом доступа в режиме только для чтения. Это предотвращает выполнение потенциально вредоносного кода.

// Пример использования атрибута доступа только для чтения
   @ReadOnlyAccess
   fun loadDynamicCode() {
       // Логика загрузки кода
   }

Ограничение на обработку zip-архивов

В функциях ZipFile (String) и ZipInputStream.getNextEntry () теперь запрещена обработка zip-архивов, пути в которых начинаются с символа »/» или содержат последовательность »…». Разработчики теперь должны проверять пути перед обработкой файлов.

 val zipFile = ZipFile(zipFilePath)
   if (zipFilePath.startsWith("/") || zipFilePath.contains("..")) {
       throw IllegalArgumentException("Invalid zip file path")
   }

Ужесточение требований к доступу к внутренним компонентам 

Система запрещает отправлять intent-запросы к некоторым внутренним компонентам платформы без указания соответствующих атрибутов доступа. 

Разработчикам придётся указывать атрибуты в манифесте приложения.

 

Что в итоге

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

Мы, в отделе Android-разработки и тестирования, активно пользуемся 15-й версией. И надо сказать, нам очень нравится. Из самого удобного — Android 15 обзавёлся функциями архивирования и непрерывности для устройств со складным экраном. 

А ещё теперь мы можем более удобно управлять виджетами и мультимедийным возможностями.  Мы получили новые API для более точного контроля параметров HDR, возможность динамической настройки яркости и контрастности в зависимости от сцен. И, конечно, режим веб-камеры и настройку динамической громкости.

Так что пробуйте и делитесь впечатлениями!

Больше полезного про Android — в Telegram-канале Surf Android Team. 

Кейсы, лучшие практики, новости и вакансии в команду Android Surf в одном месте. Присоединяйтесь!

© Habrahabr.ru