0

是否有可能以任何方式,或者,以编程方式更新Android 移动应用程序中的版本代码和版本名称的最佳方案是什么?

对于我们使用的移动应用程序:

  • 用于 Android 开发的 Xamarin
  • 用于版本控制 (Git)、构建、测试和发布的 Visual Studio Team Services。
  • 谷歌播放分发。

我们的持续集成流程如下:

Visual studio (xamarin) ->  
Git(Code) -> 
Build -> 
Test(Xamarin testcloud)  -> 
Release Google Play (Alpha/Beta/Production)

目前我必须在提交到 Git 之前手动更新版本代码/名称,否则,在流程的另一端,Google 会抱怨新发布的 apk 的版本号小于或等于 Play 商店中已有的 apk。

但是,由于我们提交了很多并自动构建发布,我们只想在成功发布时增加版本代码/名称时增加版本代码/名称(以防谷歌拒绝它)。这导致了这个小困境:因为那时版本控制所在的 AndroidManifest 已经打包在一个签名和压缩的 APK 中。

另一件事是:我们正在与该项目的多个开发人员合作,因此手动更新的事情可能会导致赛车状况,所以最好的方法是(我们认为)在发布之前更新版本号。

我想到的事情:

  • 将版本号存储在 VSTS 中的某处
  • 使用内部版本号作为版本号
  • 通过 Google Play 的开发者 API 获取当前版本号

但仍然有点卡住并寻找常见/最佳实践

4

1 回答 1

1

卡斯帕,

我采取了在构建/打包应用程序之前修改清单的方法,因为一旦您开始构建、打包、签名、压缩对齐,就为时已晚。

在您的构建定义中,作为第一个任务,在构建任务之前,添加一个将更新清单的任务:

  • 在任务目录/实用程序中,添加 PowerShell 脚本
  • 将其设置为内联

论据:

-filePath '$(FilePath)' -oldValue '$(OldValue)' -newValue '$(NewValue)'

脚本:

param ([string] $filePath, [string] $oldValue, [string] $newValue)

Write-Host "---Replacing value $oldValue with new value $newValue in file $filePath---"

$content = [System.IO.File]::ReadAllText($filePath).Replace("$oldValue",  $newValue)

[System.IO.File]::WriteAllText($filePath, $content)

$filePath 参数是清单的路径,例如:

$(Build.SourcesDirectory)\MyAndroidApp\Properties\AndroidManifest.xml

$oldValue 参数将是版本代码属性:

android:versionCode="1"

$newValue 参数将是新版本代码属性:

android:versionCode="$(AndroidVersionCode)"

"$(AndroidVersionCode)" 可以是您的构建定义中的一个变量,允许在队列时间或构建号。


我为您提供了简单的路径,但为了便于维护和方便,我利用了 VSTS任务组。最后,我替换文件中文本的脚本是一个任务组,我可以在任何构建定义中使用它。

你最终会得到这样的结果: 构建定义

于 2016-12-12T22:07:21.017 回答