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
*.cs
文件(我将其命名:AndroidAutoIncrementVersionCode.cs
)*.cs
文件的位置c:\Windows\Microsoft.NET\Framework\v2.0.50727\csc AndroidAutoIncrementVersionCode.cs
请参阅:.NET或Mono)恭喜,您刚刚构建了一个没有任何工具的C#应用程序,它应该AndroidAutoIncrementVersionCode.exe
自动生成在同一目录中
**里程可能会有所不同,路径可能会有所不同,不需要购买,在禁止的地方无效,我补充说这是因为C#太棒了,人们错误地认为它有MS锁定,你可以很容易地把它翻译成另一种语言(但是我不打算为你做那件事;).顺便说一下,任何版本的.NET编译器都可以工作,我调整了最小公分母的代码...*
放在一边
2)在构建过程中运行可执行文件:a)转到项目属性
b)在属性中,转到"Builders" - >"New ..."
c)选择"程序"
d)在"Main"选项卡中选择程序位置(我还将工作目录设置为安全)并根据需要为其命名.
e)在"刷新"选项卡中,选择"完成后刷新资源"和"所选资源"选项 - 这将在我们编写清单后刷新清单.
f)在"构建选项"选项卡中,您可以关闭"分配控制台",因为您没有输入和输出,然后仅选择"在手动构建期间"和"在自动构建期间",如果选中,则取消选择"清理后".然后选择"指定相关资源的工作集"并单击"指定资源..."按钮.在"编辑工作集"对话框中,在对话框中找到"AndroidManifest.xml"文件并进行检查,然后点击"完成"
f)现在在"编辑配置对话框"和应用程序属性中单击"确定",选择新创建的构建器,并继续单击"向上",直到它位于列表顶部,这样自动增量运行首先,并不会触发意外的不同步状态或重建.一旦您创建的新构建器位于列表顶部,单击"确定"即可完成.
此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)
基于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)
所以,我是这样看的:
根据您提出的文章,使用ant来完成此任务(目标?)。
但就我而言,当我部署或分发应用程序时,我通常根据Tag的修订版按值填充此字段。
归档时间: |
|
查看次数: |
34516 次 |
最近记录: |