Android应用中的自动增量版本代码

ise*_*all 62 eclipse android build version

有没有办法在每次在Eclipse中构建Android应用程序时自动增加版本代码?

根据http://developer.android.com/guide/publishing/versioning.html,您必须手动增加版本代码AndroidManifest.xml.

我明白,你必须在每次构建之前运行一个脚本,例如解析AndroidManifest.xml文件,找到版本号,增加它并在构建本身启动之前保存文件.但是,我无法了解Eclipse如何以及是否支持在构建之前/之后运行脚本.

我发现这篇关于配置ant builder的文章,但这并不完全是关于Android的,我担心这会让Android的预定义构建步骤过多?

应该是一个常见的问题,你是如何解决的?

好吧,人们可以手动执行此操作,但是一旦忘记执行此项工作,您将获得具有相同编号的不同版本,并且整个版本控制毫无意义.

cko*_*ozl 113

我完成了这个.以下是我为下一个人(使用Eclipse)做的事情:

1)创建一个外部控制台可执行文件,用于将新版本代码写入AndroidManifest.xml :(我的是在C#中)

using System.IO;
using System.Text.RegularExpressions;

namespace AndroidAutoIncrementVersionCode
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string FILE = @"AndroidManifest.xml";
                string text = File.ReadAllText(FILE);
                Regex regex = new Regex(@"(?<A>android:versionCode="")(?<VER>\d+)(?<B>"")", RegexOptions.IgnoreCase);
                Match match = regex.Match(text);
                int verCode = int.Parse(match.Groups["VER"].Value) + 1;
                string newText = regex.Replace(text, "${A}" + verCode + "${B}", 1);

                File.WriteAllText(FILE, newText);
            }
            catch { }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除此之外:任何c-sharp编译器都可以构建这个应用程序,你不需要Visual Studio甚至Windows

  1. 如果你还没有它,安装.NET运行时(Mono将工作,链接)(链接到MS的.NET framework 2.0,2.0是最小的下载,任何版本> = 2.0都很好)
  2. 这段代码复制到*.cs文件(我将其命名:AndroidAutoIncrementVersionCode.cs)
  3. 打开命令提示符并导航到您创建*.cs文件的位置
  4. 使用此命令构建文件(在Windows上,类似于Mono但更改编译器的路径):( 有关详细信息,c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc AndroidAutoIncrementVersionCode.cs 请参阅:.NETMono)
  5. 恭喜,您刚刚构建了一个没有任何工具的C#应用​​程序,它应该AndroidAutoIncrementVersionCode.exe自动生成在同一目录中

    **里程可能会有所不同,路径可能会有所不同,不需要购买,在禁止的地方无效,我补充说这是因为C#太棒了,人们错误地认为它有MS锁定,你可以很容易地把它翻译成另一种语言(但是我不打算为你做那件事;).顺便说一下,任何版本的.NET编译器都可以工作,我调整了最小公分母的代码...*

放在一边

2)在构建过程中运行可执行文件:a)转到项目属性

转到项目属性

b)在属性中,转到"Builders" - >"New ..."

Eclipse属性屏幕

c)选择"程序"

选择节目

d)在"Main"选项卡中选择程序位置(我还将工作目录设置为安全)并根据需要为其命名.

编辑配置 - 主要

e)在"刷新"选项卡中,选择"完成后刷新资源"和"所选资源"选项 - 这将在我们编写清单后刷新清单.

编辑配置 - 刷新

f)在"构建选项"选项卡中,您可以关闭"分配控制台",因为您没有输入和输出,然后仅选择"在手动构建期间"和"在自动构建期间",如果选中,则取消选择"清理后".然后选择"指定相关资源的工作集"并单击"指定资源..."按钮.在"编辑工作集"对话框中,在对话框中找到"AndroidManifest.xml"文件并进行检查,然后点击"完成"

编辑配置 - 构建选项 编辑工作集

f)现在在"编辑配置对话框"和应用程序属性中单击"确定",选择新创建的构建器,并继续单击"向上",直到它位于列表顶部,这样自动增量运行首先,并不会触发意外的不同步状态或重建.一旦您创建的新构建器位于列表顶部,单击"确定"即可完成.

编辑配置 - 点击确定 在此输入图像描述

  • 很好的答案!对我来说很棒.我增强了它也增加了"android:versionName",并且还为不太熟悉C#的人上传了[可执行文件本身](http://taekwondo.org.il/googis/android/AndroidVersionIncreaser.exe). (4认同)
  • 请注意,版本名称必须采用XYZ格式,并且每次都会增加Z. 将exe放在与清单相同的位置. (3认同)
  • 这是一个很好的答案,但我在Eclipse 4.2.2上遇到了问题.看起来每次更改AndroidManifest.xml时,项目都会重建.由于自动增量程序导致一个不定式循环......我通过取消选中"自动构建期间"解决了它.... (3认同)

Cly*_*yde 9

此shell脚本适用于*nix系统,将versionCode和versionName的最后一个组件设置为当前的subversion修订版.我正在使用Netbeans和NBAndroid,我从custom_rules.xml中的目标-pre-compile中调用这个脚本.

将此脚本保存在名为incVersion的文件中,与AndroidManifest.xml位于同一目录中,使其可执行: chmod +x incVersion

manf=AndroidManifest.xml
newverfull=`svnversion`
newvers=`echo $newverfull | sed 's/[^0-9].*$//'`
vers=`sed -n '/versionCode=/s/.*"\([0-9][0-9]*\)".*/\1/p' $manf`
vername=`sed -n '/versionName=/s/.*"\([^"]*\)".*/\1/p' $manf`
verbase=`echo $vername | sed 's/\(.*\.\)\([0-9][0-9]*\).*$/\1/'`
newvername=$verbase$newverfull
sed /versionCode=/s/'"'$vers'"'/'"'$newvers'"'/ $manf | sed /versionName=/s/'"'$vername'"'/'"'$newvername'"'/  >new$manf && cp new$manf $manf && rm -f new$manf
echo versionCode=$newvers versionName=$newvername
Run Code Online (Sandbox Code Playgroud)

创建或编辑custom_rules.xml并添加以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules">
    <xmlproperty file="AndroidManifest.xml" prefix="mymanifest" collapseAttributes="true"/>
    <target name="-pre-compile">
        <exec executable="./incVersion" failonerror="true"/>
    </target>
</project>
Run Code Online (Sandbox Code Playgroud)

因此,如果我当前的svn修订版是82,那么我最终会在AndroidManifest.xml中使用它:

android:versionCode="82"
android:versionName="2.1.82">
Run Code Online (Sandbox Code Playgroud)

当我想发布一个新版本时,我通常会更新versionName的第一部分,但即使我忘记了,versionName的最后一部分(在我的About活动中公开)将始终告诉我它是从哪个svn版本构建的.此外,如果我没有签入更改,修订号将是82M,versionName将是2.1.82M.

每次完成构建时,仅仅增加版本号的优点是数量保持在控制之下,并且可以直接与特定的svn修订相关.在调查最新版本以外的错误时非常有用.


小智 7

FWIW,我能够在六行python中更新构建版本值:

#!/bin/env python
import os
from xml.dom.minidom import parse
dom1 = parse("AndroidManifest.xml")
dom1.documentElement.setAttribute("android:versionName","%build.number%")
f = os.open("AndroidManifest.xml", os.O_RDWR)
os.write( f, dom1.toxml() )
Run Code Online (Sandbox Code Playgroud)

  • ...但是没有说明如何使它在Eclipse中运行,这就是问题所在. (9认同)

Roc*_*cky 6

基于Charles的回答,以下增加了现有的构建版本:

#!/usr/bin/python
from xml.dom.minidom import parse

dom1 = parse("AndroidManifest.xml")
oldVersion = dom1.documentElement.getAttribute("android:versionName")
versionNumbers = oldVersion.split('.')

versionNumbers[-1] = unicode(int(versionNumbers[-1]) + 1)
dom1.documentElement.setAttribute("android:versionName", u'.'.join(versionNumbers))

with open("AndroidManifest.xml", 'wb') as f:
    for line in dom1.toxml("utf-8"):
        f.write(line)
Run Code Online (Sandbox Code Playgroud)

  • 这很好,非常感谢你!如果作为shell脚本运行,请不要忘记添加`#!/ usr/bin/python`作为第一行并使其可执行:`chmod + x buildincrease.py`. (2认同)

aer*_*ode 4

所以,我是这样看的:

根据您提出的文章,使用ant来完成此任务(目标?)。

  1. 解析清单(解析 XML)
  2. 获取旧版本清单并增加它/从存储库获取版本
  3. 将新版本存储在清单中
  4. 构建 Android 应用程序。

但就我而言,当我部署或分发应用程序时,我通常根据Tag的修订版按值填充此字段。