自動增加 Android App 的版本號

2022-11-22 18:01:34

一般的 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
//      [email protected]
// 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
    [email protected]
 .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