Автоматизация для выпуска Android

У меня есть десять проектов Android в одной папке. Для каждого проекта я могу использовать ant debug для его создания. Таким образом, нет никакой проблемы написать простой скрипт для компиляции всех этих проектов. Я использую Hudson для ежедневного создания этих проектов, и он отлично работает.

Но теперь наш проект должен выйти на этап выпуска. Таким образом, команда компиляции становится ant release . Для компиляции проекта выпуска я должен вводить пароль для сертификата каждый раз во время компиляции. Поэтому я не могу автоматизировать выпуск.

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

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

Solutions Collecting From Web of "Автоматизация для выпуска Android"

Предполагая, что вы используете последние инструменты для Android, скажите v9 или v10.

Если вы посмотрите на tools/ant/main_rules.xml в tools/ant/main_rules.xml Android SDK:

 <!-- called through target 'release'. Only executed if the keystore and key alias are known but not their password. --> <target name="-release-prompt-for-password" if="has.keystore" unless="has.password"> <!-- Gets passwords --> <input message="Please enter keystore password (store:${key.store}):" addproperty="key.store.password" /> <input message="Please enter password for alias '${key.alias}':" addproperty="key.alias.password" /> </target> <!-- called through target 'release'. Only executed if there's no keystore/key alias set --> <target name="-release-nosign" unless="has.keystore"> <echo>No key.store and key.alias properties found in build.properties.</echo> <echo>Please sign ${out.unsigned.file} manually</echo> <echo>and run zipalign from the Android SDK tools.</echo> </target> 

Поиск файла XML для has.keystore показывает:

 <!-- properties for signing in release mode --> <condition property="has.keystore"> <and> <isset property="key.store" /> <length string="${key.store}" when="greater" length="0" /> <isset property="key.alias" /> </and> </condition> <condition property="has.password"> <and> <isset property="has.keystore" /> <isset property="key.store.password" /> <isset property="key.alias.password" /> </and> </condition> 

Поэтому я предполагаю, что вам нужно передать четыре определения в key.store build.xml: key.store , key.alias , key.store.password , key.alias.password .

И не забудьте передать эти определения в командной строке из соображений безопасности. 🙂

Основы на основе град

1) Создайте файл secure.properties чтобы содержать ваши пароли:

 key.store.password=<your keystore password> key.alias.password=<your alias password> 

Вероятно, вы не хотите, чтобы это было под контролем версий, поэтому мы помещаем пароли в отдельный файл *.properties . Если вы не против иметь свои пароли под управлением версиями, вы можете ввести свои пароли непосредственно в build.gradle , но это не рекомендуется, поэтому я прямо не показываю это.

2) Настройте свой build.gradle следующим образом:

 Properties secureProperties = new Properties() secureProperties.load(new FileInputStream("secure.properties")) android { signingConfigs { release { storeFile file("<path to your keystore>") storePassword secureProperties['key.store.password'] keyAlias "<alias name>" keyPassword secureProperties['key.alias.password'] } } buildTypes { release { signingConfig signingConfigs.release } } } 

Вот и все. ./gradlew assembleRelease теперь строит и подписывает мой APK без запроса моего пароля.

Антикварные сборки

1) Создайте файл secure.properties чтобы содержать ваши пароли:

 key.store.password=<your keystore password> key.alias.password=<your alias password> 

Вероятно, вы не хотите этого под контролем версий, поэтому мы не помещаем пароли в один из существующих файлов *.properties . Если вы не против иметь свои пароли под контролем версий, поместите эти две строки в ant.properties и все готово.

2) Создайте файл custom_rules.xml чтобы сообщить системе сборки о файле secure.properties .

 <?xml version="1.0" encoding="UTF-8"?> <project name="custom_rules" default="help"> <property file="secure.properties" /> </project> 

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

2b) Любая недавняя версия инструментов Android SDK должна быть хорошей, но если по какой-то причине ваш файл build.xml не содержит следующего, вы должны добавить его:

 <import file="custom_rules.xml" optional="true" /> 

И это должно быть так. ant release теперь строит и подписывает мой APK без запроса моего пароля.

Вы можете определить конфигурацию хранилища ключей в своих проектах project.properties в папке проекта. Именно так

key.store = / путь / к / файлу / хранилище ключей

key.alias = yourkeyalias

key.store.password = yourkeystorepassword

key.alias.password = yourkeyaliaspassword

Просто примечание … Я не хотел устанавливать пароли в реквизите, и по умолчанию ваш пароль будет отображаться в командной строке, что также вызывает беспокойство. Добавление использования SecureInputHandler к вам main_rules.xml работает так, что ваш пароль не отображается в командной строке.

 <target name="-release-prompt-for-password" if="has.keystore" unless="has.password"> <!-- Gets passwords --> <input message="Please enter keystore password (store:${key.store}):" addproperty="key.store.password" > <handler classname="org.apache.tools.ant.input.SecureInputHandler" /> </input> <input message="Please enter password for alias '${key.alias}':" addproperty="key.alias.password" > <handler classname="org.apache.tools.ant.input.SecureInputHandler" /> </input> </target> 

Взгляните на эту статью, особенно там, где она начинает упоминать key.store.password . Я использовал его без проблем.

В основном вы должны создать файл secure.properties локальный для вашей ( secure.properties ) машины, который должен быть относительно безопасным, например, недоступным для всех или не сохраненным для всех в исходном управлении. Этот файл хранит пароли как свойства с правильными именами и импортируется в файл сборки проекта ANT.