Xamarin.Android Azure构建使用MSBuild 17失败求助
问题概述
使用macos-12代理的Azure构建流水线,将XamarinAndroid@1任务的msbuildVersionOption从15.0改为17.0后,构建报错:
##[error]Error: The process '/Library/Frameworks/Mono.framework/Versions/Current/Commands/xbuild' failed with exit code 1
Errors:
/Users/runner/work/1/s/Droid/MySample.Droid.csproj: error : /Users/runner/work/1/s/Droid/MySample.Droid.csproj: /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.CSharp.targets: Project file could not be imported, it was being imported by /Users/runner/work/1/s/Droid/MySample.Droid.csproj: Xamarin.Android.Common.targets: Project file could not be imported, it was being imported by /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.CSharp.targets: Xamarin.Android.AvailableItems.targets: Project file could not be imported, it was being imported by /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/Android/Xamarin.Android.Common.targets: The attribute "TfmSpecificPackageFile" in element <"None> is unrecognized.
原因分析
该错误源于Xamarin.Android版本与MSBuild 17.0不兼容:
TfmSpecificPackageFile是MSBuild 17引入的新属性,旧版Xamarin.Android的.targets文件未包含对该属性的定义- macos-12代理预装的Mono/Xamarin.Android版本偏旧,无法适配MSBuild 17的新特性
解决方案
1. 升级项目的Xamarin.Android版本
打开Xamarin.Forms Android项目,将Xamarin.Android SDK和依赖包升级到支持MSBuild 17的版本(建议Xamarin.Android 13.0及以上):
- 右键Android项目 → 属性 → 应用程序,确认目标框架为
Android 13.0 (Tiramisu)或更高 - 打开NuGet包管理器,更新
Xamarin.Android.Support.*、Xamarin.Essentials等依赖到最新兼容版本
2. 替换流水线任务为MSBuild@1
用MSBuild@1任务替代XamarinAndroid@1,直接调用MSBuild 17.0构建,规避xbuild的兼容性问题:
steps: - task: MSBuild@1 displayName: '$(PackageName) - Building Droid' inputs: solution: 'Droid/MySample.Droid.csproj' configuration: 'Release' clean: true msbuildVersion: '17.0' msbuildArchitecture: 'x64' jdkVersionOption: '1.11'
3. 升级代理上的Xamarin.Android环境
若必须使用XamarinAndroid@1任务,可在流水线中添加bash任务更新代理环境:
steps: - bash: | sudo $ANDROID_HOME/tools/bin/sdkmanager --update sudo $ANDROID_HOME/tools/bin/sdkmanager "platforms;android-33" "build-tools;33.0.2" "extras;google;m2repository" "extras;android;m2repository" sudo nuget update -self sudo nuget install Xamarin.Android -Version 13.2.0.11 displayName: 'Update Android SDK and Xamarin.Android' - task: XamarinAndroid@1 displayName: '$(PackageName) - Building Droid' inputs: projectFile: Droid/MySample.Droid.csproj configuration: 'Release' clean: true msbuildVersionOption: 17.0 jdkVersionOption: 1.11
4. 修正项目文件的.targets引用
手动编辑MySample.Droid.csproj,确保导入的.targets路径与升级后的Xamarin.Android版本匹配:
移除旧导入语句,替换为:
<Import Project="$(NuGetPackageRoot)\xamarin.android\13.2.0.11\build\Xamarin.Android.CSharp.targets" />
内容的提问来源于stack exchange,提问作者Renji

