Немного про Manifest & Android 12
Alexey Bykov, Google Developer Expert for AndroidНедавно я столкнулся с обновлением на targetSdk=32
(Android 12).
Одно из нововведений — все компоненты, у которых есть IntentFilter
, в обязательном порядке должны указывать exported. (По умолчанию он true), иначе проект собрать не удастся.
В целом довольно логичный шаг, про существования этого флага не все знали.
Проблема
При сборке, все Manifest-файлы из модулей и 3rd-party библиотек объединяются в один большой. В некоторых компонентах у 3rd party библиотек так же может быть не указан exported
.
Однако, ошибка в этом случае будет не совсем информативной:
Execution failed for task ':app_retail:processReleaseMainManifest'. java.lang.RuntimeException: Manifest merger failed with multiple errors. android:exported needs to be explicitly specified for <receiver>. Apps targeting. Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined.
Решение
В AndroidStudio есть возможность посмотреть merged manifest ещё до этапа компиляции. И кажется, что можно просто найти ломающий всё компонент.
Так же, merged manifest можно посмотреть вот тут: build/${YourApp}/intermediates/merged_manifest/${buildType}/
Однако, process${buildType}MainManifest
не включает в него компоненты без exported
, с targetSdk>=32
.
Но в целом, этого достаточно для решения проблемы.
- Откатываемся на прошлый targetSdk
Это даст нам возможность увидеть полный merged manifest. - Ищем компонент без exported
В больших проектах, merged manifest это в прямом смысле тысячи строк, которые точно не стоит анализировать вручную.
Можно воспользоваться вот этим небольшим скриптом. - Исправляем
Тут несколько вариантов. Можно обновить библиотеку, в которой наверняка уже есть необходимый нам фикс, или передекларировать компонент в manifest вашего проекта, с указаниемexported
иmerge
стратегии.
В оф. документации достаточно подробно описано, как это сделать
___________________________________
@invalidate_cache
Gradle Enterprise & AAB Tests (June 25, 2022)