Автоматизация для выпуска Android
У меня есть десять проектов Android в одной папке. Для каждого проекта я могу использовать ant debug
для его создания. Таким образом, нетрудно написать простой script для компиляции всех этих проектов. Я использую Hudson для ежедневного создания этих проектов, и он отлично работает.
Но теперь наш проект должен перейти на этап выпуска. Поэтому команда компиляции становится ant release
. Для компиляции проекта выпуска я должен вводить пароль для сертификата каждый раз во время компиляции. Поэтому я не могу сделать автоматизацию для выпуска.
Эта компиляционная работа убивает меня, так как у меня есть десять проектов, которые все должны взаимодействовать с вводом пароля.
Как я могу сделать сборку по-прежнему автоматической?
Ответы
Ответ 1
Предполагая, что вы используете последние Android-инструменты, скажите v9 или v10.
Если вы посмотрите 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 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>
Итак, я бы предположил, что вам нужно передать четыре элемента в build.xml: key.store
, key.alias
, key.store.password
, key.alias.password
.
И не забывайте передавать эти определения в командной строке из соображений безопасности.:)
Ответ 2
Gradle построены
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 без запроса моего пароля.
Ant построенные сборки
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
element name
или default
, но я считаю, что то, что я выбрал, должно работать для всех.
2b) Любая недавняя версия инструментов Android SDK должна быть хорошей, но если по какой-то причине ваш файл build.xml
не содержит следующего, вы должны добавить его:
<import file="custom_rules.xml" optional="true" />
И это должно быть так. ant release
теперь строит и подписывает мой APK без запроса моего пароля.
Ответ 3
Вы можете определить конфигурацию своего хранилища ключей в своих проектах project.properties в папке проекта.
Так же, как это
key.store =/путь/к/вашим/хранилище ключей
key.alias = yourkeyalias
key.store.password = yourkeystorepassword
key.alias.password = yourkeyaliaspassword
Ответ 4
Просто примечание... Я не хотел устанавливать пароли в реквизите, и по умолчанию ваш пароль будет отображаться в командной строке, что также вызывает беспокойство. Добавление использования 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>
Ответ 5
посмотрите эту статью, особенно там, где она начинает упоминать key.store.password
. Я использовал его без проблем.
В принципе, вы должны создать локальный файл secure.properties
на вашей (сборной) машине, который должен быть относительно безопасным, например. недоступны для всех или не сохраняются для всех в исходном управлении. Этот файл хранит пароли как свойства с правильными именами и импортируется в файл сборки проекта ANT.