我的代码存储在SVN版本控制中。我使用Eclipse来构建我的Android应用程序。
在我的应用程序中,我有一个关于盒子的东西。我想在此显示正确的源代码控制版本/标签/。
有没有一种方法可以自动执行此操作,以便我的约会框中的版本字符串始终是正确的,或者这是我每次提交时都需要手动编辑的内容?
关于$ keywords $的早期答案的Thx。
每次提交 文件时,将SVN属性svn:keywords
设置为Rev
的确会展开private String m_svn_rev = "$Rev:$"
。
SVN是一个文件版本控制系统。
相反,我想知道我是否能以某种方式预处理Android构建中的某些文件以注入svnversion输出?
答案 0 :(得分:7)
一种可能的方法。 在您的AndroidManifest.xml中,向您的活动添加元数据以保留修订或您想要使用的任何内容
<activity android:name="SampleActivity">
<meta-data android:value="$Rev: 164 $" android:name="com.example.version" />
</activity>
然后在你的活动中
try {
final ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
final String version = (String)ai.metaData.get("com.example.version");
System.out.println("version: " + version);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
您可能还想在清单中设置android:versionName="$Rev$"
。
要自动执行android:versionCode
中增加版本号的过程并提交AndroidManifest.xml
,有各种选项,使用maven
或ant
构建可能是替代方案,但让我们做它使用Eclipse和ADT。
首先,在项目中添加一个构建器(我的项目 - &gt;属性 - &gt;构建器)
此构建器应使用项目的android-increment-manifest-version
作为参数调用AndroidManifest.xml
android-increment-manifest-version脚本类似于
#! /bin/bash
# android-increment-manifest-version:
# increment the version number found in the AndroidManifest.xml file
# (android:versionCode="n") in place and commit it to subversion.
#
# Copyright (C) 2010 Diego Torres Milano - http://dtmilano.blogspot.com
usage() {
echo "usage: $PROGNAME AndroidManifest.xml" >&2
exit 1
}
PROGNAME=$(basename $0)
if [ "$#" -ne 1 ]
then
usage
fi
MANIFEST="$1"
perl -npi -e 's/^(.*android:versionCode=")(\d+)(".*)$/"$1" . ($2+1) . "$3"/e;' $MANIFEST
svn ci -m "Version incremented" $MANIFEST
答案 1 :(得分:1)
仅限通用建议,您不提及您的版本控制系统。
在about框的文本中嵌入适当的标题(类似$ Version:$)。提交时,将存储新版本#,当您构建时,将显示该值。
[编辑]
1.将您的约会框创建为单独的源,仅在增加版本时将其签入
2.将您自己的版本嵌入到头文件中(并且不要忘记更改它)然后在您的about框中使用该版本字符串(例如extern string *
)
[/编辑]
答案 2 :(得分:1)
来自dtmilano.blogspot.com的想法......但仅使用SVN版本:
#! /bin/bash
# The first argument is full path of AndroidManifest.xml file
usage() {
echo "usage: $PROGNAME AndroidManifest.xml" >&2
exit 1
}
if [ "$#" -ne 1 ]
then
usage
fi
PROGNAME=$(basename $0)
MANIFEST="$1"
SVNREVISION=$(svn info | sed -n '5p' | sed -e 's/.*[^0-9]\([0-9]*\).*/\1/g')
if [ -f $MANIFEST ]; then
sed "s/android:versionCode=\"[0-9]*\"/android:versionCode=\"${SVNREVISION}\"/" $MANIFEST > $MANIFEST.tmp
mv $FULLPATH.tmp $MANIFEST
echo "The android:versionCode properties of file ${MANIFEST} is ${SVNREVISION}";
fi;
#svn commit -m "Update version in $MANIFEST" $MANIFEST
版本号仅在SVN版本更改时更改,即仅在执行svn commit时才会更改。
如果需要,可以添加对Changed修订的检查,如果是,则执行alter file的sed。 也可以将修订版更改为服务器上的最后一个SVN版本。
答案 3 :(得分:0)
这可能是一个切线,但我使用Cruse Control的$ label标签来破坏我的屏幕上的版本。每次我检查某些内容时,CC会进行更新并吐出构建。我的ant脚本中的一个步骤将来自巡航控制系统的$ label值注入strings.xml中的值。这给了我每个提交的新版本号。我可以查看CC日志并将内部版本号与SVN修订号相匹配。
可能更多的工作比你对这么简单的事情感兴趣。我也打赌,那里的任何其他构建系统都会有类似的功能。