Как установить версию для Android манифеста во время сборки - PullRequest
1 голос
/ 03 марта 2011

Можно ли как-нибудь сгенерировать значение для versionCode в манифесте Android во время сборки? Проблема в том, что, поскольку AndroidManifest.xml является версионной версией, ее нельзя изменять на месте. Я бы предпочел, чтобы это можно было установить при сборке с затмением.

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

Я могу легко справиться с versionName. Поскольку он может ссылаться на ресурс и поскольку в res / values ​​может быть любое количество XML-файлов, я могу написать не версионный файл res / values ​​/ version.xml с соответствующим значением. Но это не похоже на тот же трюк, который должен работать с versionCode (если я попробую его, он устанавливает напрямую, но у меня еще нет среды для тестирования установки через маркет).

Обновление: main_rules.xml, который определяет правила для сборки с ant, использует свойство version.code, так что это возможно. Вопрос все еще стоит за строительством с Eclipse.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Это не относится к 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, а затем записывает эту информацию в доступный для записи файл 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-файл strings.

    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);
    }
0 голосов
/ 27 ноября 2012

Теперь я создаю приложение, используя CMake (приложение в основном является нативным и мультиплатформенным), генерируя весь проект android, включая AndroidManifest.xml и build.xml во время сборки, поэтому я могу вставить туда все, что захочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...