一般的 C# 應用程式中都有一個 AssemblyInfo.cs 檔案,其中的 AssemblyVersion attribute 就可以用來設定該應用程式的版本號。譬如,
[assembly: AssemblyVersion("1.0.*")]
這樣設定的 AssemblyVersion attribute,其版本號中的構建編號(Build Number),在每次編譯(Build)該應用程式時,就會自動加1。這樣,版本號中的主、次版本號由手動設定,而構建編號由編譯程式(MSBuild)自動管理,省去了很多麻煩。
但 Android App 的版本號卻無法使用這種方式,因為 Android App 的版本號存在於 AndroidManifest.xml 中:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="3" android:versionName="1.0" package="mypackage" android:installLocation="auto"> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="31" /> <application android:label="MyPackage.Android" android:theme="@style/MainTheme" android:allowBackup="false"> </application> </manifest>
在這個 AndroidManifest.xml 檔案中,App 的版本號(versionName)是“1.0”,構建編號(versionCode)是“3”。我們希望能夠像 C# 程式一樣,由編譯程式自動管理構建編號。但似乎還沒有這樣實現自動管理的編譯程式,所以只能自己動手實現類似的功能。
網上找到了一段C#程式碼,可以完成自動增加 versionCode 的功能:
//////////////////////////////////////////////////////// // AutoVersion // Increment the Android VersionCode automatically // Version // 1.0 // Author // prowyh@hotmail.com // Date // 2022-11-22 // Curtesy // 9to5answer.com/auto-increment-version-code-in-android-app //////////////////////////////////////////////////////// using System.Text.RegularExpressions; namespace AutoVersion { internal class Program { static void Main(string[] args) { string file = "AndroidManifest.xml"; if (args.Length > 0) { file = args[0]; } try { string text = File.ReadAllText(file); Regex regx = new(@"(?<A>android:versionCode="")(?<VER>\d+)(?<B>"")", RegexOptions.IgnoreCase); Match match = regx.Match(text); int verCode = int.Parse(match.Groups["VER"].Value) + 1; string ntext = regx.Replace(text, "${A}" + verCode + "${B}", 1); File.WriteAllText(file, ntext); } catch (Exception exp) { using StreamWriter sw = new("AutoVersion.log"); sw.Write(exp.Message); } } } }
將此程式碼編譯為 AutoVersion.exe,將其包括在 Visual Studio 的 pre-build 事件所執行的命令列中(如下圖),即可。
這樣,每次點選 “Build Solution” 進行編譯時,都會先執行 AutoVersion.exe,完成對 AndroidManifest.xml 中 versionCode 的自動增1 操作。
下面是 AutoVersion.cs 的 PowerShell 版本:
<# .SYNOPSIS AutoVersion.ps1 .DESCRIPTION PowerShell script for automatically incrementing the Android VersionCode. .VERSION 1.0 .AUTHOR prowyh@hotmail.com .DATE 2022-11-22 #> $content = Get-Content AndroidManifest.xml [regex]$rx = "(?<A>android:versionCode="")(?<VER>\d+)(?<B>"")" $m = $rx.Matches($content) $nv = $([System.Int32]$m[0].Groups["VER"].Value + 1) $nvCode = $m[0].Groups["A"].Value, $nv, $m[0].Groups["B"].Value -join "" $content -replace "android:versionCode=""(\d+)""", $nvCode | Out-File -FilePath AndroidManifest.xml