Слияние манифеста не нацелено на 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 для этих компонентов приложения. Чтобы решить эту проблему, нам нужно выполнить следующие шаги:
- Нам нужно найти AndroidManifest.xml в основной папке.
android>app>src>main>AndroidManifest.xml
мы должны добавить
android:exported=""
и установите логическое значение внутри этих кавычек. Теперь вы можете спросить, когда мне нужно добавитьandroid:exported="true"
или жеandroid:exported="false"
действиям, службам или широковещательным приемникам, использующим фильтры намерений. Если компонент приложения включает категорию LAUNCHER, задайте для android:exported значение true. В большинстве других случаев установите для android:exported значение false.Это пример того, как это должно выглядеть в вашем AndroidManifest.xml.
Вы можете ознакомиться с дополнительной информацией по этой теме, перейдя по этой ссылке:
Если вы обновите свою студию 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. Поэтому, если вы обнаружите какой-либо файл манифеста библиотеки с отсутствующим экспортированным тегом, попробуйте отредактировать файл и добавить туда этот тег. Надеюсь, что это может помочь в удалении ошибки слияния манифеста.