如何在构建期间将版本设置为android清单

时间:2011-03-03 08:02:52

标签: android android-manifest versioning

有没有什么办法可以在构建期间为android清单中的versionCode生成价值?问题是,由于版本AndroidManifest.xml,因此不得对其进行修改。我更喜欢在使用eclipse进行构建时是否可以设置它。

我想根据版本控制系统的信息生成它。使用关键字扩展是不可能的,因为它需要从整个树的信息中派生出来,而不仅仅是AndrdoidManifest.xml文件。

我可以很轻松地处理versionName。由于它可以引用资源,并且因为res / values中可以有任意数量的.xml文件,所以我可以使用适当的值编写非版本化的res / values / version.xml。但它看起来并不像versionCode那样适用(如果我尝试直接安装,但我没有通过市场设置测试安装的环境)。

更新 main_rules.xml定义了使用ant构建的规则,因此可以使用version.code属性。这个问题仍然代表着用Eclipse构建。

2 个答案:

答案 0 :(得分:1)

这不涉及你问题的version.code部分,但这是我在项目中完成的方式:

我创建了一个C#工具,用于收集我想要包含在我们的about页面中的信息。在项目的构建器列表(Properties->Builders)的第一步调用此工具,您可以在其中指定工具和命令行参数。在我们的实例中,构建器信息如下所示:

地点:C:\Projects\Mobile\Tools\AndroidBuildVersioner\AndroidBuildVersioner\bin\Release\AndroidBuildVersioner.exe

参数: -f C:\Projects\Mobile\Android\ProjectName\res\values\build_version.xml

该工具使用perforce lib检查项目的主要版本和我的案例中的关联库,然后将此信息写入可写文件build_version.xml。此文件在工作区中保持可写,因为它是自动生成的文件。输出只是一组字符串资源,因此信息可以轻松地用于项目的活动。我最初也写了清单,但当构建工具修改你必须手工修改的文件时,当然很容易遇到冲突。

如果有帮助,可以参考以下几个例子:

build_version.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="build_revision">9</string>
    <string name="build_date">7/25/2011 9:48:13 AM</string>
    <string name="build_machine">JMARTIN-PC</string>
    <string name="build_user">jmartin</string>
</resources>

AndroidBuildVersioner.exe - 这个简化的块只是递增一个本地内部版本号,并将它和一些额外的env信息写回字符串xml文件。

    private static void updateBuildFileInfo(String file)
    {
        String fileContents = ReadFile(file);
        String buildRevision =  "0";
        String newFileContents =  @"<?xml version=""1.0"" encoding=""utf-8""?>"
            + Environment.NewLine + "<resources>" + Environment.NewLine ;

        //find the build version in the contents of the file so it can be incremented
        Match m = Regex.Match(fileContents, @"<string name=""build_revision"">(.*)</string>");

        if (m.Success)
            buildRevision = m.Groups[1].Value;

        int intBuildRevision = 0;

        try
        {
            intBuildRevision = Convert.ToInt32(buildRevision);
        }
        catch (FormatException e)
        {
            Console.WriteLine("Input string is not a sequence of digits.");
        }
        catch (OverflowException e)
        {
            Console.WriteLine("The number cannot fit in an Int32.");
        }
        finally
        {
            ++intBuildRevision;
            newFileContents += '\t' + @"<string name=""build_revision"">" + intBuildRevision + "</string>" + Environment.NewLine;
            newFileContents += '\t' + @"<string name=""build_date"">" + DateTime.Now.ToString() + "</string>" + Environment.NewLine;
            newFileContents += '\t' + @"<string name=""build_machine"">" + Environment.MachineName + "</string>" + Environment.NewLine;
            newFileContents += '\t' + @"<string name=""build_user"">" + Environment.UserName + "</string>" + Environment.NewLine;
            newFileContents += "</resources>";
        }

        writeOutput(file, newFileContents);
    }

答案 1 :(得分:0)

我现在使用CMake构建应用程序(应用程序主要是本机和多平台),在构建期间生成包括AndroidManifest.xmlbuild.xml在内的所有android项目,所以我可以插入任何内容想要那里。