【问题标题】:embed version details in android APK在 android APK 中嵌入版本详细信息
【发布时间】:2010-01-29 13:02:20
【问题描述】:

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

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

有没有办法自动执行此操作,以便我在 about-box 中的版本字符串始终正确,或者这是我每次提交时都必须手动编辑的内容?

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

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

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

这反而会让人怀疑我是否可以以某种方式预处理 Android 构建中的一些文件以注入 svnversion 输出?

【问题讨论】:

    标签: java android eclipse version-control


    【解决方案1】:

    一种可能的方法。 在您的 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 来实现。

    首先,将构建器添加到您的项目中(我的项目 -> 属性 -> 构建器)

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

    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
    

    【讨论】:

    • 是的,我正在做这样的事情,但它是每个文件的,所以每次我提交其他文件时它都不会更新:(
    • 您使用什么作为构建系统?如果您使用 maven 或 ant,您可以编写脚本,以便每次构建时都执行此操作。
    • 您好,我尝试使用您的脚本将标签 android:versionName 的值设置为当前版本。所以我设置了 android:versionName="$Rev$" 并在你的脚本中将 (.*android:versionCode=") 更改为 (.*android:versionName=") 但每次结果都只是 "$Rev$"。你有什么提示吗?
    • (\d+) 仅匹配数字。
    • Roflcoptr,您需要在该文件的 svn:keywords 属性中启用修订。有关详细信息,请参阅svnbook.red-bean.com/en/1.1/ch07s02.html。
    【解决方案2】:

    只是一般的建议,你没有提到你的版本控制系统。

    在 about 框的文本中嵌入适当的标题(类似于 $Version:$)。当您提交时,新版本号将被存储,并在您构建时显示该值。

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

    【讨论】:

    【解决方案3】:

    来自 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 Revision改变时才会改变,即只有当你执行svn commit时才会改变。

    如果您愿意,您可以添加对 Changed revision 的检查,如果是这样,请执行 sed for alter 文件。 也可以将 Revision 更改为服务器上的最后一个 SVN 版本。

    【讨论】:

    • 您可能会发现svnversion 在这里很有帮助;它只是返回当前的内部版本号,加上一个代表本地更改的数字。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-24
      • 2015-01-31
      • 2015-11-02
      • 2014-07-23
      • 1970-01-01
      • 2012-07-06
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多