近日,多位 .NET MAUI 开发者反映,在为跨平台应用集成 Google Play Billing 支付库后,项目构建过程频繁出现“error AMM0000”清单合并(manifest merger)错误,导致编译失败。该问题已在 GitHub、Stack Overflow 以及微软开发者社区引发广泛讨论,目前尚无官方统一修复补丁,但社区已摸索出若干临时解决方案。

问题重现:集成支付即崩溃

根据开发者报告,当在 .NET MAUI 项目(目标为 Android 平台)中添加 Google Play Billing Library(通常通过 NuGet 包 Xamarin.GooglePlayServices.Billing 或直接引用 AAR 文件)后,执行 dotnet build 或 Visual Studio 构建时,控制台输出类似以下错误:

error AMM0000: Manifest merger failed with multiple errors, see logs

进一步查看详细日志(可通过 --logger 参数或 -v diag 开启详细输出),通常发现冲突集中在 AndroidManifest.xml 中的 <uses-permission><queries><application> 标签。Google Play Billing 要求声明 com.android.vending.BILLING 权限,并可能在合并过程中与 MAUI 默认生成的清单产生属性覆盖冲突。

错误根源:清单合并机制与版本兼容性

.NET MAUI 在构建 Android 应用时,会自动生成一个基础 AndroidManifest.xml,随后将来自 NuGet 包、AAR 库以及用户自定义的清单进行合并。AMM0000(Android Manifest Merger error)是 Android 构建工具抛出的通用错误代码,通常表示多个清单源之间存在不可调和的冲突。

具体到本次事件,问题主要源于以下三个方面:

  1. 权限声明重复或格式差异:某些旧版 Google Play Billing 库在清单中声明权限时使用了 android:maxSdkVersion 等属性,而 MAUI 默认生成的权限声明未包含该属性,合并工具无法自动合并不同属性值的相同权限节点。
  2. <queries> 标签冲突:Android 11+ 要求应用显式声明查询其他应用的意图(Package Visibility)。Google Play Billing 可能会在清单中引入 <queries> 块,但 MAUI 生成的清单模板在某些版本中未预留兼容空间,导致合并失败。
  3. NuGet 包版本不匹配:部分开发者反映,使用 Xamarin.GooglePlayServices.Billing 的旧版本(如 119.x)与 .NET MAUI 8.0 及以上版本存在依赖冲突,因为 MAUI 本身依赖于特定版本的 Xamarin.AndroidX 和 Google Play Services 基础库。

社区解决方案:手动编辑与版本降级

面对“error AMM0000”,开发者社区已总结出多种可行方法,以下为截至发稿时被验证有效的几项:

1. 显式声明清单合并规则

在项目中创建或编辑 Platforms/Android/AndroidManifest.xml,添加 tools:overrideLibrarytools:replace 属性以覆盖冲突。例如,若冲突提示“Attribute application@allowBackup”重复,可在 <application> 标签中添加:

<application android:allowBackup="false" tools:replace="android:allowBackup">

2. 启用清单合并详细日志并定位冲突

.csproj 文件中添加以下属性:

<PropertyGroup>
  <AndroidManifestMergeLog>true</AndroidManifestMergeLog>
</PropertyGroup>

重新构建后,在 obj/Debug/net8.0-android/AndroidManifest.xml 路径下查看合并后的清单,并对照错误日志手动调整。

3. 降级或升级 NuGet 包版本

降级方案:使用 Xamarin.GooglePlayServices.Billing 版本 117.0.0(对应 Google Play Billing v5.x),该版本在多数 MAUI 8.0 项目中表现稳定。 升级方案:部分开发者成功使用 .NET MAUI 9.0 Preview 版本配合最新的 Google Play Billing v6.x,但需注意仍处于预览阶段。

4. 清理并重新生成项目

有时问题仅由构建缓存导致。执行:

dotnet clean
dotnet restore
dotnet build -f net8.0-android

若仍失败,可尝试删除 objbin 文件夹后重试。

微软官方回应:正在调查中

微软 .NET MAUI 团队已在 GitHub Issue #20178 中确认收到相关报告,并初步定位到问题与 Android SDK 构建工具的版本兼容性有关。预计将在后续的 .NET 9 Release Candidate 中提供修复,但未给出具体时间表。同时,团队建议受影响的开发者暂时使用上述社区解决方案,或考虑在纯原生 Android 项目中先完成支付集成测试。

行业影响与建议

对于正在将 .NET MAUI 应用推向 Google Play 商店的开发者而言,支付集成的构建错误可能严重拖延发布周期。虽然本次问题不涉及运行时崩溃,但阻碍了 CI/CD 流水线的正常进行。

最佳实践建议: - 在项目初期就集成 Google Play Billing,避免后期大规模重构。 - 严格锁定 NuGet 包版本,不要自动更新涉及 Android 清单的依赖。 - 使用 AndroidManifest.xmltools:node="merge" 属性提前声明合并策略。

截至发稿,.NET MAUI 8.0.91 已修复部分低级别清单问题,但 AMM0000 仍未彻底根除。我们将持续关注微软与 Google 的更新,并在第一时间为开发者提供解决方案追踪。