升级targetSdkVersion到33后Xamarin.Forms安卓应用出现INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误
将Xamarin.Forms安卓应用的android:targetSdkVersion从30升级至33后,安装时触发以下错误:
ADB0010: Mono.AndroidTools.InstallFailedException: Unexpected install output: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl417360231.tmp/base.apk (at Binary XML file line #50): crc64bf328679f9896e0c.MyFirebaseIIDService: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present]
错误堆栈信息:
at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/external/androidtools/Mono.AndroidTools/Internal/AdbOutputParsing.cs:line 357 at System.Threading.Tasks.Task.Execute() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at AndroidDeviceExtensions.d__12.MoveNext() in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/external/androidtools/Xamarin.AndroidTools/Devices/AndroidDeviceExtensions.cs:line 208 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at AndroidDeviceExtensions.d__12.MoveNext() in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/external/androidtools/Xamarin.AndroidTools/Devices/AndroidDeviceExtensions.cs:line 225 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Xamarin.Android.Tasks.FastDeploy.d__106.MoveNext() in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/Tasks/FastDeploy.cs:line 351 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Xamarin.Android.Tasks.FastDeploy.d__106.MoveNext() in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/Tasks/FastDeploy.cs:line 368 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Xamarin.Android.Tasks.FastDeploy.d__100.MoveNext() in /Users/runner/work/1/s/xamarin-android/external/monodroid/tools/msbuild/Tasks/FastDeploy.cs:line 216 0
当前使用的AndroidManifest.xml代码:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="internalOnly" package="com.myapplication.app" android:versionName="2.6.1" android:versionCode="16"> <uses-sdk android:minSdkVersion="24" android:targetSdkVersion="33" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <uses-feature android:name="android.hardware.location" android:required="false" /> <uses-feature android:name="android.hardware.location.gps" android:required="false" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.location.network" android:required="false" /> <!--<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />--> <uses-permission android:name="android.permission.CALL_PHONE" android:required="false" /> <application android:allowBackup="true" android:requestLegacyExternalStorage="true" android:label="FieldDirect" android:largeHeap="true" android:theme="@style/MyTheme"> <uses-library android:name="org.apache.http.legacy" android:required="false" /> <meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/icon_transparent" /> <meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/brown" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="MyKey" /> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" /> <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="${applicationId}" /> </intent-filter> </receiver> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.myapplication.app.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> </manifest>
错误核心原因:Android 12(API 31)及以上版本强制要求,当组件(Service、Receiver等)包含intent-filter时,必须显式声明android:exported属性。这里的crc64bf328679f9896e0c.MyFirebaseIIDService是Firebase自动生成的服务类,带有intent-filter但未配置该属性。
具体解决步骤:
在AndroidManifest.xml的
<application>标签内,添加该服务的声明并指定android:exported:<service android:name="crc64bf328679f9896e0c.MyFirebaseIIDService" android:exported="false" />(Firebase IID服务无需对外暴露,因此设置为
false即可;若业务需要允许外部调用,可改为true)若使用的Firebase NuGet包版本较旧,建议升级至最新稳定版——新版本库已适配Android 12+的
android:exported要求,可能自动处理此类问题。清理项目缓存,重新生成解决方案后再部署应用,确保Manifest的修改生效。
内容的提问来源于stack exchange,提问作者Manthiram

