Слияние манифеста не нацелено на Android 12

Используя Android Studio 4.2.1, после изменения цели sdk на Android 12 в моем файле build.gradle я получаю Manifest merger failed with multiple errors, see logs ошибка.

Ошибки, показанные в Merged Manifest Вкладка следующие:

      Merging Errors: 
Error: 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. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. Sunny_Side.app main manifest (this file) 
Error: 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. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. Sunny_Side.app main manifest (this file) 
Error: 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. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. Sunny_Side.app main manifest (this file) 

Тем не менее android:exportedТег уже применен в моем файле AndroidManifest.xml. У меня только одно занятие. Никаких сервисов или радиоприемников. См. ниже:

      
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mydomain.myapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <application
        android:name="com.mydomain.myapp.MyApplication"
        android:allowBackup="false"
        tools:replace="allowBackup"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name="com.mydomain.myapp.ui.MainActivity"
            android:exported="true">
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" />
    </application>

</manifest>

Мой файл build.gradle(:app):

      android {
    compileSdkVersion("android-S")
    buildToolsVersion "30.0.3"

    defaultConfig {
        ...
        minSdkVersion 23
        targetSdkVersion("S")
        ...
}

Есть идеи, как я могу решить эту проблему?

10 ответов

Проблема была вызвана тем, что у трех действий отсутствует атрибут в androidx.test:core версия библиотеки 1.3.0. Обновление до версии 1.4.0-beta01 исправил проблему.

Если вы получаете ошибки после настройки Android 12, самый простой способ отладить это:

  • перейти на предыдущую версию SDK
  • перестроить проект
  • после успешной сборки откройте файл проекта.
  • внизу окна нажмите на Merged Manifest вкладка
  • ищи любой <activity> это включает <intent-filter> тег и отсутствует атрибут

Если вы хотите убедиться, что именно эти действия являются проблемой, добавьте их прямо в файл проекта с отсутствующим атрибутом и попробуйте перестроить его.

Так что если <activity android:name="com.domain.ProblemActivity"> отсутствует android:exported, добавьте его в свой AndroidManifest.xml файл так:

      <activity 
 android:name="com.domain.ProblemActivity"
 android:exported="true" >

Спасибо @MikePenz за то, что указал мне в правильном направлении.

Если ваше приложение предназначено для Android 12 или более поздней версии и содержит действия, службы или широковещательные приемники, использующие фильтры намерений, вы должны явно объявить атрибут android:exported для этих компонентов приложения. Чтобы решить эту проблему, нам нужно выполнить следующие шаги:

  1. Нам нужно найти AndroidManifest.xml в основной папке.

android>app>src>main>AndroidManifest.xml

  1. мы должны добавить android:exported=""и установите логическое значение внутри этих кавычек. Теперь вы можете спросить, когда мне нужно добавить android:exported="true"или же android:exported="false"действиям, службам или широковещательным приемникам, использующим фильтры намерений. Если компонент приложения включает категорию LAUNCHER, задайте для android:exported значение true. В большинстве других случаев установите для android:exported значение false.

  2. Это пример того, как это должно выглядеть в вашем AndroidManifest.xml.

Вы можете ознакомиться с дополнительной информацией по этой теме, перейдя по этой ссылке:

Более безопасный экспорт компонентов для Android 12

Если вы обновите свою студию Android до Bumblebee 2021.1.1. Следующие изменения необходимы для выполнения: Шаг 1: Ваш targetSdkVersionдолжно быть 30 или выше Шаг 2: Обновите appcompatбиблиотека в implementation 'androidx.appcompat:appcompat:1.4.1'

Шаг 3: В файле AndroidManifest добавьте android:exported = trueв панель запуска вашей активности.

У меня была правильная настройка Activity с «exported = true», и у меня все еще была следующая проблема:

      Installation failed due to [...] androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present

Итак, я наткнулся на этот пост Github, который может объяснить, почему это происходит, и применил обходной путь , который предлагает yogurtearl , и это сработало для меня.

https://github.com/android/android-тест/issues/832

В основном это выглядит так:

В качестве обходного пути, поместив это в app/src/debug/AndroidManifest.xml, он заставит их запускаться в том же тестовом процессе.

          <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity"
        android:exported="true"
        android:theme="@android:style/Theme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
        android:exported="true"
        android:theme="@android:style/Theme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
        android:exported="true"
        android:theme="@android:style/Theme.Dialog" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>

И добавил к ним «exported=true».

У меня была эта проблема, найдите ее:

  • если  в вашем файле AndroidManifest есть действие, услуга, получатель или поставщик, не имеющий  экспортированного атрибута, добавьте в это действие, услугу, получатель или провайдер указанный ниже атрибут.

Не забудьте также указать его в сервисном теге.

          <service
        android:name=".service.MyIME"
        android:exported="true"
        android:permission="android.permission.BIND_INPUT_METHOD">
        <meta-data
            android:name="android.view.im"
            android:resource="@xml/method" />

        <intent-filter>
            <action android:name="android.view.InputMethod" />
        </intent-filter>
    </service>

Если вы используете DexGuard , вам следует обновиться до последней версии 9.2.11 (19-01-2022) на данный момент.

Цитата из примечаний к выпуску:

Добавить конфигурацию по умолчанию для сохранения exportedатрибут в соответствии с требованиями приложений, ориентированных на Android 12.

Очистка и перестроение проекта сработали для меня

У меня возникла такая же проблема после того, как я выбрал Android 12 в своем проекте. Проблема была в том, что проект довольно большой, с множеством AndroidManifest.xmlфайлы и отсутствуют во многих местах. В итоге я создал задачи Gradle, чтобы заполнить недостающие android:exportedатрибуты автоматически для меня. Я подумал, что могу поделиться этим, если кто-то также имеет дело со сложными проектами, в том числе для будущих ищущих. Вот ссылка. На самом деле был бы признателен за любую обратную связь, особенно если задачи не работают для вашей установки.

Как указано в следующей ссылке: https://developer.android.com/about/versions/12/behavior-changes-12#exported , компоненты Android, использующие фильтры намерений, должны явно определять экспорт компонентов, в противном случае ваше приложение нельзя установить на устройство под управлением Android 12 или выше. Компоненты приложения включают действия, службы, широковещательные приемники и поставщиков контента.

Если компонент приложения включает категорию LAUNCHER, задайте для android:exported значение true. В большинстве других случаев установите для android:exported значение false.

Даже после установки тега android:exported, если вы столкнулись с ошибкой слияния манифеста, проверьте все библиотеки, которые вы используете в своем приложении. Откройте внешние библиотеки в представлении проекта Android Studio и попробуйте проверить все файлы манифестов библиотек, которые вы включили в свой проект. Любая из этих библиотек могла не обновиться в соответствии с Android 12. Поэтому, если вы обнаружите какой-либо файл манифеста библиотеки с отсутствующим экспортированным тегом, попробуйте отредактировать файл и добавить туда этот тег. Надеюсь, что это может помочь в удалении ошибки слияния манифеста.

Другие вопросы по тегам