Подтвердить что ты не робот

Как автоматически изменять имя версии в манифесте во время сборки?

До сих пор я уделял особое внимание моему прикладному программированию и уделял мало внимания тому, чтобы сделать процесс сборки более умным. Таким образом, я делаю вещи довольно вручную ( "тупой путь" ), включая обновление вручную android:versionCode и android:versionName в AndroidManifest.xml.

Теперь я хотел бы автоматически (т.е. при сборке или при экспорте):

  • Извлечь из git последний тег/ветвь, содержащий коды сборки и версии.
  • Разберите их так, чтобы я мог назначить их соответствующим полям в AndroidManifest.xml.
  • Измените AndroidManifest.xml соответственно.
  • Продолжайте нормальный процесс сборки (Eclipse + ADT, no Ant вообще), как если бы я делал 1-2-3 вручную...

Я нашел несколько подсказок о шаге pre-build, разработчики и build.xml, но я понятия не имею, где их найти и с чего начать.

Любые советы или указатели на то, где я мог бы найти дополнительную информацию по этому вопросу? (пошаговое руководство будет идеальным)

Обновление 1: Я нашел этот поток, чтобы предположить, что I:

  • Щелкните правой кнопкой мыши проект Properties > Builders
  • Добавьте создателя, который указывает на файл сборки проекта Ant.
  • Заказать этот конструктор, который будет вызываться перед компоновщиком Java

Хорошо, но , где - проект Ant файл сборки? Где я его найду?

Обновление 2: Возможно, экспортировать весь проект в файл Ant. Но я не уверен, что хочу. Должен ли шаг предварительной сборки включать Ant файл сборки?

Обновление 3: Создает файл Ant только для этапа предварительной сборки, правильный подход?

4b9b3361

Ответ 1

Здесь я использую для динамического назначения versionCode и versionName для AndroidManifest.xml. Он работает только при создании с помощью ant, поэтому вам придется сначала установить его. Затем перейдите в каталог проекта в командной строке и выполните "проект андроидного обновления -p.", Который создаст необходимые файлы для построения с помощью ant, таких как local.properties и build.xml.

Затем откройте build.xml и поместите это внутри:

  <target name="-pre-build" depends="-custom-git-version,-custom-manifest-version">
  </target>

  <!-- Packages the application. -->
  <target name="-post-build">
    <antcall target="-custom-restore-manifest"/>

    <property name="suffix" value="${git.commits}-${git.version}.apk" />

    <exec executable="sed" inputstring="${out.final.file}" outputproperty="out.final.renamedfile">
      <arg value="s/\.apk/-${suffix}/" />
    </exec>

    <copy file="${out.final.file}" tofile="${out.final.renamedfile}" />
    <echo>Final file copied to: ${out.final.renamedfile}</echo>
  </target>  

  <!-- Custom targets -->
  <target name="-custom-git-version">
    <exec executable="sh" outputproperty="git.commits">
      <arg value="-c" />
      <arg value="git log --pretty=format:'' | wc -l" />
    </exec>
    <echo>git.commits: ${git.commits}</echo>
    <exec executable="git" outputproperty="git.version">
       <arg value="describe" />
       <arg value="--tags" />
       <arg value="--long" />
    </exec>
    <echo>git.version: ${git.version}</echo>
  </target>

  <target name="-custom-manifest-version">
     <echo>Creating backup of AndroidManifest.xml</echo>
     <copy file="AndroidManifest.xml" tofile="AndroidManifest.xml.antbak" preservelastmodified="true" />

     <replaceregexp
        file="AndroidManifest.xml"
        match='android:versionCode="(\d+)"'
        replace='android:versionCode="${git.commits}"' />

     <replaceregexp
        file="AndroidManifest.xml"
    match='android:versionName="(\d+\.\d+)\.\d+"'
    replace='android:versionName="\1.${git.commits}"' />
  </target>

  <target name="-custom-restore-manifest">
    <echo>Restoring backup of AndroidManifest.xml</echo>
    <move file="AndroidManifest.xml.antbak"
          tofile="AndroidManifest.xml"
          preservelastmodified="true"
          overwrite="true" />
  </target>

Результат этого не совсем то, что вы хотите, но это начало - не стесняйтесь его изменять:) В результате получилось что-то вроде "yourapp -. apk

Используя это, вы создадите приложение с выполнением " ant чистой отладки" или " ant чистая версия", в зависимости от того, что вы хотите. Вы также можете создать файл ant.properties "с этим контентом:

key.store=keystore_file
key.store.password=some_password
key.alias=some_alias
key.alias.password=some_other_password

чтобы включить автоматическое подписание вашего приложения.

Вы также должны прочитать следующее: http://developer.android.com/tools/building/building-cmdline.html

Ответ 2

Вы находитесь на правильном пути с настройкой этапа предварительной сборки, но файл сборки ant - это то, что вы создадите сами с нуля. В Eclipse есть несколько сценариев ant, которые он использует извне, которые обрабатывают автоматическую компиляцию, упаковку и прочее, но вы хотите создать отдельный, который просто выполняет эти дополнительные шаги.

Итак, вам нужно немного узнать о скриптах ant, чтобы это сделать. Некоторые из этих ссылок, которые вы нашли, дают вам основную идею создания простого файла ant. Чтобы добавить к этому, некоторые из задач ant, которые вам, вероятно, потребуется использовать, следующие:

Exec - вам понадобится выполнить команду git, которая получит вашу информацию о версии. У него есть аргумент, называемый resultProperty, который вы можете использовать для хранения вывода команды в свойство, доступное для ant. (или вы можете просто получить вывод команды в файл, и ant может получить к нему доступ.)

ReplaceRegExp - вам понадобится это для замены токенов (возможно, @VERSIONCODE @и @VERSIONNAME @), которые вы разместите в своем AndroidManifest.xml где значения должны в конечном итоге идти, со значениями, возвращаемыми exec.

Возможно, вам также захочется выполнить задачу exec в начале, чтобы восстановить файл AndroidManifest.xml в исходное состояние (с токенами на месте), чтобы он повторялся без ручной очистки. Я бы предоставил дополнительную информацию о командах git, которые вам нужно выполнить в этих задачах exec, но я боюсь, что все мои опыты с Subversion, поэтому вам придется заполнить пробелы там.

Ответ 3

Вам следует подумать о создании с maven-android. Как только вы построите проект, используйте плагин version-update, чтобы автоматически увеличить ваш номер версии.

Написание сборки script с maven-android не может быть описано как легко - но выигрыш стоит усилий, и вы должны рассмотреть этот путь.

Кроме того, этот учебник может пригодиться (я использую вариант метода, описанный здесь для моих собственных построек)

EDIT (2014):

Рассмотрим переход на Android Studio и использование Gradle. Смотрите: Как автоинкремент версии Код в Android Gradle

Ответ 4

Как мне удалось это сделать: build > execute shell (нам понадобился некоторый php-код для получения некоторой информации из db), а замена строки происходит в php:

#!/usr/bin/php
<?php
    $filename = $WORKSPACE."/src/com/me/myapp/MyActivity.java";
    $file = @file_get_contents($filename);
    if($file) {
        $repl = preg_replace("OriginalString", "NewString", $file);
        file_put_contents($filename, $repl);
        echo "\n\nReplaced some stuff in $filename";
    }
?>