android:exported被添加但仍然出现错误,针对Android 12及更高版本的应用程序需要为android:exported指定明确的值。

46
我在清单文件的唯一活动中添加了android:exported="true",但在将编译SDK和目标SDK版本更新到31后仍然出现以下错误。我还尝试重建项目,使缓存无效并重新启动,但这没有帮助。 错误-当相应组件具有意图过滤器时,面向Android 12及更高版本的应用程序需要为android:exported指定显式值。有关详细信息,请参见https://developer.android.com/guide/topics/manifest/activity-element#exported。 AndroidManifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xyz.abc">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name=".framework.presentation.BaseApplication"
        android:allowBackup="true"
        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.xyz.presentation.MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
合并清单文件错误。 其他合并的清单文件未包含任何元素 firebase-installations:17.0.0 manifest,versionedparcelable:1.1.1 manifest,runtime:1.0.1 manifest,test:core:1.2.0 manifest......(略)。合并错误:错误:必须显式指定 android:exported 应用程序针对 Android 12 及更高版本需要为具有意图过滤器定义的相应组件指定 android:exported 的显式值。请参见 https://developer.android.com/guide/topics/manifest/activity-element#exported 了解详细信息。 Dairy.app 主清单(此文件)。

1
请检查您合并的清单(例如,通过Android Studio中清单编辑器中的子选项卡)以查看是否有来自需要处理的库的组件。 - CommonsWare
@CommonsWare 合并的清单没有任何显示,但出现了相同的错误-"Error: android:exported 需要明确指定 <activity>。针对 Android 12 及更高版本的应用程序需要在相应组件定义了意图过滤器时为 android:exported 指定一个明确的值"。 - Android Developer
@CommonsWare 如果这是由于某个库引起的问题,我相信我无法更改库活动的清单?而且我除了基本的Android库(如Jetpack Compose、Hilt、Room、Firebase等)之外没有使用任何其他库。 - Android Developer
@CommonsWare在问题中添加了已合并清单完整的错误/日志信息。 - Android Developer
1
如果是由于某个库的原因,我相信我无法更改库活动的清单。但是,您应该能够使用“tools:replace”覆盖“android:exported”值,但需要确定需要它的组件。 - CommonsWare
显示剩余2条评论
23个回答

46

androidx.test:core库的版本为1.3.0。升级到版本1.4.0可以解决问题。


1
它对我有效。我使用的是Android SDK v32。 - Alex Nuts
1
如果您使用的版本低于1.4.0,请不要忘记更新androidx.fragment:fragment-testing版本,否则此答案将不完整。 - ror
好的提示,指引了正确的方向,谢谢! - sud007
6
有相同的问题,不过我的原因是没有将'androidx.test.ext:junit:1.1.1'升级为'androidx.test.ext:junit:1.1.5' - Haomin

34

另请参阅android:exported需要明确指定<activity>。面向Android 12及更高版本的应用程序必须指定

感谢@faizy,@Android Developer的贡献。

将这些库升级到新版本:

androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.fragment:fragment-testing:1.4.1"
androidTestImplementation "androidx.test:core:1.4.0"

我在这些依赖项中用androidTestImplementation替换了debugImplementation

按下Sync Project with Gradle Files。运行项目(或重建,或运行Lint)。可能不会有帮助。然后你应该做这个。

  1. targetSdkVersion降级到30。

再次运行项目。可能会编译。

在我的情况下,所有需要的android:exported="true"android:exported="false"都在合并的AndroidManifestactivityservicereceiverprovider中出现了。<intent-filter>发生。

要找到合并的AndroidManifest,请切换到Project并展开app模块,然后构建 > intermediates > merged_manifest > debug。

enter image description here

如果缺少一些android:exported,请找到相应的AndroidManifest并在其中添加它。

  1. targetSdkVersion升级到31。

再次运行项目。如果无法编译,可能需要重新构建项目。通常情况下,Build > Rebuild Project,File > Invalidate Caches > Invalidate and Restart。

经过一段时间(几次gradle同步、Android Studio重启),它编译成功了。


1
谢谢,我刚刚升级了你提到的依赖项,然后它就奏效了!感谢你节省了我的时间。 - MG Developer
1
谢谢。我现在的目标是Android SDK 33,它也可以工作。秘诀在于“androidx.test:core:1.4.0”。它必须是 >=1.4.0,否则会报错。 - flame3
1
感谢您提供的逐步查找合并清单的方法。结果发现是我们包含的第三方库出了问题。提示:如果在命令行中运行./gradlew,输出会告诉您合并清单中有问题的具体行数。 在我的情况下是:/data/app/vmdl487574943.tmp/base.apk (at Binary XML file line #326): leakcanary.internal.activity.LeakLauncherActivity: - ArtHare
谢谢 @CoolMind。这对我有用。 - Nishara MJ

29
解决目标 SDK 31- 的错误方法如下:
1. 首先将目标 SDK 设置为 30。
2. 然后进入合并的清单文件。
3. 查找是否存在任何未设置 android:exported 的活动、服务、接收器或提供程序。覆盖所有这些条目,并将它们的 android:exported 设置为 truefalse
4. 将目标 SDK 设置回 31,然后运行项目。

按照相同步骤操作后,我在 Xamarin Android 仍然面临相同问题。 - Suchith
这可能不是正确的地方,但我也是从Xamarin错误到这里来的。通过在我的Activity属性中设置Exported = true,我成功解决了问题:[Activity(..., Exported = true)]。@Suchith - garie
根据文档,如果外部应用程序将启动活动,则“导出”应为“true”,否则为“false”。 - garie
1
对于任何想知道如何更改目标 SDK 的人,可以通过在 config.xml 文件中添加或修改 <preference name="android-targetSdkVersion" value="31" /> 这一行来完成。在 Ionic 6 中,合并的清单文件可以在 /platforms/android/app/src/main/AndroidManifest.xml 找到。 - Myo Win
我们能否获取更多关于这个解决方案的细节?如何“转到合并清单”?如何检查是否有未设置android:exported的“activity,servicer,receiver或provider”? - Meekohi

12

以下内容在app/build.gradle中可能是原因。

dependencies {
    debugImplementation androidx.fragment:fragment-testing:<1.4.0-alpha02 or lower>’
}
解决方案1

fragment-testing更新至1.4.0-alpha03或更高版本。

解决方案2

AndroidManifest.xml中添加以下内容。

<manifest>
    <application>
        <activity
            android:name="androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity"
            android:exported="false" />
        <activity
            android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
            android:exported="false" />
        <activity
            android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
            android:exported="false" />
    </application>
</manifest>

1
这个真的很顺利啊!实际上,我甚至是通过检查清单合并选项卡找到了问题。在升级到Android 12时,是这个库出了问题,但我想确保我是正确的。 - sud007

10
如果你正在使用 Flutter,将 `flutter_local_notifications` 升级到最新版本(现在是 9.3.2)可以解决这个错误。

3
谢谢,兄弟,你救了我的一天。 - Bauroziq
1
你救了我一命,老兄,真心感谢。 - Uchenna Nnodim

8
在我的情况下,问题出在一个严格使用版本 1.0.0 的 androidx.test.core 依赖上,因此我无法升级它。我所做的是在主清单文件中将 androidx.test.core 活动添加 android:exported="false",同时使用 tools:node="merge",这样它就能与原始清单文件合并。
<activity
            android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
      android:exported="false"
      tools:node="merge" >
</activity>
<activity
            android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
       android:exported="false"
       tools:node="merge">
</activity>

并添加工具命名空间。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
xmlns:tools="http://schemas.android.com/tools">

这对我来说失败了:执行任务':app:checkDebugDuplicateClasses'失败。 - Alexandre Hansen

3
在我的情况下,将库的实现更新为 "androidx.test:core-ktx:1.4.0" 也起到了作用!这还解决了合并清单文件时出现的错误。

2

如果您使用的是 Ogury 广告,请将以下内容添加到您的 AndroidManifest 文件中:

 <activity
        android:name="io.presage.mraid.browser.ShortcutActivity"
        android:theme="@style/Presage.AdScreen"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>

2
  1. android { compileSdk 31

  2. 重要的是使用最新版本的Gradle和Gradle插件。

  3. 也要将所有依赖项更新为最新版本。

如果问题仍然存在。

  1. 进入您的清单文件。
  2. 在底部点击合并的清单。

Merged Manifest

  1. 检查右下角的错误,找出哪个依赖项导致了错误。
  2. 从上述提到的依赖项中进入该特定的依赖项。

Dependencies

  1. 在合并清单中提到错误的位置设置android:exported="true"android:exported="false"

注意:将该依赖项更新为最新版本可能也会解决该问题。因为在最新版本的依赖项中,exported属性已经被设置。


使用“合并清单”选项卡确实非常有用,可以识别缺少导出属性的活动、服务或接收器。在我的情况下,问题是由于android-beacon-library依赖引起的。将其升级到最新版本即可解决问题。 - matdev

2
我遇到了这个问题,我在AndroidManifest.xml中添加了android:exported="true"tools:node="merge",但是仍然出现了这个错误。 我发现这并不是我的项目活动的问题,而是一些依赖项的问题,例如:
implementation 'com.najva.sdk:najva-android-sdk:1.3.3'

所以请检查您的项目依赖项,您一定会找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接