针对 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 文件中。我只有一个活动。没有服务或广播接收器。见下文:


<?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")
...
}

你知道我该怎么解决这个问题吗?

59664 次浏览

这个问题是由于在 androidx.test:core库版本 1.3.0中缺少 android:exported属性的3个活动造成的。升级到 1.4.0-beta01版本修复了这个问题。

如果你在针对 Android 12之后出现了错误,最简单的调试方法是:

  • 降级到以前的 sdk 版本
  • 重建计划
  • 在成功构建之后,打开项目的 AndroidManifest.xml
  • 在窗口底部,单击 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的系统,如果它有效,那么你就找到了 bug!

感谢 @ MikePenz为我指明了正确的方向。

我有这个问题,找到它:

  • 如果在 机器人清单文件中有任何活动、服务、接收者或提供者没有 出口属性,那么在该活动、服务、接收者或提供者中添加以下属性

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或更高版本,并且包含使用意图过滤器的活动、服务或广播接收器,则必须显式声明这些应用程序组件的 Android: export 属性。为了解决这个问题,我们需要遵循以下步骤:

  1. 我们需要在主文件夹中找到 AndroidManifest.xml。

android>app>src>main>AndroidManifest.xml

enter image description here

  1. 我们必须添加 android:exported=""并在这些引号中设置一个布尔值。现在您可能会问,什么时候需要将 android:exported="true"android:exported="false"添加到使用意图过滤器的活动、服务或广播接收器中。 如果应用程序组件包含 LAUNCHER 类别,则将 android: 导出设置为 true。

  2. 这是它在 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>

你可以点击这个链接查看更多关于这个主题的信息:

为 Android 12导出更安全的组件

清理和重建这个项目对我来说很有效

我用‘ export = true’正确地设置了我的 Activity,但仍然存在以下问题:

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 的帖子,它可以解释为什么会发生这种情况,并且应用了 酸奶酪建议的解决方法,它对我很有效。

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>

并向它们添加了“ export = true”。

如果你正在使用 DexGuard,你应该更新到最新版本的 9.2.11(19-01-2022)。

引自发行说明:

添加默认配置以保持针对 Android 12的应用程序所需的 exported属性。

如果你将你的机器人工作室升级到大黄蜂2021.1.1。 需要做以下更改: 第一步: 你的 targetSdkVersion必须是30或更高 步骤2: 将 appcompat库更新为 implementation 'androidx.appcompat:appcompat:1.4.1'

步骤3: 在 AndroidManifest 文件中将 android:exported = true添加到您的活动启动程序。

如以下连结所示- Https://developer.Android.com/about/versions/12/behavior-changes-12#exported ,使用意图过滤器的 Android 组件必须明确定义组件导出,否则你的应用不能安装在运行于 Android 12或更高版本的设备上。应用程序组件包括活动、服务、广播接收器和内容提供商。

如果应用程序组件包含 LAUNCHER 类别,则将 android: 导出设置为 true。

即使在设置了 android: export 标记之后,如果您面临 Manifest Merger 失败的问题,那么请检查您在应用程序中使用的所有库。在 Android Studio 的项目视图中打开外部库,并尝试检查包含在项目中的库的所有清单文件。这些库中的任何一个都可能没有根据 Android 12进行更新。因此,如果您发现库的任何清单文件缺少导出标记,请尝试编辑该文件并在其中添加此标记。希望可以帮助删除清单合并错误。