上传了具有 activity、activity 别名、服务或带有 intentfilter 的广播接收器的 APK,但未设置 'android : exported' 属性

uploaded an APK which has an activity,activity alias,service or broadcast receiver with intentfilter, but without 'android : exported' property set

我在将 app bundle 上传到 Play 控制台时遇到问题,您上传了一个 APK 或 Android App Bundle,它有一个 activity、activity 别名、服务或广播接收器,带有 intent 过滤器,但没有设置 'android:exported' 属性。此文件无法安装在 Android 12 或更高版本上。但我的清单文件包含 属性.

清单文件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="**********">
        <!-- io.flutter.app.FlutterApplication is an android.app.Application that
             calls FlutterMain.startInitialization(this); in its onCreate method.
             In most cases you can leave this as-is, but you if you want to provide
             additional functionality it is fine to subclass or reimplement
             FlutterApplication and put your custom class here. -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-feature android:name="android.hardware.camera" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
        <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
        <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
    
    
        <application
            android:name="io.flutter.app.FlutterApplication"
            android:label="*****"
            android:requestLegacyExternalStorage="true"
            android:usesCleartextTraffic="true"
            android:icon="@mipmap/ic_launcher">
    
    
            <meta-data
              android:name="com.google.firebase.messaging.default_notification_icon"
              android:resource="@drawable/ic_stat_artboard_1" />
    
            <meta-data android:name="com.google.android.geo.API_KEY"
                android:value="Z*********"/>
    
            <provider
                android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
                android:authorities="im.mingguang.mingguang_app.flutter_downloader.provider"
                android:grantUriPermissions="true"
                android:requestLegacyExternalStorage="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/provider_paths"/>
            </provider>
    
            <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>
            <activity
                android:name=".MainActivity"
                android:launchMode="singleTop"
                android:theme="@style/LaunchTheme"
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
                android:hardwareAccelerated="true"
                android:exported="true"
                android:windowSoftInputMode="adjustResize">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
                <intent-filter>
                    <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                    <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
            </activity>
            <!-- Don't delete the meta-data below.
                 This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
            <meta-data
                android:name="flutterEmbedding"
                android:value="2" />
        </application>
    </manifest>

Play 控制台错误

我遇到了同样的问题,但我解决了 在 android:name=".MainActivity" image shown

下方的 activity 中写入 android:exported="true"

如果您的应用面向 Android12 或更高版本并且包含使用 Intent 过滤器的活动、服务或广播接收器,则您必须为这些应用组件显式声明 android:exported 属性。

如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。

以下代码片段显示了一个服务示例,其中包含一个 android:exported 属性设置为 false 的 intent 过滤器:

<service android:name="com.example.app.backgroundService"
         android:exported="false">
    <intent-filter>
        <action android:name="com.example.app.START_BACKGROUND" />
    </intent-filter>
</service>

 <receiver android:name="com.example.app.serives.SilentPushReceiver"
            android:exported="false">
            <intent-filter>
                <!-- Receive silent push notifications. -->
                <action 
                android:name="uz.usoft.kidya.action.ymp.SILENT_PUSH_RECEIVE"/>
            </intent-filter>
</receiver>

<activity android:name="com.example.app.SplashScreenActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

<activity
            android:name="com.example.app.MainActivity"
            android:exported="false"/>

关于信息:https://developer.android.com/about/versions/12/behavior-changes-12#exported

对我来说,将 android:exported="true" 添加到 MainActivity 是不够的。 但我还必须删除用于推送通知的华为 agcp 和 hms 才能让它工作。

它似乎使用了 activity、activity 别名、服务或广播而没有 android:exported

在您的 manifest 文件中检查所有 activitiesservicesreceiver 使用 intent-filter 没有 android:exported 标签。在你的主清单文件中,你可以简单地添加 android:exported 属性 到 activity 标签,所以添加 android:exported="" 并设置一个布尔值这些引号内的值。现在您可能会问我什么时候需要添加 android:exported="true"android:exported="false"使用 Intent 过滤器的活动、服务或广播接收器。如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。

注意:如果有任何 activity 、服务或接收器正在使用,还要检查各个第三方库清单文件,然后您必须在主清单文件中覆盖相同的 activity 、服务或接收器android:exported 属性.

更多解释你可以参考我的answer关于同样的问题。

大约在 1 月 11 日,Play 商店在上传 APK 时引入了 lint 检查,以验证 exported 属性是否在清单中正确设置。

DexGuard 等混淆属性名称的工具将导致 Play 商店 linter 失败,因为它将无法检查 exported 属性。

要解决此问题,请配置混淆工具以将属性名称保留在清单中。
这是我们用于 DexGuard 的规则:

-keepresourcexmlattributenames manifest/**

我在主 activity 中添加了 android:exported="true",但这并没有解决我的问题。

但是,我怀疑这是某些软件包最近才实施的更改。我检查了我的 pub 过时了,并且有一些旧版本的密钥包(在我的情况下,我是 firebase 存储落后的主要版本)。一旦我更新到 pubspec.yaml 中的最新可能版本,编译的文件就会在上传到 Play 商店时被接受。

如果您的应用面向 Android12 或更高版本并且包含使用 Intent 过滤器的活动、服务或广播接收器,则您必须为这些应用组件显式声明 android:exported 属性。

警告:如果 activity、服务或广播接收器使用 Intent 过滤器并且没有为 android:exported 明确声明的值,则您的应用无法安装在设备上运行 Android 12 或更高版本。 如果应用程序组件包含 LAUNCHER 类别,请将 android:exported 设置为 true。在大多数其他情况下,将 android:exported 设置为 false。

以下代码片段显示了一个服务示例,其中包含一个 android:exported 属性设置为 false 的 intent 过滤器:

<service android:name="com.example.app.backgroundService"
     android:exported="false">
<intent-filter>
    <action android:name="com.example.app.START_BACKGROUND" />
</intent-filter>

我遇到了同样的问题 没有发布似乎可以修复它

所以我降级了build.gradle targetSdkVersion 30compileSdkVersion 30

它应该可以正常工作

在我的例子中 geocoding 是软件包 引起的问题 所以它不会使用 30 SdkVersion 构建 所以我不得不删除异常 指的是 Android S "API 31"

我遇到了同样的错误,我花了 2 天时间尝试修复它。 首先,android:exported="true" 对我不起作用,因为我只添加了一个 activity。

  1. 我更新了unity版本(当时没用,可能有效果)
  2. 我在每个 activity 字段中都添加了 android:exported="true",结果确实有效。

我的 unity 游戏现在是这样的:

<?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.unity3d.player" android:installLocation="preferExternal" tools:ignore="MissingLeanbackSupport">
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" />
  <uses-feature android:glEsVersion="0x00020000" />
  <application android:name="androidx.multidex.MultiDexApplication" android:fullBackupContent="false" android:allowBackup="false" android:theme="@android:style/Theme.NoTitleBar" tools:ignore="GoogleAppIndexingWarning,MissingTvBanner" tools:replace="fullBackupContent,allowBackup">
    <!-- UNITY -->
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:resizeableActivity="false" android:hardwareAccelerated="false" android:exported="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
      <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
      <meta-data android:name="android.notch_support" android:value="true" />
    </activity>
    <!-- FULLSCREEN FIX -->
    <meta-data android:name="android.max_aspect" android:value="2.16" />
    <!-- 3rdParty MANIFEST -->
    <activity android:name="com.facebook.unity.FBUnityLoginActivity" android:exported="true" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:name="com.facebook.unity.FBUnityDialogsActivity" android:exported="true" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:name="com.facebook.unity.FBUnityGamingServicesFriendFinderActivity" android:exported="true" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
    <activity android:name="com.facebook.unity.FBUnityAppLinkActivity" android:exported="true" />
    <activity android:name="com.facebook.unity.FBUnityDeepLinkingActivity" android:exported="true" />
    <activity android:name="com.facebook.unity.FBUnityGameRequestActivity" android:exported="true"/>
    <activity android:name="com.facebook.unity.FBUnityCreateGameGroupActivity" android:exported="true"/>
    <activity android:name="com.facebook.unity.FBUnityJoinGameGroupActivity" android:exported="true"/>
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="fb901505887229125" />
    <meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="true" />
    <meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled" android:value="true" />
    <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider901505887229125" android:exported="true" />
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
    <meta-data android:name="unity.allow-resizable-window" android:value="False" />
    <meta-data android:name="notch.config" android:value="portrait|landscape" />
    <meta-data android:name="unity.build-id" android:value="31d4e179-c52c-49d7-a4f5-da548e453521" />
    <receiver android:name="com.unity.androidnotifications.UnityNotificationManager" android:exported="true" />
    <receiver android:name="com.unity.androidnotifications.UnityNotificationRestartOnBootReceiver" android:exported="true" android:enabled="false">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
      </intent-filter>
    </receiver>
  </application>
  <uses-feature android:name="android.hardware.vulkan.version" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

您可以看到 android:exported="true" 添加到每个 activity 和接收器中。

需要将 pubspec.yaml 中使用的所有库更改为更新版本,无论它们是否用于清单文件中的 'exported'。

在我的 flutter 应用程序中,我只需要更改 android/app/src/main/AndroidMainfest.xml.

中的 1 行
 <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize"
        android:exported="true"> //added this line
       
        <meta-data
          android:name="io.flutter.embedding.android.NormalTheme"
          android:resource="@style/NormalTheme"
          />
       
        <meta-data
          android:name="io.flutter.embedding.android.SplashScreenDrawable"
          android:resource="@drawable/launch_background"
          />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

此外,我使用的是 compileSdkversion 31 和 targetSdkVersion 31。

的回答非常适合我。 我正在描述使事情变得更容易的步骤。

1. Enter the following commands on terminal
   flutter pub upgrade --major-versions
   flutter clean
   flutter build appbundle

2. Add android:exported="true" on AndroidManifest.xml
   <activity
        android:name=".MainActivity"
        android:exported="true"
        ...
   </activity>

阅读文档:https://developer.android.com/about/versions/12/behavior-changes-12#exported,如果您的应用面向 Android 12 或更高版本并且包含使用 intent filters 的活动、服务或广播接收器,您必须明确为这些应用程序组件声明 android:exported 属性。

如果您的应用程序很小,您可能只需要在 AndroidManifest.xml 中为每个使用 intent-filter.

的节点添加 android:exported 属性

但是如果您使用许多外部依赖项,仅修改主清单文件可能是不够的。

您可能需要为项目中的每个第三方库执行此操作,其中包含一个没有 android:exported 属性.

intent-filter 节点

您可以在 merged manifest.

中找到所有 activity、activity 别名、服务或广播的列表

If you cannot find it using AndroidStudio:

  1. Downgrade targetSdkVersion: 30 and compileSdkVersion: 30 in the build.gradle to be able to build.
  2. Build the project on an android device
  3. Then you can check the merged manifest into /project_name/build/app/intermediates/merged_manifests/debug/out/AndroidManifest.xml.

现在您可以检查每个缺少 android:exported 的第三方库。并在主清单文件中明确声明它们。

然后你可以改回 targetSdkVersion: 31compileSdkVersion: 31 并检查它是否正常工作。

Android manifest 文件高亮错误,一般在我们使用intent filter的地方,都需要我们设置属性android:exported="true"

默认 activity 应设置为“true” rest all 可以设置为“true”或“false”,具体取决于我们是否希望其他应用触发我们的 activity/service

对于颤振: 如果您更改了 AndroidManifest 并且仍然遇到相同的错误,则问题是由包引起的。 要识别包,请在“build”文件夹中搜索