清单合并失败定位 Android 12
Manifest merger failed targeting Android 12
使用 Android Studio 4.2.1,在我的 build.gradle 文件中将 sdk 目标更改为 Android 12 后,出现 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. My_App.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. My_App.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. My_App.app main manifest (this file)
但是 android:exported
标签已经应用到我的 AndroidManifest.xml 文件中。我只有一个activity。没有服务或广播接收器。见下文:
<?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")
...
}
知道如何解决这个问题吗?
此问题是由 androidx.test:core
库版本 1.3.0
中缺少 android:exported
属性的 3 个活动引起的。升级到版本 1.4.0-beta01
解决了这个问题。
如果您在定位 Android 12 后遇到错误,最简单的调试方法是:
- 降级到之前的 SDK 版本
- 重建项目
- 成功构建后,打开项目的
AndroidManifest.xml
。
- 在 window 底部,单击
Merged Manifest
选项卡
- 查找任何包含
<intent-filter>
标签但缺少 android:exported
属性的 <activity>
如果您想确保这些活动是问题所在,请将它们直接添加到项目的 AndroidManifest.xml
文件中,并添加缺少的 android:exported
属性,然后尝试重建项目。
因此,如果 <activity android:name="com.domain.ProblemActivity">
缺少 android:exported
属性,请将其添加到您的 AndroidManifest.xml
文件中,如下所示:
<activity
android:name="com.domain.ProblemActivity"
android:exported="true" >
重新构建目标 Android 12,如果它有效,那么您发现了错误!
感谢 @MikePenz 为我指明了正确的方向。
我遇到了这个问题,通过以下方式找到它:
- 如果您的 AndroidManifest 文件中有任何 activity、服务、接收方或提供商没有 exported 属性然后在 activity、service、receiver 或 provider
中添加以下属性
android:exported="false or true"
别忘了将其也放入服务标签中
<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>
如果您的应用面向 Android 12 或更高版本并且包含使用 Intent 过滤器的活动、服务或广播接收器,则您必须为这些应用组件显式声明 android:exported 属性。为了解决这个问题,我们需要按照以下步骤操作:
- 我们需要在主文件夹中找到 AndroidManifest.xml。
android>app>src>main>AndroidManifest.xml
我们必须添加 android:exported=""
并在这些引号内设置一个布尔值。现在您可能会问我什么时候需要向使用 Intent 过滤器的活动、服务或广播接收器添加 android:exported="true"
或 android:exported="false"
。
如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。
这是您 AndroidManifest.xml
中的示例
<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>
您可以通过关注此 link:
查看有关此主题的更多信息
清理和重建项目对我有用
我的 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 post,这可以解释为什么会发生这种情况,并应用了 yogurtearl 建议的解决方法,它对我有用。
https://github.com/android/android-test/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'。
如果您正在使用 DexGuard,您应该更新到最新版本 9.2.11 (19-01-2022)目前
引自发行说明:
Add default configuration for keeping the exported
attribute as required by applications targeting 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 启动器。
具体如下link-
https://developer.android.com/about/versions/12/behavior-changes-12#exported,使用 Intent 过滤器的 android 组件必须明确定义组件导出,否则您的应用无法安装在运行 Android 12 或更高版本的设备上。应用程序组件包括活动、服务、广播接收器和内容提供者。
如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。
即使在设置 android:exported 标签后,如果您遇到清单合并失败问题,请检查您在应用中使用的所有库。在 Android Studio 的项目视图中打开外部库,并尝试检查项目中包含的库的所有清单文件。根据 Android 12,这些库中的任何一个都可能没有更新。因此,如果您发现库的任何清单文件缺少导出的标签,请尝试编辑该文件并在其中添加此标签。希望这有助于消除清单合并错误。
使用 Android Studio 4.2.1,在我的 build.gradle 文件中将 sdk 目标更改为 Android 12 后,出现 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. My_App.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. My_App.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. My_App.app main manifest (this file)
但是 android:exported
标签已经应用到我的 AndroidManifest.xml 文件中。我只有一个activity。没有服务或广播接收器。见下文:
<?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")
...
}
知道如何解决这个问题吗?
此问题是由 androidx.test:core
库版本 1.3.0
中缺少 android:exported
属性的 3 个活动引起的。升级到版本 1.4.0-beta01
解决了这个问题。
如果您在定位 Android 12 后遇到错误,最简单的调试方法是:
- 降级到之前的 SDK 版本
- 重建项目
- 成功构建后,打开项目的
AndroidManifest.xml
。 - 在 window 底部,单击
Merged Manifest
选项卡 - 查找任何包含
<intent-filter>
标签但缺少android:exported
属性的<activity>
如果您想确保这些活动是问题所在,请将它们直接添加到项目的 AndroidManifest.xml
文件中,并添加缺少的 android:exported
属性,然后尝试重建项目。
因此,如果 <activity android:name="com.domain.ProblemActivity">
缺少 android:exported
属性,请将其添加到您的 AndroidManifest.xml
文件中,如下所示:
<activity
android:name="com.domain.ProblemActivity"
android:exported="true" >
重新构建目标 Android 12,如果它有效,那么您发现了错误!
感谢 @MikePenz 为我指明了正确的方向。
我遇到了这个问题,通过以下方式找到它:
- 如果您的 AndroidManifest 文件中有任何 activity、服务、接收方或提供商没有 exported 属性然后在 activity、service、receiver 或 provider 中添加以下属性
android:exported="false or true"
别忘了将其也放入服务标签中
<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>
如果您的应用面向 Android 12 或更高版本并且包含使用 Intent 过滤器的活动、服务或广播接收器,则您必须为这些应用组件显式声明 android:exported 属性。为了解决这个问题,我们需要按照以下步骤操作:
- 我们需要在主文件夹中找到 AndroidManifest.xml。
android>app>src>main>AndroidManifest.xml
我们必须添加
android:exported=""
并在这些引号内设置一个布尔值。现在您可能会问我什么时候需要向使用 Intent 过滤器的活动、服务或广播接收器添加android:exported="true"
或android:exported="false"
。 如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。这是您 AndroidManifest.xml
中的示例
<service android:name="com.example.app.backgroundService"
android:exported="false">
<intent-filter>
<action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>
</service>
您可以通过关注此 link:
查看有关此主题的更多信息清理和重建项目对我有用
我的 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 post,这可以解释为什么会发生这种情况,并应用了 yogurtearl 建议的解决方法,它对我有用。
https://github.com/android/android-test/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'。
如果您正在使用 DexGuard,您应该更新到最新版本 9.2.11 (19-01-2022)目前
引自发行说明:
Add default configuration for keeping the
exported
attribute as required by applications targeting 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 启动器。
具体如下link- https://developer.android.com/about/versions/12/behavior-changes-12#exported,使用 Intent 过滤器的 android 组件必须明确定义组件导出,否则您的应用无法安装在运行 Android 12 或更高版本的设备上。应用程序组件包括活动、服务、广播接收器和内容提供者。
如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。
即使在设置 android:exported 标签后,如果您遇到清单合并失败问题,请检查您在应用中使用的所有库。在 Android Studio 的项目视图中打开外部库,并尝试检查项目中包含的库的所有清单文件。根据 Android 12,这些库中的任何一个都可能没有更新。因此,如果您发现库的任何清单文件缺少导出的标签,请尝试编辑该文件并在其中添加此标签。希望这有助于消除清单合并错误。