Автоинкрементный код версии в приложении Android - PullRequest
62 голосов
/ 20 июля 2011

есть ли способ автоматического увеличения кода версии при каждом создании приложения Android в Eclipse?

Согласно http://developer.android.com/guide/publishing/versioning.html, вам придется вручную увеличивать код версии в AndroidManifest.xml.

Насколько я понимаю, перед каждой сборкой необходимо запускать сценарий, который, например, анализирует файл AndroidManifest.xml, находит номер версии, увеличивает его и сохраняет файл перед началом самой сборки.Однако я не смог выяснить, как и если Eclipse поддерживает скрипты запуска до / после сборок.

Я нашел эту статью о настройке Ant Builder, но это не совсем об Android иБоюсь, это слишком сильно испортит предопределенные этапы сборки для Android?

Должна быть распространенная проблема, как вы ее решили?

Что ж, это можно сделать вручную, но как только это произойдетесли вы забудете выполнить эту работу, вы получите разные версии с одним и тем же номером, и вся версия не имеет смысла.

Ответы [ 14 ]

1 голос
/ 28 апреля 2012

Я сделал что-то подобное, но написал это как приложение Desktop AIR вместо какого-то внешнего C # (не чувствовал установки другой системы сборки). Создайте это приложение Flex / ActionScript и измените путь к файлу, соберите его как автономное приложение для настольного компьютера. Он переписывает 1.2.3 часть вашего файла.

    <?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       width="371" height="255" applicationComplete="Init();">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[

            public function Init():void
            {
                import flash.filesystem.File;
                import flash.filesystem.FileMode;
                import flash.filesystem.FileStream;

                var myFile:File = new File("D:\\Dropbox\\Projects\\My App\\src\\Main-app.xml");

                var fileStream:FileStream = new FileStream();
                fileStream.open(myFile, FileMode.READ);

                var fileContents:String = fileStream.readUTFBytes(fileStream.bytesAvailable);

                var startIndex:Number = fileContents.indexOf("<versionNumber>");
                var numberIndex:Number = startIndex + 15;
                var endIndex:Number = fileContents.indexOf("</versionNumber>");

                if (startIndex == -1 || endIndex == -1)
                    return;

                var versionNumber:String = fileContents.substr(numberIndex, endIndex - numberIndex);
                var versionArr:Array = versionNumber.split(".");
                var newSub:Number = Number(versionArr[2]);
                newSub++;
                versionArr[2] = newSub.toString();
                versionNumber = versionArr.join(".");

                var newContents:String = fileContents.substr(0, startIndex) + "<versionNumber>" + versionNumber + "</versionNumber>" +
                                fileContents.substr(endIndex + 16);
                fileStream.close(); 


                fileStream = new FileStream();
                fileStream.open(myFile, FileMode.WRITE);
                fileStream.writeUTFBytes(newContents);
                fileStream.close(); 

                close();
            }
        ]]>
    </fx:Script>
    <s:Label x="10" y="116" width="351" height="20" fontSize="17"
             text="Updating My App Version Number" textAlign="center"/>

</s:WindowedApplication>
0 голосов
/ 19 сентября 2016

Если вы используете gradle, то вы можете * build.gradle указать versionName и versionCode очень просто.Вы можете использовать git commit count как растущее число для идентификации сборки.

Вы также можете использовать эту библиотеку: https://github.com/rockerhieu/Versionberg.

0 голосов
/ 13 ноября 2013

Вот версия Java для того, что она стоит.Также обрабатывает несколько манифестов.

String directory = "d:\\Android\\workspace\\";

String[] manifests = new String[] 
{
        "app-free\\AndroidManifest.xml",
        "app-donate\\AndroidManifest.xml",
};

public static void main(String[] args)
{
    new version_code().run();
}

public void run()
{
    int I = manifests.length;
    for(int i = 0; i < I; i++)
    {
        String path = directory + manifests[i];

        String content = readFile(path);
        Pattern         versionPattern = Pattern.compile( "(.*android:versionCode=\")([0-9]+)(\".*)", Pattern.DOTALL );
        Matcher m = versionPattern.matcher(content);

        if (m.matches())
        {
            int code = Integer.parseInt( m.group(2) ) + 1;

            System.out.println("Updating manifest " + path + " with versionCode=" + code);

            String newContent = m.replaceFirst("$1" + code + "$3");

            writeFile(path + ".original.txt", content);
            writeFile(path, newContent);
        }
        else
        {
            System.out.println("No match to update manifest " + path);
        }
    }
}
0 голосов
/ 11 июля 2013

Если вы хотите обновить AndroidManifest.xml для использования определенного номера версии, возможно, из системы сборки, то вы можете использовать проект, который я только что отправил на GitHub: https://github.com/bluebirdtech/AndroidManifestVersioner

Это базовый проект.NET приложение командной строки, использование:

AndroidManifestVersioner <path> <versionCode> <versionName>.

Спасибо другим авторам за их код.

...