.NET MAUI项目Azure流水线Sonar阶段dotnet build遇XA3007链接错误
问题现象
添加SonarQube扫描阶段后,执行dotnet build时触发以下错误:
##[error]/Users/runner/.dotnet/packs/Microsoft.Android.Sdk.Darwin/33.0.95/tools Error XA3007: Could not link native shared library: libxamarin-app.so
stderr | ld: error: cannot open obj//net7.0-android/android/typemaps.armeabi-v7a.o: No such file or directory
stderr | ld: error: cannot open obj//net7.0-android/android/environment.armeabi-v7a.o: No such file or directory
stderr | ld: error: cannot open obj//net7.0-android/android/compressed_assemblies.armeabi-v7a.o: No such file or directory
stderr | ld: error: cannot open obj//net7.0-android/android/jni_remap.armeabi-v7a.o: No such file or directory
##[error]/Users/runner/.dotnet/packs/Microsoft.Android.Sdk.Darwin/33.0.95/tools/Xamarin.Android.Common.targets(2010,3): Error XA3007: Could not link native shared library: libxamarin-app.so
可行解决方案
- 调整Sonar与构建阶段顺序:确保
SonarQubeBegin在dotnet restore之后、dotnet build之前执行,且扫描配置不要覆盖构建的输出路径参数,避免Sonar的临时文件逻辑干扰Android构建的中间文件路径。 - 显式指定Android目标架构:在
dotnet build命令中添加架构参数,强制生成指定架构的中间文件,避免自动检测导致的路径异常:dotnet build YourProject.csproj -c Release -p:AndroidSupportedAbis=arm64-v8a,armeabi-v7a -p:AndroidUseSharedRuntime=false - 清理构建缓存:在流水线中添加清理步骤,清除旧的obj/bin目录后再执行构建:
dotnet clean -c Release dotnet restore dotnet build ... - 排除Sonar扫描的Android临时目录:在SonarQube扫描配置中添加排除规则,防止扫描时修改或删除构建所需的中间文件:
sonar.exclusions=**/obj/**,**/android/**,**/*.so - 升级Android SDK包版本:将Microsoft.Android.Sdk.Darwin升级到同大版本的最新补丁版(如33.0.102),修复旧版本中的路径解析bug。
- 显式指定构建输出目录:避免默认路径中的双斜杠问题,例如:
dotnet build -c Release -o ./bin/Release/Android
内容的提问来源于stack exchange,提问作者user10

