Немного про Manifest & Android 12

Немного про 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.

Но в целом, этого достаточно для решения проблемы.

  1. Откатываемся на прошлый targetSdk
    Это даст нам возможность увидеть полный merged manifest.
  2. Ищем компонент без exported
    В больших проектах, merged manifest это в прямом смысле тысячи строк, которые точно не стоит анализировать вручную.
    Можно воспользоваться вот этим небольшим скриптом.
  3. Исправляем
    Тут несколько вариантов. Можно обновить библиотеку, в которой наверняка уже есть необходимый нам фикс, или передекларировать компонент в manifest вашего проекта, с указанием exported и merge стратегии.
    В оф. документации достаточно подробно описано, как это сделать


___________________________________
@invalidate_cache

Gradle Enterprise & AAB Tests (June 25, 2022)

Report Page