Экспортированный Service
Описание
Service — это компонент приложения, который может выполнять длительные операции в фоновом режиме. Он не предоставляет пользовательский интерфейс. После запуска Service может продолжать работу в течение некоторого времени, даже после того, как пользователь переключится на другое приложение. Кроме того, другой компонент может привязываться к Service для взаимодействия с ним и даже выполнения межпроцессного взаимодействия (IPC). Например, Service может обрабатывать сетевые транзакции, воспроизводить музыку, выполнять файловый ввод-вывод или взаимодействовать с поставщиком контента — и все это в фоновом режиме.
Вы должны объявить все Services в файле AndroidManifest.xml вашего приложения так же, как вы делаете это для Activity и других компонентов. Чтобы объявить свой Service, добавьте элемент <service>
как дочерний элемент <application>
:
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
Одним из атрибутов Service является android:exported
, он определяет, может ли Service запускаться компонентами других приложений. Если значение атрибута равно true
, любое приложение может получить доступ к Service и запустить его по точному имени класса. Если значение false
, только компоненты одного и того же приложения, приложения с тем же идентификатором пользователя или привилегированные системные компоненты могут запускать этот Service.
Логика значения этого атрибута по умолчанию со временем менялась и различалась в зависимости от типов компонентов и версий Android. Например, на уровне API 16 (Android 4.1.1) или ниже атрибут android:exported
по умолчанию имеет значение true
. Если этот атрибут не задан явно, существует риск того, что на некоторых устройствах будут разные значения по умолчанию. А вот уже с версии API 31 (Android 12) требуется в обязательном порядке явно указывать значение атрибута android:exported
.
Проблема
Ситуация с разными значениями атрибута android:exported
по умолчанию означает, что вы можете случайно раскрыть внутренние компоненты приложения. Таким образом другие приложения неправомерно получают доступ к внутренним компонентам вашего приложения и может произойти утечка конфиденциальных данных или даже выполнение кода в контексте уязвимого приложения.
Рекомендации
Всегда явно устанавливайте атрибут android:exported
. Это не оставит места для интерпретации и четко сигнализирует о вашем намерении относительно видимости компонента.