在 Android APK 中嵌入版本详细信息

发布于 2024-08-19 10:34:33 字数 441 浏览 5 评论 0原文

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

在我的应用程序中,我有一个关于框。我想在其中显示正确的源代码控制修订版/标签/任何内容。

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

感谢您提供有关 $keywords$ 的早期答案。

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

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

这导致我想知道我是否可以以某种方式预处理 Android 构建中的一些文件以注入 svnversion 输出?

My code is stored in SVN version control. I use Eclipse to build my Android application.

In my application, I have an about-box. I want to show the correct source control revision/tag/whatever in this.

Is there a way of automating this so that my version string in the about-box is always right, or is this something I have to hand-edit each time I commit?

Thx for the early answers about $keywords$.

Setting the SVN property svn:keywords to Rev does expand a private String m_svn_rev = "$Rev:$" every time I submit that file.

SVN is a per-file version control system.

Which leads instead to wonder if I can somehow pre-process some files in the Android build thingy to inject svnversion output?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

一刻暧昧 2024-08-26 10:34:33

一种可能的方法。
在您的 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 或 < code>ant 可能是替代方案,但让我们使用 Eclipse 和 ADT 来实现。

首先,向您的项目添加一个构建器(我的项目 -> 属性 -> 构建器

alt text

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

alt text

android-增量清单版本脚本类似于

#! /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

One possible approach.
In your AndroidManifest.xml add metadata to your Activities to keep the revision or whatever you want to use

<activity android:name="SampleActivity">
    <meta-data android:value="$Rev: 164 $" android:name="com.example.version" />
</activity>

then in your 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();
}

You may also want to set android:versionName="$Rev$" in your manifest.

To automate the process of incrementing the version number in android:versionCode and committing the AndroidManifest.xml there are various options, building with maven or ant could be alternatives but let's do it using Eclipse and ADT.

First, add a builder to your project (My Project -> Properties -> Builders)

alt text

this builder should invoke the android-increment-manifest-version using the project's AndroidManifest.xml as the argument

alt text

android-increment-manifest-version script is something like

#! /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
土豪 2024-08-26 10:34:33

仅提供一般建议,您没有提及您的版本控制系统。

在“关于”框的文本中嵌入适当的标题(例如 $Version:$)。当您提交时,新版本 # 将被存储,并且当您构建时将显示该值。

[编辑]
1. 创建您的“关于”框作为单独的源,仅在增加版本时将其签入。
2. 将您自己的版本嵌入头文件中(并且不要忘记更改它),然后在“关于”框中使用该版本字符串(例如作为 extern string *
[/编辑]

generic advice only, you don't mention your version control system.

embed the appropriate header (something like $Version:$) in the text for the about box. When you commit, the new version # will be stored and when you build the value will be shown.

[edit]
1. create your about box as a separate source, only check it in when you increment the version.
2. embedded your own version in a header file (and don't forget to change it) then use that version string in your about box (as an extern string * for example)
[/edit]

慕巷 2024-08-26 10:34:33

来自 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 时,版本号才会更改。

如果需要,您可以添加对更改修订版本的检查,如果是这样,请执行 sed 来更改文件。
还可以将修订版更改为服务器上的最后一个 SVN 修订版。

From the idea of dtmilano.blogspot.com... but using only the SVN revision:

#! /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

The version number change only when SVN Revision change, ie only when you exec svn commit.

If You want, You can add a check for Changed revision, if so execute the sed for alter file.
Is also possible to change Revision to the last SVN revision on server.

嘿嘿嘿 2024-08-26 10:34:33

这可能是一个切线,但我使用 Cruse Control 的 $label 标签来在我的“关于”屏幕中更改版本。每次我签入某些内容时,CC 都会进行更新并生成一个版本。我的 ant 脚本中的步骤之一是将巡航控制系统中的 $label 值注入 strings.xml 中的值。每次提交都会给我一个新的版本号。我可以检查 CC 日志并将内部版本号与 SVN 修订号进行匹配。

对于这么简单的事情,可能需要做的工作比您有兴趣做的还要多。我还敢打赌任何其他构建系统都会有类似的功能。

This may be a tangent, but I use Cruse Control's $label tag to bump the version in my about screen. Each time I check something in, CC does an update and spits out a build. One of the steps in my ant script injects the $label value from the cruise control system into a value within strings.xml. This gives me a new version number with each commit. I can check the CC logs and match a build number up to an SVN revision number.

Probably more work than you're interested in doing for something this simple. I'd also wager that any other build system out there will have a similar feature.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文