清单合并失败定位 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 属性。为了解决这个问题,我们需要按照以下步骤操作:

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

android>app>src>main>AndroidManifest.xml

  1. 我们必须添加 android:exported="" 并在这些引号内设置一个布尔值。现在您可能会问我什么时候需要向使用 Intent 过滤器的活动、服务或广播接收器添加 android:exported="true"android:exported="false"。 如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。

  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>

您可以通过关注此 link:

查看有关此主题的更多信息

Safer component exporting for Android 12

清理和重建项目对我有用

我的 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,这些库中的任何一个都可能没有更新。因此,如果您发现库的任何清单文件缺少导出的标签,请尝试编辑该文件并在其中添加此标签。希望这有助于消除清单合并错误。