.NET MAUI发布时Trim失败,GoogleMapsUtilityBinding预编译报错
我有一个使用Google Maps的.NET MAUI应用,Android端采用Xamarin.Android.Maps.Utils NuGet包(最初误记为Xamarin.GooglePlayServices.Maps)。发布时出现GoogleMapsUtilityBinding.dll预编译失败的问题,报错信息如下:
9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Precompiling failed for C:\source\repos\app_with_map_repo\src\MyCompany.ThatApp.Client.Startup\obj\Release\net6.0-android\android-x86\linked\GoogleMapsUtilityBinding.dll. 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Mono Ahead of Time compiler - compiling assembly C:\source\repos\app_with_map_repo\src\MyCompany.ThatApp.Client.Startup\obj\Release\net6.0-android\android-x86\linked\GoogleMapsUtilityBinding.dll 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : AOTID DC1BE4CC-097D-2684-38D8-137DAAC52991 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Using profile data file 'C:\Program Files\dotnet\packs\Microsoft.Maui.Sdk\6.0.547\Sdk\maui.aotprofile' 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Using profile data file 'C:\Program Files\dotnet\packs\Microsoft.Maui.Sdk\6.0.547\Sdk\maui-blazor.aotprofile' 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Added 0 methods from profile. 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Added 0 methods from profile. 9>C:\Program Files\dotnet\packs\Microsoft.Android.Sdk.Windows\32.0.476\targets\Microsoft.Android.Sdk.Aot.targets(91,5): error : Could not load signature of Com.Google.Maps.Android.Data.Renderer:get_ImagesCache due to: Could not load file or assembly 'Xamarin.Android.Support.Compat, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.
地图控件位于单独的类库项目中,我已尝试以下链接配置:
包含地图的类库项目配置
<PropertyGroup> <TargetFrameworks>net6.0-android;net6.0-ios</TargetFrameworks> <UseMaui>true</UseMaui> <SingleProject>true</SingleProject> <ImplicitUsings>enable</ImplicitUsings> .... <TrimMode>link</TrimMode> <PublishTrimmed>True</PublishTrimmed> </PropertyGroup> <ItemGroup> <TrimmerRootDescriptor Include="preserved_assemblies.xml" /> </ItemGroup>
该项目的preserved_assemblies.xml内容:
<linker> <assembly fullname="Xamarin.GooglePlayServices.Maps" preserve="all" /> </linker>
主项目配置
主项目配置与类库类似,仅preserved_assemblies.xml内容不同:
<linker> <assembly fullname="ArsIngenii.Drivers.Client.Controls" preserve="all" /> </linker>
我还尝试在两个项目的preserved_assemblies.xml中添加Xamarin.Android.Support.Compat的保留规则,但问题依然存在。请问哪里操作有误?
解决方案
1. 修正链接文件的保留目标
报错核心是GoogleMapsUtilityBinding.dll依赖的兼容包被裁剪,但你之前的保留规则未覆盖到该组件本身,且Xamarin.Android.Support.Compat已被.NET MAUI迁移至AndroidX体系,需调整保留规则:
更新类库项目的preserved_assemblies.xml:
<linker> <assembly fullname="GoogleMapsUtilityBinding" preserve="all" /> <assembly fullname="Xamarin.Android.Maps.Utils" preserve="all" /> <assembly fullname="AndroidX.Core" preserve="all" /> </linker>
2. 调整AOT或Trim配置
若保留规则无效,可临时禁用AOT编译(仅针对Release配置),在主项目的.csproj中添加:
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net6.0-android|AnyCPU'"> <RunAOTCompilation>false</RunAOTCompilation> </PropertyGroup>
或者降低裁剪力度,将TrimMode改为partial:
<TrimMode>partial</TrimMode>
3. 检查NuGet包兼容性
确保Xamarin.Android.Maps.Utils版本与你的.NET MAUI(net6.0-android)兼容,建议更新至最新稳定版——新版本已迁移至AndroidX依赖,避免使用过时的Xamarin.Android.Support系列包。
4. 直接引用依赖包
在主项目中直接引用Xamarin.Android.Maps.Utils NuGet包,避免仅通过类库间接引用导致的裁剪遗漏。
内容的提问来源于stack exchange,提问作者Mantas Daškevičius

