MSBuild构建时AndroidVersionCode参数被忽略,如何正确配置?
问题描述
根据官方文档,可将-p:AndroidVersionCode=101作为MSBuild参数设置版本号,但实际构建后APK始终使用AndroidManifest.xml中的硬编码值,即使已在Droid项目的csproj中设置<GenerateApplicationManifest>true</GenerateApplicationManifest>。使用的完整MSBuild命令如下:
msbuild -t:Clean -t:PackageForAndroid -p:AndroidPackageFormat=apk -p:ApplicationVersion="1.0" -p:AndroidVersionCode=101 -p:ApplicationId="cz.sebastian.myapp" -p:OutputPath="C:\Packages\" -p:Configuration=Release .\MyApp.Droid.csproj
解决步骤
移除AndroidManifest.xml中的硬编码versionCode
如果你的AndroidManifest.xml里写了<manifest android:versionCode="xxx">,这个值会强制覆盖MSBuild参数,必须删掉该属性,让MSBuild自动生成清单时注入版本号。确认csproj配置正确
确保<GenerateApplicationManifest>True</GenerateApplicationManifest>仅在Droid项目的csproj中配置(netstandard项目不需要这个设置),可以在对应配置节点下添加默认版本号,命令行参数会自动覆盖它:<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <GenerateApplicationManifest>True</GenerateApplicationManifest> <AndroidVersionCode>100</AndroidVersionCode> <!-- 默认值,可被命令行覆盖 --> </PropertyGroup>优化MSBuild命令
合并Clean和PackageForAndroid目标,避免重复执行:msbuild -t:Clean,PackageForAndroid -p:AndroidPackageFormat=apk -p:ApplicationVersion="1.0" -p:AndroidVersionCode=101 -p:ApplicationId="cz.sebastian.myapp" -p:OutputPath="C:\Packages\" -p:Configuration=Release .\MyApp.Droid.csproj验证结果
构建完成后,用aapt工具验证APK的版本号:aapt dump badging C:\Packages\MyApp.Droid.apk | findstr versionCode输出应显示
versionCode='101',说明设置生效。
额外排查
如果还是不生效,检查是否有Directory.Build.props或其他全局构建脚本覆盖了AndroidVersionCode的值,这类脚本的优先级可能高于命令行参数。
内容的提问来源于stack exchange,提问作者Sebastian Busek

