Перейти к содержанию

Экспортированный 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. Это не оставит места для интерпретации и четко сигнализирует о вашем намерении относительно видимости компонента.

Ссылки

  1. Экспортируемость компонентов

  2. About Services

К началу