在Android APK中嵌入版本细节

时间:2010-01-29 13:02:21

标签: java android eclipse version-control

我的代码存储在SVN版本控制中。我使用Eclipse来构建我的Android应用程序。

在我的应用程序中,我有一个关于盒子的东西。我想在此显示正确的源代码控制版本/标签/。

有没有一种方法可以自动执行此操作,以便我的约会框中的版本字符串始终是正确的,或者这是我每次提交时都需要手动编辑的内容?

关于$ keywords $的早期答案的Thx。

每次提交 文件时,将SVN属性svn:keywords设置为Rev的确会展开private String m_svn_rev = "$Rev:$"

SVN是一个文件版本控制系统。

相反,我想知道我是否能以某种方式预处理Android构建中的某些文件以注入svnversion输出?

4 个答案:

答案 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,有各种选项,使用mavenant构建可能是替代方案,但让我们做它使用Eclipse和ADT。

首先,在项目中添加一个构建器(我的项目 - &gt;属性 - &gt;构建器

alt text

此构建器应使用项目的android-increment-manifest-version作为参数调用AndroidManifest.xml

alt text

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修订号相匹配。

可能更多的工作比你对这么简单的事情感兴趣。我也打赌,那里的任何其他构建系统都会有类似的功能。