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