Intereting Posts
Андроид получить общий аудиовыход устройства в pcm Как добавить маржу между ракетой-носителем и ее можно использовать? Разрешения на приложение для Android Marshmallow в PhoneGap Android: есть ошибка, когда я нажимаю на свой editText Socialauth-android получает токен-токен и использует информацию об учетной записи на устройстве Зная, когда карта перестала прокручиваться (например, «moveend» в javascript API) Android-приложение Android не может обрабатывать javascript? "Android.view.WindowManager $ BadTokenException: невозможно добавить окно" на buider.show () HttpURLConnection: java.lang.IllegalStateException: уже подключено Как обновить базу данных, не удаляя данные, введенные пользователем в предыдущей базе данных? Название центра Android с навигационным ящиком Ошибка веб-браузера Android не найдена Что проще для кода: Android App vs iOS App? Proguard с кодом ошибки возврата Unity3d 1 Отображение общего доступа Android на других устройствах

Как создать выпуск подписанного файла apk с помощью Gradle?

Я хотел бы, чтобы моя сборка Gradle создала файл apk с выпуском, используя Gradle.

Я не уверен, правилен ли код или если у меня отсутствует параметр при создании gradle build ?

Это часть кода в моем файле gradle:

 android { ... signingConfigs { release { storeFile file("release.keystore") storePassword "******" keyAlias "******" keyPassword "******" } } } 

Конструкция градиента завершает SUCCESSFUL, и в моей папке build/apk я вижу только файлы ...-release-unsigned.apk и ...-debug-unaligned.apk .

Любые предложения о том, как это решить?

Solutions Collecting From Web of "Как создать выпуск подписанного файла apk с помощью Gradle?"

Проще, чем предыдущие ответы:

Поместите это в ~/.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 release.

Обратите внимание, что скрипт @ sdqali (по крайней мере, при использовании Gradle 1.6) запрашивает пароль в любое время, когда вы вызываете любую задачу градиента. Так как вам это нужно только при выполнении 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 } } 

Если вы хотите избежать жесткого кодирования своего хранилища ключей и пароля в build.gradle , вы можете использовать файл свойств, как описано здесь: ОБРАЩЕНИЕ ПОДПИСАНИЯ КОНФИГУРИРОВАНИЕ С ГРАДОЙ

В основном:

1) создайте файл myproject.properties по адресу /home/[username]/.signing с таким содержимым:

 keystore=[path to]\release.keystore keystore.password=********* keyAlias=*********** keyPassword=******** 

2) создайте файл gradle.properties (возможно, в корне вашей директории проекта) с содержимым:

 MyProject.properties=/home/[username]/.signing/myproject.properties 

3) обратитесь к нему в свой build.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 или gradle build

(В ответ на user672009 выше.)

Еще более простое решение, если вы хотите сохранить свои пароли из репозитория git; Тем не менее, хотите включить в него свой build.gradle, который отлично работает с продуктами, – это создать отдельный файл градимента. Назовем его «sign.gradle» (включите его в свой .gitignore). Как будто это ваш файл build.gradle минус все, что не связано с его входом.

 android { signingConfigs { flavor1 { storeFile file("..") storePassword ".." keyAlias ".." keyPassword ".." } flavor2 { storeFile file("..") storePassword ".." keyAlias ".." keyPassword ".." } } } 

Затем в файле build.gradle укажите эту строку прямо под «применить плагин:« android »»

  apply from: 'signing.gradle' 

Если у вас нет или используйте несколько вариантов, переименуйте «flavor1», чтобы «высвободить» выше, и вы должны быть закончены. Если вы используете ароматы, продолжайте.

Наконец, привяжите свои вкусы к правильному signConfig в файле build.gradle, и вы должны быть закончены.

  ... productFlavors { flavor1 { ... signingConfig signingConfigs.flavor1 } flavor2 { ... signingConfig signingConfigs.flavor2 } } ... 

Это ответ на user672009 и дополнение к сообщению sdqali (его код выйдет из строя при создании отладочной версии кнопкой «Run» 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.

  1. File -> Project Structure

  2. Module -> Выберите основной модуль («приложение» или другое пользовательское имя)

  3. Вкладка « Signing » -> Плюс для добавления новой конфигурации

  4. Заполните данные с правой стороны

  5. Файл OK и Gradle автоматически создается

  6. Вы должны вручную добавить строку signingConfig signingConfigs.NameOfYourConfig внутри builtTypes{release{}}

Изображений:

Введите описание изображения здесь

Введите описание изображения здесь

Две важные (!) Заметки:

(EDIT 12/15)

  1. Чтобы создать подписанный APK, вам нужно открыть вкладку «Терминал» в Android Studio (внизу основного интерфейса) и выдать команду ./gradlew assembleRelease

  2. Если вы забыли keyAlias (что часто случается со мной), вам нужно будет инициировать Build -> Generate Signed APK чтобы запустить процесс и увидеть имя ключа Alias.

 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 } } } 

Если вы создаете 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" 

Вы также можете использовать опцию командной строки -P для градации, чтобы помочь подписать. В вашем build.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, но с параметрами командной строки.

Дополнительные сведения о свойствах градиентов см. В руководстве пользователя .

@ Ответ Destil хорош, если вы можете повторно использовать одну и ту же конфигурацию для всех проектов. В качестве альтернативы, Android Studio поставляется с файлом local.properties который может быть использован вместо этого, но он, предположительно, сгенерирован IDE, и я не могу найти способ его расширения из Android Studio.

Это вариация ответа @ jonbo . Этот ответ позволяет задавать конкретные параметры проекта, но на него приходится немного накладных расходов на разработку. В частности, для signingConfigs определения signingConfigs в отдельный файл требуется значительный шаблонный шаблон, особенно если вам нужно сделать это для нескольких проектов, что является основной причиной для выбора этого решения над Destil. Это может быть несколько смягчено, включая также линию

 apply plugin: 'com.android.application' 

В файле учетных данных, так как это позволит завершить IDE.

Наконец, большинство решений здесь не позволяют строить проект в режиме отладки – который автоматически обрабатывает отладочную подпись – без предоставления синтаксически, если не семантически допустимого определения 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 сборки, скопируйте 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.

Автоматическое подписывание приложений с помощью Gradle при использовании git

Удивительно, как много запутанных способов для этого. Вот мой собственный путь, где я стараюсь придерживаться собственной рекомендации Googles. Однако их объяснение не совсем понятно, поэтому я подробно опишу процедуру Linux.


Описание:

По умолчанию инструкции Google для автоматической подписи приложения во время сборки, не сохраняя пароли и файлы подписи на пути разработки приложений (GIT), довольно неясны. Ниже приведены поясненные пошаговые инструкции, как это сделать.

Исходные предположения:

У вас есть приложение под названием «MyApp» в каталоге, заданном следующим путем: $HOME/projects/mydev/MyApp . Однако каталог MyApp используется и управляется с помощью GIT.

Введите описание изображения здесь

проблема

Мы, очевидно, не хотим, чтобы наши файлы подписи или пароля находились где-нибудь в директории, управляемой GIT, даже если мы очень .gitignore использовать .gitignore т. Д., Все еще слишком рискованно и легко ошибиться. Поэтому мы хотим, чтобы наши хранилища ключей и файлы подписи были снаружи.

Решение

Нам нужно сделать три (3) вещи:

  1. Создайте файл паролей, который будет использоваться Android Studio
  2. Создать ключевой файл подписи
  3. Отредактируйте файл build.gradle модуля для использования (1) и (2).

В этом примере мы называем два файла:

  1. keystore.properties
  2. MyApp-release-key.jks

Мы можем поместить оба этих файла здесь:

 cd $HOME/projects/mydev/ 

(1) Создайте файл пароля хранилища ключей

В первом файле содержатся понятные текстовые пароли; И пути к файлу ключа release в (2). Начните с заполнения этого, так как это облегчит операцию копирования в следующем шаге.

 cd $HOME/projects/mydev/ 

Измените 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)) 

Затем внутри блока 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.

Почти все платформы теперь предлагают какой-то брелок, поэтому нет причин оставлять прозрачные текстовые пароли.

Я предлагаю простое решение, которое использует модуль Python Keyring (главным образом консольный скрипт для консольной консоли) и минимальную оболочку вокруг функции Groovy ['do', 'something'].execute() :

 def execOutput= { args -> def proc = args.execute() proc.waitFor() def stdout = proc.in.text return stdout.trim() } 

Используя эту функцию, секция signingConfigs становится:

 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 вы должны установить пароли в своем gradle assembleRelease только один раз:

 $ keyring set google-play android.keystore # will be prompted for the passwords $ keyring set google-play com.example.app 

Счастливые релизы!

Мне было очень весело понять это. Вот моя прогулка.

Прохождение A to Z о том, как создать файл сборки градиента в IntelliJ (v.13.1.4). Этот переход предполагает, что вы знаете, как создать файл хранилища ключей. Чтобы этот учебник работал, вам понадобится файл хранилища ключей, который будет находиться в папке вашего приложения, и вам нужно будет установить файл zipalign.exe в «SDK-ROOT \ tools». Этот файл обычно находится в «SDK-ROOT \ build-tools», и в этой папке он будет находиться в самой высокой папке api (альфа или бета, я рекомендую альфа-версию).

Для тех из вас, кто хочет прыгнуть прямо здесь, это файл сборки градиента.

 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» в поле имени, «Debuggable» должно быть установлено в false, «Jni Debug Build» должно быть ложным, установите «Run Proguard» на true и «Zip Align» на true. Это будет генерировать файл сборки, но не так, как показано выше, после этого вам придется добавить несколько вещей в файл сборки. Расположение файла ProGuard здесь будет установлено вручную в файле сборки градиента. (Как показано выше)

Ниже перечислены контейнеры 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 выше («зависимости») должен находиться в нижней части файла конфигурации, но не внутри контейнера DSL android. Чтобы создать контейнер зависимостей из меню IntelliJ, выберите: Файл / Структура проекта. Оттуда снова выберите Facets, а затем Android-Gradle (приложение). Вы увидите те же 5 вкладок, что указаны выше. Выберите вкладку «Зависимости» и добавьте необходимые вам зависимости.

После всего этого вы увидите файл сборки Gradle, подобный файлу в верхней части этого прохода. Чтобы создать подписанную версию с выравниванием по zip, вам нужно будет открыть задачи Gradle. Вы можете попасть в это окно, выбрав «Просмотр / Инструмент Windows / Gradle». Отсюда вы можете дважды щелкнуть 'assembleAssembleRelease. Это должно привести к развертыванию APK.

Потенциальные проблемы, которые могут возникнуть при компиляции вашей версии, (но не ограничиваются ими): ваш файл сборки Gradle находится в неправильном месте. Есть два файла сборки Gradle; Один в корневой папке приложения и другой в папке приложения под корнем приложения. Вы должны использовать последнее.

У вас также могут быть проблемы с линией. (Примечание: Android Developer Studio намного лучше обнаруживает проблемы Lint, чем IntelliJ, вы заметите это при попытке создать подписанный APK из опций меню)

Чтобы обойти проблемы с линией, вам нужно будет поместить следующий контейнер DSL внутри контейнера android (вверху):

 android { .... lintOptions { abortOnError false } .... } 

Если вы разместите это в своем контейнере DSL android, вы получите файл ошибки, который будет создан в папке сборки (прямо под вашей папкой приложения), имя файла должно быть чем-то вроде «lint-results-release-fatal.html», этот файл скажет вам, что Класс, в котором произошла ошибка. Другой файл, который будет создан, – это XML-файл, содержащий «идентификатор проблемы», связанный с ошибкой lint. Имя файла должно быть чем-то вроде «lint-results-release-fatal.xml». Где-то рядом с файлом вы увидите узел «проблема», внутри которого вы увидите нечто похожее на «id =» IDOfYourLintProblem »,

Чтобы устранить эту проблему, откройте файл в вашем проекте, который был указан в файле lint-results-assembleRelease-fatal.html, и введите следующую строку кода в файле класса Java чуть выше имени класса: @SuppressLint («IDOfYourLintProblem «). Возможно, вам придется импортировать 'android.annotation.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 не всегда является лучшим IDEA, вам может быть лучше сменить код, вызвавший ошибки ворса.

Еще одна проблема, которая может возникнуть, – это если вы не задали переменную окружения для переменной окружения Gradle HOME. Эта переменная называется «GRADLE_HOME» и должна быть установлена ​​путь к домашнему каталогу gradle, что-то вроде «C: \ gradle-1.12». Иногда вам также может понадобиться установить переменную окружения для «ANDROID_HOME», которая устанавливает это в «YOUR- SDK-Root \ SDK»

После этого вернитесь в окно задач Gradle и дважды щелкните по сборкеAssembleRelease.

Если все будет успешным, вы сможете перейти в папку 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 "******" } } 

Убедитесь, что вы поместили детали подписи в разделе андроида:

 android { .... signingConfigs { release { ... } } } 

вместо

 android { .... } signingConfigs { release { ... } } 

Это легко сделать.

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

 key.store.password=[STORE PASSWORD] key.alias.password=[KEY PASSWORD] 

Если вы используете git, вы можете создать текстовый файл, называемый, например, secure.properties. Вы должны исключить его из своего репозитория (если использовать git, добавив его в файл .gitignore). Затем вам нужно будет создать конфигурацию подписи, как показывают некоторые другие ответы. Единственное различие заключается в том, как вы будете загружать учетные данные:

 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') } ... } } 

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

Нам нравится этот подход лучше, чем использование переменных окружения или запрос пользователя, потому что это можно сделать из IDE, переключившись на тип сборки realease и запустив приложение, вместо того, чтобы использовать командную строку.

Расширяя ответ Дэвидом Вавра, создайте файл ~ / .gradle / gradle.properties и добавьте

 RELEASE_STORE_FILE=/path/to/.keystore RELEASE_KEY_ALIAS=XXXXX RELEASE_STORE_PASSWORD=XXXXXXXXX RELEASE_KEY_PASSWORD=XXXXXXXXX 

Затем в build.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 } } } 

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

Я работаю в Ubuntu14.04. Vim ~ / .bashrc и добавить экспорт ANDROID_KEYSTORE = export ANDROID_KEYALIAS =

А затем в build.gradle.

  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(); } 

You can request passwords from the command line:

 ... 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 block prevents requests for passwords when you're building a release. Although the else branch is unreachable, it tricks Gradle into creating an install...Release task.

Backstory . As noted by https://stackoverflow.com/a/19130098/3664487 , " Gradle scripts can prompt for user input using the System.console().readLine method ." Unfortunately, Gradle will always request a password, even when you're building a debug release (cf. How to create a release signed apk file using Gradle? ). Fortunately, this can be overcome, as I have shown above.

if you don't want to see Cannot invoke method readLine() on null object. you need write in gradle.properties first.

 KEYSTORE_PASS=***** ALIAS_NAME=***** ALIAS_PASS=***** 

If you, like me, just want to be able to run the release on your device for testing purposes, consider creating a second keystore for signing, so you can simply put the passwords for it into your build.gradle without worrying for your market key store security.

You can create a new keystore by clicking Build/Generate Signed APK/Create new…