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

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

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

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

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

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

Обновление 1: я нашел эту тему, чтобы предположить, что я:

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

Отлично, но где файл сборки Ant ? Где я его найду?

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

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

Solutions Collecting From Web of "Как автоматически изменять имя версии в манифесте во время сборки?"

Вот что я использую для динамического назначения versionCode и versionName для AndroidManifest.xml. Он работает только при создании с муравьем, поэтому вам сначала нужно установить его. Затем перейдите в каталог проекта в командной строке и выполните «проект андроидного обновления -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> .  <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 clean debug » или « ant clean release », в зависимости от того, что вы хотите. Вы также можете создать файл 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

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

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

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

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

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

Вы должны подумать о строительстве с помощью maven-android . После того, как вы построили проект, используйте плагин обновления версии, чтобы автоматически увеличить ваш номер версии.

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

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

EDIT (2014):

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

То, как мне удалось это сделать: 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"; } ?>