Как автоматически изменять имя версии в манифесте во время сборки?
До сих пор я уделял особое внимание моему прикладному программированию и уделял мало внимания тому, чтобы сделать процесс сборки более умным. Таким образом, я делаю вещи довольно вручную ( "тупой путь" ), включая обновление вручную 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 только для этапа предварительной сборки, правильный подход?
Ответы
Ответ 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";
}
?>