Flutter无法为Android 12构建应用程序。

3

我正在尝试构建我的Flutter应用程序以支持Android 12。它在Android 11之前运行良好,但不支持Android 12。我尝试添加android:exported="true"或者"false",但没有起作用。如果有人知道,请帮忙解决。

错误日志

错误:ADB退出并显示退出代码1 执行流安装

adb:安装失败 /Users/shrikrishna/Manoj/Projects/Flutter/Myapp/build/app/outputs/flutter-apk/app.apk: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:在安装包LI期间解析失败: /data/app/vmdl158598875.tmp/base.apk(位于二进制XML 文件第1230行): com.dooboolab.TauEngine.FlautoBackgroundAudioService:面向S + (版本31及以上),要求当存在意图过滤器时定义android:exported的显式值]在sdk gphone64 x86 64上启动应用程序时出错。


你的SDK版本是多少? - Jahidul Islam
我的 SDK 版本是 31。 - user14805610
具体来说,这个服务 FlautoBackgroundAudioService 需要 exported 标志。如果这是来自库的话,您可以手动添加它。 - Darshan
我没有使用FlautoBackgroundAudioService。 - user14805610
@user14805610,你在Flutter中使用某个音频库吗?也许那个库使用了这个类。 - Nitish
4个回答

3

您需要在使用任何intent-filter的每个活动、服务或广播接收器上设置android:exported="true""false"。请注意,如果您有多个依赖项,并且在这些依赖项中如果它们有自己的活动、服务或广播接收器,我们还需要在每个依赖项上添加这些android:exported

但显然,某些依赖项可能尚未更新以符合此标准。所以现在我们可以通过将其添加到我们自己的应用程序清单中来解决这个问题。

要做到这一点:

1. 检查是否合并清单

首先构建应用程序,然后检查生成的清单文件夹中的合并清单。这通常位于目录./build/app/intermediates/merged_manifest/debug/out/AndroidManifest.xml。打开它,找到此文件中的任何标记<intent-filter>,并注意活动、服务或广播类名。例如:

        <receiver
            android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" >
            <intent-filter>
                ....
            </intent-filter>
        </receiver>

2. 修改应用清单文件。

打开您的项目应用清单文件,在清单标签上添加tools命名空间:xmlns:tools="http://schemas.android.com/tools"

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

接着在清单文件中加入这些类,并且添加额外的属性 android:exported="false",同时确保也在其上添加 tools:node="merge"。例如:

        <receiver
           android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver" 
           android:exported="false"
           tools:node="merge" />

您不需要在项目清单文件中添加其他属性或意图过滤器,因为这些内容已经添加到插件的清单文件中。您只需要添加这些 exportedtools:node="merge" 属性,以使清单文件中的属性和值合并。

最后,先在本地运行它,并确保所有具有意图过滤器的 Activity/services/broadcast receiver 都具有这些属性(注:合并后的清单文件上将不会出现 tools:node 属性)。


1

将您的项目升级到最新的flutter版本。 升级您的依赖项,在所有AndroidManifest.xml文件中搜索标签,还要在您的清单依赖项文件中进行更改 service ....></service> 或者 <service .... android:exported="false"></service>

更改为 <service .... android:exported="true"></service>


0

我采用了不同的方法来解决这个错误。在我的情况下,我有一个名为com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver的接收器核心组件,没有导出属性。在哪里?我不知道。

所以我在运行flutter pub get后,在我的插件文件夹中找到了它的存在。经过搜索后,我阅读了flutter_local_notifications版本“4.0.1+2”的清单并看到了错误。 因此,我在其上添加了android:exported="true",并在模拟器上重试了flutter run。

 <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
            <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
        </intent-filter>
    </receiver>

这不是一个解决方案,因为我必须在清理项目后重新编写此清单。


0

只需按照以下步骤:

1 设置 targetSdkVersion 和 compileSdkVersion 为 32

2 打开 AndroidManifest.xml,在 application 标签中添加以下内容 -

usesCleartextTraffic="true"

androidSupportRtl="true"

3 在 activity 中设置 android:exported="true"


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