上传了具有 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 文件中检查所有 activities、services、receiver 使用 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 30
和
compileSdkVersion 30
它应该可以正常工作
在我的例子中 geocoding 是软件包 引起的问题
所以它不会使用 30 SdkVersion 构建
所以我不得不删除异常 指的是 Android S "API 31"
我遇到了同样的错误,我花了 2 天时间尝试修复它。
首先,android:exported="true"
对我不起作用,因为我只添加了一个 activity。
- 我更新了unity版本(当时没用,可能有效果)
- 我在每个 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:
- Downgrade
targetSdkVersion: 30
and compileSdkVersion: 30
in the build.gradle
to be able to build.
- Build the project on an android device
- Then you can check the merged manifest into
/project_name/build/app/intermediates/merged_manifests/debug/out/AndroidManifest.xml
.
现在您可以检查每个缺少 android:exported
的第三方库。并在主清单文件中明确声明它们。
然后你可以改回 targetSdkVersion: 31
和 compileSdkVersion: 31
并检查它是否正常工作。
Android manifest 文件高亮错误,一般在我们使用intent filter的地方,都需要我们设置属性android:exported="true"
默认 activity 应设置为“true”
rest all 可以设置为“true”或“false”,具体取决于我们是否希望其他应用触发我们的 activity/service
对于颤振:
如果您更改了 AndroidManifest 并且仍然遇到相同的错误,则问题是由包引起的。
要识别包,请在“build”文件夹中搜索
我在将 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 文件中检查所有 activities、services、receiver 使用 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 30 和 compileSdkVersion 30
它应该可以正常工作
在我的例子中 geocoding 是软件包 引起的问题 所以它不会使用 30 SdkVersion 构建 所以我不得不删除异常 指的是 Android S "API 31"
我遇到了同样的错误,我花了 2 天时间尝试修复它。
首先,android:exported="true"
对我不起作用,因为我只添加了一个 activity。
- 我更新了unity版本(当时没用,可能有效果)
- 我在每个 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:
- Downgrade
targetSdkVersion: 30
andcompileSdkVersion: 30
in thebuild.gradle
to be able to build.- Build the project on an android device
- Then you can check the merged manifest into
/project_name/build/app/intermediates/merged_manifests/debug/out/AndroidManifest.xml
.
现在您可以检查每个缺少 android:exported
的第三方库。并在主清单文件中明确声明它们。
然后你可以改回 targetSdkVersion: 31
和 compileSdkVersion: 31
并检查它是否正常工作。
Android manifest 文件高亮错误,一般在我们使用intent filter的地方,都需要我们设置属性android:exported="true"
默认 activity 应设置为“true” rest all 可以设置为“true”或“false”,具体取决于我们是否希望其他应用触发我们的 activity/service
对于颤振:
如果您更改了 AndroidManifest 并且仍然遇到相同的错误,则问题是由包引起的。
要识别包,请在“build”文件夹中搜索