Как создать APK-файл с подписью релиза с помощью Gradle?
Я хотел бы, чтобы мой Gradle построить, чтобы создать релиз подписан apk-файл с помощью Gradle.
Я не уверен, что код правильный или если я пропускаю параметр при выполнении gradle build
?
Это часть кода в моем файле gradle:
android {
...
signingConfigs {
release {
storeFile file("release.keystore")
storePassword "******"
keyAlias "******"
keyPassword "******"
}
}
}
сборка gradle завершается успешно, и в моем build/apk
Папка я вижу только ...-release-unsigned.apk
и ...-debug-unaligned.apk
файлы.
есть предложения, как решить эту проблему?
26 ответов:
более простой способ, чем предыдущие ответы:
этой
~/.gradle/gradle.properties
RELEASE_STORE_FILE={path to your keystore} RELEASE_STORE_PASSWORD=***** RELEASE_KEY_ALIAS=***** RELEASE_KEY_PASSWORD=*****
изменить
build.gradle
такой:... signingConfigs { release { storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD } } buildTypes { release { signingConfig signingConfigs.release } } ....
затем вы можете запустить
gradle assembleRelease
мне удалось решить его, добавив этот код, и строить с
gradle build
:android { ... signingConfigs { release { storeFile file("release.keystore") storePassword "******" keyAlias "******" keyPassword "******" } } buildTypes { release { signingConfig signingConfigs.release } } }
это создает подписанный файл apk выпуска.
обратите внимание, что скрипт @sdqali будет (по крайней мере, при использовании Gradle 1.6) запрашивать пароль в любое время, когда вы вызываете любой задача gradle. Так как вам это нужно только при выполнении
gradle assembleRelease
(или аналогичный), вы можете использовать следующий трюк:android { ... signingConfigs { release { // We can leave these in environment variables storeFile file(System.getenv("KEYSTORE")) keyAlias System.getenv("KEY_ALIAS") // These two lines make gradle believe that the signingConfigs // section is complete. Without them, tasks like installRelease // will not be available! storePassword "notYourRealPassword" keyPassword "notYourRealPassword" } } ... } task askForPasswords << { // Must create String because System.readPassword() returns char[] // (and assigning that below fails silently) def storePw = new String(System.console().readPassword("Keystore password: ")) def keyPw = new String(System.console().readPassword("Key password: ")) android.signingConfigs.release.storePassword = storePw android.signingConfigs.release.keyPassword = keyPw } tasks.whenTaskAdded { theTask -> if (theTask.name.equals("packageRelease")) { theTask.dependsOn "askForPasswords" } }
обратите внимание, что я также должен был добавить следующее (под Android), чтобы заставить его работать:
buildTypes { release { signingConfig signingConfigs.release } }
Если вы хотите избежать жесткого кодирования вашего хранилища ключей и пароля в построить.gradle, вы можете использовать файл свойств, как описано здесь:ОБРАБОТКА КОНФИГУРАЦИЙ ПОДПИСИ С ПОМОЩЬЮ GRADLE
по сути:
1) Создайте myproject.файл свойств в / home/[username]/.подписание С таким содержанием:
keystore=[path to]\release.keystore keystore.password=********* keyAlias=*********** keyPassword=********
2) создать gradle.файл свойств (возможно, в корне каталога проекта) с помощью содержание:
MyProject.properties=/home/[username]/.signing/myproject.properties
3) обратиться к нему в построить.gradle такой:
if(project.hasProperty("MyProject.properties") && new File(project.property("MyProject.properties")).exists()) { Properties props = new Properties() props.load(new FileInputStream(file(project.property("MyProject.properties")))) signingConfigs { release { storeFile file(props['keystore']) storePassword props['keystore.password'] keyAlias props['keyAlias'] keyPassword props['keyPassword'] } } }
как сказал @Destil, но позвольте другим, у кого нет ключа для сборки: Более простой способ, чем предыдущие ответы:
этой
~/.gradle/gradle.properties
RELEASE_STORE_FILE={path to your keystore} RELEASE_STORE_PASSWORD=***** RELEASE_KEY_ALIAS=***** RELEASE_KEY_PASSWORD=*****
изменить
build.gradle
такой:... if(project.hasProperty("RELEASE_STORE_FILE")) { signingConfigs { release { storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD } } } buildTypes { if(project.hasProperty("RELEASE_STORE_FILE")) { release { signingConfig signingConfigs.release } } } ....
затем вы можете запустить
gradle assembleRelease
ИЛИgradle build
(В ответ на user672009 выше.)
еще более простое решение, если вы хотите сохранить свои пароли из репозитория git; тем не менее, хотите включить свою сборку.gradle в нем, что даже отлично работает с ароматами продукта, заключается в создании отдельного файла gradle. Назовем его подписания.gradle' (включите его в свой .gitignore). Так же, как если бы это было ваше телосложение.файл gradle минус все, что не связано с подписанием в нем.
android { signingConfigs { flavor1 { storeFile file("..") storePassword ".." keyAlias ".." keyPassword ".." } flavor2 { storeFile file("..") storePassword ".." keyAlias ".." keyPassword ".." } } }
затем в вашей сборке.файл gradle включите эту строку прямо под "применить плагин: 'android'"
apply from: 'signing.gradle'
Если у вас нет или вы используете несколько ароматов, переименуйте "flavor1" в "release" выше, и вы должны быть закончены. Если вы используете ароматизаторы, продолжайте.
наконец, свяжите свои ароматы с его правильным signingConfig в вашей сборке.gradle файл, и вы должны быть закончены.
... productFlavors { flavor1 { ... signingConfig signingConfigs.flavor1 } flavor2 { ... signingConfig signingConfigs.flavor2 } } ...
автоматическая подпись приложения с помощью Gradle при использовании git
удивительно, как много запутанных способов для этого. Вот мой собственный путь, где я стараюсь придерживаться Googles самостоятельно рекомендация. Однако их объяснение не совсем понятно, поэтому я подробно опишу процедуру для Linux.
описание:
по умолчанию инструкциям Google для автоматической подписи приложения во время построения, без сохранения паролей и файлов подписей в вашем пути разработки приложений (GIT) довольно неясно. Вот такие пояснил пошаговые инструкции как это сделать.
первоначальные предположения:
у вас есть приложение под названием "MyApp" в каталоге, заданном по следующему пути:
$HOME/projects/mydev/MyApp
. Однако используется каталог MyApp и управляется с помощью GIT.мы, очевидно, не хотим имейте наши файлы подписи или пароля в любом месте управляемый каталог GIT, даже если мы очень можем использовать
.gitignore
и т. д., Это все равно слишком рискованно и легко ошибиться. Поэтому мы хотим, чтобы наши файлы ключей и подписи были снаружи.решение
нужно сделать три (3) вещи:
- создайте файл пароля, который будет использоваться Android Studio
- создать файл ключа подписи
- редактировать модуль
build.gradle
файл для использования (1) и (2).в этом примере мы назовем два файла:
keystore.properties
MyApp-release-key.jks
мы можем поместить оба этих файла здесь:
cd $HOME/projects/mydev/
(1) создайте файл пароля хранилища ключей
первый файл содержит пароли открытого текста, используемые в; и пути к файлу ключа выпуска в (2). Начните с заполнения этого, так как это сделает операцию копирования вставки проще для следующего шаг.
cd $HOME/projects/mydev/
Edit
keystore.properties
так, что это содержание:storePassword=myStorePassword keyPassword=mykeyPassword keyAlias=myKeyAlias storeFile=myStoreFileLocation
единственная сложная часть здесь, это
myStoreFileLocation
. Это путь как видно из модульbuild.gradle
файл во время сборки. Это обычно означает путь, аналогичный и относительно:$HOME/projects/mydev/MyApp/app/build.gradle
. Итак, чтобы указать наMyApp-release-key.jks
файл, что нам нужно поставить здесь:
../../../MyApp-release-key.jks
здесь мы также выбрали псевдоним "myapp" для ключа. Затем окончательный файл надо смотреть:
storePassword=myStorePassword keyPassword=mykeyPassword keyAlias=myapp storeFile=../../../MyApp-release-key.jks
(2) создайте файл подписи
второй файл создается автоматически при создании ключа подписи. Если у вас нет других приложений, и это ваше единственное хранилище ключей, то создайте файл с помощью:
cd $HOME/projects/mydev/ keytool -genkeypair -v -keystore MyApp-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias myapp
это будет просить вас для двух паролей и кучу информации. (То же самое, что и в Android Studio.) Теперь скопируйте / вставьте ранее выбранные пароли.
(3) отредактировать модуль
gradle.build
файл для использования вышеследующие части должны присутствовать в файле сборки Gradle вашего приложения/модуля. Во-первых, добавьте следующие строки за пределами и до код
android {}
блок.//def keystorePropertiesFile = rootProject.file("$HOME/.android/keystore.properties") def keystorePropertiesFile = rootProject.file("../../keystore.properties") def keystoreProperties = new Properties() keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
затем, внутри the
android {}
заблокировать, добавить:android { ... defaultConfig { ... } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } // Tell Gradle to sign your APK buildTypes { release { signingConfig signingConfigs.release ... } } }
теперь из оболочки, вы можете повторно построить свое приложение с:
cd $HOME/projects/mydev/MyApp/app/ ./gradlew clean build
это должно создать правильно подписанное приложение, которое можно использовать в Google Play.
Это ответ для user672009 и дополнение к сообщение sdqali (его код рухнет при создании отладочной версии с помощью кнопки "выполнить" IDE):
вы можете использовать следующий код:
final Console console = System.console(); if (console != null) { // Building from console signingConfigs { release { storeFile file(console.readLine("Enter keystore path: ")) storePassword console.readLine("Enter keystore password: ") keyAlias console.readLine("Enter alias key: ") keyPassword console.readLine("Enter key password: ") } } } else { // Building from IDE's "Run" button signingConfigs { release { } } }
в новой Android Studio есть графический интерфейс, который очень прост, и он также заполняет файл Gradle.
File -> Project Structure
Module ->
выберите основной модуль ('приложение' или другое пользовательское имя)
Signing
tab - > плюс изображение для добавления новой конфигурациизаполнить данные с правой стороны
OK и Gradle файл автоматически создано
вам придется вручную добавить строку
signingConfig signingConfigs.NameOfYourConfig
внутриbuiltTypes{release{}}
изображение:
два важных(!) Примечания:
(EDIT 12/15)
чтобы создать подписанный APK, вам нужно будет открыть вкладку терминала Android Studio (внизу основного интерфейса) и выдать команду
./gradlew assembleRelease
если вы забыли
keyAlias
(что часто случается со мной), вам придется инициироватьBuild -> Generate Signed APK
чтобы запустить процесс и увидеть имя ключа псевдонима.
если вы создаете apk через командную строку, как я, то вы можете предоставить конфигурацию подписи в качестве аргументов.
добавьте это в ваш
build.gradle
def getStore = { -> def result = project.hasProperty('storeFile') ? storeFile : "null" return result } def getStorePassword = { -> def result = project.hasProperty('storePassword') ? storePassword : "" return result } def getKeyAlias = { -> def result = project.hasProperty('keyAlias') ? keyAlias : "" return result } def getKeyPassword = { -> def result = project.hasProperty('keyPassword') ? keyPassword : "" return result }
сделать свой
signingConfigs
такойsigningConfigs { release { storeFile file(getStore()) storePassword getStorePassword() keyAlias getKeyAlias() keyPassword getKeyPassword() } }
тогда вы выполняете
gradlew
такой./gradlew assembleRelease -PstoreFile="keystore.jks" -PstorePassword="password" -PkeyAlias="alias" -PkeyPassword="password"
android { compileSdkVersion 17 buildToolsVersion "19.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 18 } File signFile = rootProject.file('sign/keystore.properties') if (signFile.exists()) { Properties properties = new Properties() properties.load(new FileInputStream(signFile)) signingConfigs { release { storeFile rootProject.file(properties['keystore']) storePassword properties['storePassword'] keyAlias properties['keyAlias'] keyPassword properties['keyPassword'] } } } buildTypes { release { runProguard true zipAlign true proguardFile rootProject.file('proguard-rules.cfg') signingConfig signingConfigs.release } debug { runProguard false zipAlign true } } }
вы также можете использовать - P опция командной строки gradle, чтобы помочь подписанию. В твоем телосложении.gradle, добавьте singingConfigs вот так:
signingConfigs { release { storeFile file("path/to/your/keystore") storePassword RELEASE_STORE_PASSWORD keyAlias "your.key.alias" keyPassword RELEASE_KEY_PASSWORD } }
затем вызовите gradle build следующим образом:
gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build
вы можете использовать-P, чтобы установить storeFile и keyAlias, если вы предпочитаете.
это в основном решение Destil, но с параметрами командной строки.
для получения более подробной информации о свойствах gradle, проверьте руководство пользователя gradle.
Если у вас уже есть файл ключей, это может быть также просто, как добавить несколько параметров в командной сборки:
./gradlew assembleRelease \ -Pandroid.injected.signing.store.file=$KEYFILE \ -Pandroid.injected.signing.store.password=$STORE_PASSWORD \ -Pandroid.injected.signing.key.alias=$KEY_ALIAS \ -Pandroid.injected.signing.key.password=$KEY_PASSWORD
никаких постоянных изменений в вашем проекте Android не требуется.
Источник:http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm
ответ @ Destil хорош, если вы можете использовать одну и ту же конфигурацию во всех проектах. Кроме того, Android Studio поставляется с
local.properties
файл, который может быть использован вместо этого, но он предположительно сгенерирован IDE, и я не могу найти способ расширить его из Android Studio.это вариант @jonbo это. Этот ответ позволяет настроить конкретные параметры проекта, но он поставляется с небольшим количеством накладных расходов разработчика. В частности, значительным шаблоном является требуется переместить
signingConfigs
определение в отдельный файл, особенно если нужно сделать это для нескольких проектов, что является основной причиной для выбора данного решения за Дестиль по. Это может быть несколько уменьшено путем и в том числе строкуapply plugin: 'com.android.application'
в файле учетных данных, так как это позволит завершить IDE.
наконец, большинство решений здесь делать не разрешить построение проекта в режиме отладки -- который обрабатывает debug-signing автоматически -- без предоставления синтаксически, если не семантически допустимого
signingConfigs
определение. Если вам не нужно создавать сборку выпуска с данной машины, этот дополнительный шаг можно рассматривать как ненужное препятствие. С другой стороны, это может быть помощь против невежественных или ленивых коллег, выполняющих отладочные сборки в производстве.это решение позволит отлаживать сборки, не беспокоясь о учетных данных вообще, но для создания сборок выпуска потребуются действительные учетные данные, и это занимает очень мало шаблонной. Однако, как недостаток это может побудить других заменить фиктивные значения реальными учетными данными и нет никакого способа защититься от этого.
// app/build.gradle // Define this structure in signing.gradle to enable release builds. ext.signing = [ storeFilePath : 'path/to/keystore', storePassword : 'keystore password', keyAlias : 'key alias', keyPassword : 'key password', ] if (file('signing.gradle').exists()) { apply from: 'signing.gradle' } android { ... signingConfigs { release { storeFile file(project.signing.storeFilePath) storePassword project.signing.storePassword keyAlias project.signing.keyAlias keyPassword project.signing.keyPassword } } buildTypes { debug { ... } release { signingConfig signingConfigs.release ... } } }
это создает фиктивное свойство, которое служит исключительно для создания синтаксически допустимого файла сборки. Значения, присвоенные
ext.signing
свойства не имеют значения, насколько отладки идти. Чтобы включить сборки выпуска, скопируйтеext.signing
наsigning.gradle
и заменить фиктивные значения действительными полномочия.// signing.gradle ext.signing = [ storeFilePath : 'real/keystore', storePassword : 'real keystore password', keyAlias : 'real key alias', keyPassword : 'real key password', ]
конечно,
signing.gradle
должен быть проигнорирован VCS.
почти все платформы теперь предлагают какой-то брелок, поэтому нет причин оставлять пароли с открытым текстом.
Я предлагаю простое решение, которое использует Python Keyring module (в основном сопутствующий консольный скрипт
keyring
) и минимальная обертка вокруг Groovy['do', 'something'].execute()
характеристика:def execOutput= { args -> def proc = args.execute() proc.waitFor() def stdout = proc.in.text return stdout.trim() }
используя эту функцию, будет:
signingConfigs { release { storeFile file("android.keystore") storePassword execOutput(["keyring", "get", "google-play", storeFile.name]) keyAlias "com.example.app" keyPassword execOutput(["keyring", "get", "google-play", keyAlias]) } }
перед
gradle assembleRelease
вы должны установить пароли в вашем брелоке, только один раз:$ keyring set google-play android.keystore # will be prompted for the passwords $ keyring set google-play com.example.app
счастливый релизы!
расширяя ответ Давида Вавры, создайте файл ~/.среда Gradle/Gradle в.свойства и добавить
RELEASE_STORE_FILE=/path/to/.keystore RELEASE_KEY_ALIAS=XXXXX RELEASE_STORE_PASSWORD=XXXXXXXXX RELEASE_KEY_PASSWORD=XXXXXXXXX
затем в сборке.gradle
signingConfigs { release { } } buildTypes { release { minifyEnabled true shrinkResources true } } // make this optional if ( project.hasProperty("RELEASE_KEY_ALIAS") ) { signingConfigs { release { storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD } } buildTypes { release { signingConfig signingConfigs.release } } }
мне было довольно весело выяснить это. Вот моя проходная.
A to Z пошаговое руководство по созданию файла сборки gradle в IntelliJ (V. 13. 1. 4) Это пошаговое руководство предполагает, что вы знаете, как сделать файл keystore. Чтобы этот учебник работал, вам понадобится, чтобы ваш файл хранилища ключей был расположен в папке вашего приложения, и вам нужно будет иметь свой zipalign.exe-файл, который будет расположен в'SDK-ROOT\tools'. Этот файл обычно находится в "SDK-ROOT\build-tools" и в этой папке он будет в самой высокой папке api (Альфа или бета я рекомендую альфа-версию).
для тех из вас, кто хочет перейти прямо сюда, есть файл сборки gradle.
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.9.+' } } apply plugin: 'android' repositories { mavenCentral() } android { compileSdkVersion 19 buildToolsVersion '20.0.0' defaultConfig { minSdkVersion 8 targetSdkVersion 19 versionCode 1 versionName "1.0" } signingConfigs { playstore { keyAlias 'developers4u' keyPassword 'thisIsNotMyRealPassword' storeFile file('developers4u.keystore') storePassword 'realyItIsNot' } } buildTypes { assembleRelease { debuggable false jniDebugBuild false runProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' zipAlign true signingConfig signingConfigs.playstore } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:20.0.0' compile 'com.android.support:appcompat-v7:20.0.0' }
вы можете построить часть этого файла сборки (выше) из опции меню: структура файла / проекта Здесь выберите фасеты и нажмите " Android-Gradle(приложение). Отсюда вы увидите вкладки: "свойства", "подпись", "вкусы", "типы сборки" и "зависимости" для этого прохода мы просто будем использовать "подпись" и "типы сборки". В разделе "типы сборки" (в разделе Имя) введите любое имя, которое вы хотите идентифицировать конфигурацию типа сборки, а в других 4 полях введите информацию о хранилище ключей (установив путь к хранилищу ключей в папке приложения).
под 'типа' введите значение 'assembleRelease' в поле Name, 'отладке' должен быть установлен в false, 'JNI, у отладочная сборка должна быть ложной, сеть работать должны на true и 'ZIP выровнять' значение true. Это приведет к созданию сборки файл, но не так, как показано выше, вам придется добавить несколько вещей в файл сборки после этого. Расположение файла ProGuard здесь будет установлено вручную в файле сборки gradle. (как показано выше)
контейнеры DSL, которые вам нужно будет добавить после этого, выглядят следующим образом:
android { .... compileSdkVersion 19 buildToolsVersion '20.0.0' defaultConfig { minSdkVersion 8 targetSdkVersion 19 versionCode 1 versionName "1.0" } .... }
Вам также придется добавить:
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:support-v4:20.0.0' compile 'com.android.support:appcompat-v7:20.0.0' }
обратите внимание, что этот контейнер DSL выше ("зависимости") должен быть в нижней части файла конфигурации, но не внутри контейнера Android DSL. В чтобы построить контейнер зависимостей из меню IntelliJ, выберите: структура файла / проекта. Оттуда снова выберите фасеты, а затем Android-Gradle(приложение). Вы увидите те же 5 вкладок, как указано выше. Выберите вкладку "зависимости" и добавьте необходимые зависимости.
после того, как все это будет сделано, вы должны увидеть файл сборки Gradle, похожий на файл в верхней части этого прохода. Чтобы создать свой подписанный zip-релиз, вам нужно будет открыть задачи Gradle. Вы можете перейдите в это окно, выбрав вид/окна инструментов/Gradle. Отсюда вы можете дважды щелкнуть ' assembleAssembleRelease. Это должно создать свой развертыванию АПК.
потенциальные проблемы, которые могут возникнуть при компиляции вашего релиза (но не ограничиваются): ваш файл сборки Gradle находится в неправильном месте. Есть два файла сборки Gradle; один в корневой папке приложения, а другой в папке приложения под корнем приложения. Вы должны использовать последнее.
вы можете также есть проблемы с корпией. (Примечание: Android Developer Studio намного лучше выявляет проблемы с корпией, чем IntelliJ вы заметите это при попытке создать подписанный APK из параметров меню)
чтобы обойти проблемы с корпией, вам нужно будет поместить следующий контейнер DSL внутри контейнера android (вверху):
android { .... lintOptions { abortOnError false } .... }
размещение этого внутри вашего контейнера Android DSL приведет к созданию файла ошибки в папке сборки (непосредственно под папкой приложения) имя файла должно быть что-то вроде 'lint-results-release-fatal.html ' этот файл сообщит вам класс, в котором произошла ошибка. Другой файл, который будет создан, - это XML-файл, содержащий "идентификатор проблемы", связанный с ошибкой lint. Имя файла должно быть что-то вроде 'lint-results-release-fatal.xml'. Где-то в верхней части файла вы увидите узел"проблема", внутри которого вы увидите что-то похожее на 'id= "IDOfYourLintProblem"'
чтобы исправить эту проблему откройте файл в вашем проекте, который был перечислен в 'Линт-результаты-assembleRelease-со смертельным исходом.html ' файл и введите следующую строку кода в файле класса Java чуть выше имени класса: @SuppressLint ("IDOfYourLintProblem"). Возможно, вам придется импортировать " android.аннотация.SuppressLint;'
поэтому ваш файл класса java должен выглядеть так:
package com.WarwickWestonWright.developers4u.app.CandidateArea; import android.annotation.SuppressLint; ... other imports @SuppressLint("IDOfYourLintProblem") public class SearchForJobsFragment extends Fragment {... rest of your class definition}
обратите внимание, что подавление ошибок lint не всегда является лучшей идеей, вам может быть лучше изменить свой код, который вызвал lint ошибки.
еще одна проблема, которая потенциально может возникнуть, если вы не задали переменную среды для переменной среды Gradle HOME. Эта переменная называется 'GRADLE_HOME' и должна быть установлена путь к домашнему каталогу gradle, что-то вроде 'C:\gradle-1.12' Иногда вы также можете установить переменную среды для 'ANDROID_HOME' установите это в 'YOUR-SDK-Root\sdk'
после этого вернитесь в окно задачи Gradle и дважды щелкните assembleAssembleRelease.
если все пройдет успешно, вы сможете перейти в папку app\build\apk и найти свой развертываемый файл APK.
у меня было несколько вопросов, которые я поставил следующую строку в неправильном месте:
signingConfigs { release { // We can leave these in environment variables storeFile file("d:\Fejlesztés\******.keystore") keyAlias "mykey" // These two lines make gradle believe that the signingConfigs // section is complete. Without them, tasks like installRelease // will not be available! storePassword "*****" keyPassword "******" } }
убедитесь, что вы поместили части signingConfigs внутри раздела android:
android { .... signingConfigs { release { ... } } }
вместо
android { .... } signingConfigs { release { ... } }
Это легко сделать эту ошибку.
еще один подход к той же проблеме. Поскольку не рекомендуется хранить какие-либо учетные данные в исходном коде, мы решили установить пароли для хранилища ключей и псевдоним ключа в отдельном файле свойств следующим образом:
key.store.password=[STORE PASSWORD] key.alias.password=[KEY PASSWORD]
Если вы используете git, вы можете создать текстовый файл с именем, например, secure.свойства. Вы должны обязательно исключить его из своего репозитория (если используете git, добавьте его в него .gitignore file). Затем вам нужно будет создать подпись конфигурации, как и некоторые другие ответы указывают. Единственное различие заключается в том, как вы загружаете учетные данные:
android { ... signingConfigs { ... release { storeFile file('[PATH TO]/your_keystore_file.jks') keyAlias "your_key_alias" File propsFile = file("[PATH TO]/secure.properties"); if (propsFile.exists()) { Properties props = new Properties(); props.load(new FileInputStream(propsFile)) storePassword props.getProperty('key.store.password') keyPassword props.getProperty('key.alias.password') } } ... } buildTypes { ... release { signingConfig signingConfigs.release runProguard true proguardFile file('proguard-rules.txt') } ... } }
никогда не забывайте назначать signingConfig типу сборки release вручную (по какой-то причине я иногда предполагаю, что он будет использоваться автоматически). Кроме того, не обязательно включать proguard, но это рекомендуется.
нам нравится этот подход лучше, чем использование переменных среды или запрос пользовательского ввода, потому что это можно сделать из IDE, переключившись на тип сборки realease и запустив приложение, вместо того, чтобы использовать командную строку.
в дополнение к другим ответам, вы также можете разместить свой gradle.файл свойств в вашей собственной папке модуля вместе со сборкой.gradle, на всякий случай, если ваше хранилище ключей относится к одному проекту.
Я работаю в Ubuntu14.04. энергия./~ bashrc и добавить и экспорт ANDROID_KEYSTORE= экспорт ANDROID_KEYALIAS=
а затем в сборке.набор градля.
final Console console = System.console(); if (console != null) { // Building from console signingConfigs { release { storeFile file(System.getenv("KEYSTORE")) storePassword new String(System.console().readPassword("\n$ Enter keystore password: ")) keyAlias System.getenv("KEY_ALIAS") keyPassword new String(System.console().readPassword("\n$ Enter key password: ")) } } } else { // Building from IDE's "Run" button signingConfigs { release { } } }
альтернативой является определение задачи, которая выполняется только в сборках выпуска.
android { ... signingConfigs { release { // We can leave these in environment variables storeFile file('nameOfKeystore.keystore') keyAlias 'nameOfKeyAlias' // These two lines make gradle believe that the signingConfigs // section is complete. Without them, tasks like installRelease // will not be available! storePassword "notYourRealPassword" keyPassword "notYourRealPassword" } } buildTypes { ... release { signingConfig signingConfigs.release ... } } ... } task setupKeystore << { final Console console = System.console(); if (console != null) { //def keyFile = console.readLine(“\nProject: “ + project.name + “Enter keystore path: ")) //def keyAlias = console.readLine(“Project: “ + project.name + “Enter key alias: ") def storePw = new String(console.readPassword(“Project: “ + project.name + “. Enter keystore password: ")) def keyPw = new String(console.readPassword(“Project: “ + project.name + “.Enter keystore password: ")) //android.signingConfigs.release.storeFile = file(keyFile); //android.signingConfigs.release.keyAlias = keyAlias android.signingConfigs.release.storePassword = storePw android.signingConfigs.release.keyPassword = keyPw } } //Validate t def isReleaseConfig = gradle.startParameter.taskNames.any {it.contains('Release') } if (isReleaseConfig) { setupKeystore.execute(); }
вы можете запросить пароли из командной строки:
... signingConfigs { if (gradle.startParameter.taskNames.any {it.contains('Release') }) { release { storeFile file("your.keystore") storePassword new String(System.console().readPassword("\n$ Enter keystore password: ")) keyAlias "key-alias" keyPassword new String(System.console().readPassword("\n$ Enter keys password: ")) } } else { //Here be dragons: unreachable else-branch forces Gradle to create //install...Release tasks. release { keyAlias 'dummy' keyPassword 'dummy' storeFile file('dummy') storePassword 'dummy' } } } ... buildTypes { release { ... signingConfig signingConfigs.release } ... } ...
The
if-then-else
блок предотвращает запросы паролей при создании выпуска. Хотя чемelse
ветка недостижима, она обманывает Gradle в созданииinstall...Release
задач.Предыстория. Как было отмечено https://stackoverflow.com/a/19130098/3664487, "Скрипты Gradle могут запрашивать пользовательский ввод с помощью системы.успокаивать.)(метод readLine." К сожалению, Gradle всегда будет запрашивать пароль, даже когда вы создаете отладочный релиз(см. как создать файл apk с подписью релиза с помощью Gradle?). К счастью, это можно преодолеть, как я показал выше.
Если вы не хотите, чтобы увидеть не удается вызвать метод readLine () на нулевом объекте. нужно писать gradle.свойства первый.
KEYSTORE_PASS=***** ALIAS_NAME=***** ALIAS_PASS=*****
Если вы, как и я, просто хотите иметь возможность запускать релиз на своем устройстве для целей тестирования, рассмотрите создание второго хранилища ключей для подписания, так что вы можете просто поместите пароли для него в свою сборку.gradle не беспокоясь за безопасность вашего ключевого магазина на рынке.
вы можете создать новое хранилище ключей, нажав Build/Generate Signed APK/Create new...