Я хотел бы иметь мою сборку 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
файлы.
Любые предложения о том, как решить эту проблему?
Ответы:
Проще, чем предыдущие ответы:
Поместите это в
~/.gradle/gradle.properties
Измените ваш
app/build.gradle
и добавьте это внутриandroid {
блока кода:Тогда вы можете запустить
gradle assembleRelease
Также см. Ссылку на
signingConfigs
Gradle DSL.источник
file()
всегда предполагает относительные пути. Используйте,new File(path)
если хотите, чтобы это воспринималось как абсолютное.Мне удалось решить это, добавив этот код и собрав
gradle build
:Это создает подписанный релиз apk-файл.
источник
gradle build
илиgradlew build
в терминале / запросить командуОбратите внимание, что скрипт @ sdqali будет (по крайней мере, при использовании Gradle 1.6) запрашивать пароль каждый раз, когда вы вызываете любую задачу gradle. Поскольку вам это нужно только при выполнении
gradle assembleRelease
(или подобном), вы можете использовать следующий прием:Обратите внимание, что я также должен был добавить следующее (под Android), чтобы это работало:
источник
installRelease
исчезли из списка задач ... Почему?KEYSTORE
должна быть определена даже для отладочных сборок и для «gradle sync» внутри Android Studio, иначе это приведет к ошибке, когда путь будет нулевым.Если вы хотите избежать жесткого кодирования вашего хранилища ключей и пароля в build.gradle , вы можете использовать файл свойств, как описано здесь: ОБРАБОТКА ПОДПИСАННЫХ КОНФИГОВ С GRADLE
В принципе:
1) создайте файл myproject.properties по адресу /home/[username]/.signing с таким содержимым:
2) создайте файл gradle.properties (возможно, в корне каталога вашего проекта) с содержимым:
3) обратитесь к нему в вашем build.gradle следующим образом:
источник
Автоматическая подпись приложения с помощью Gradle при использовании git
Удивительно, как много запутанных способов сделать это. Вот мой собственный путь, где я стараюсь придерживаться собственной рекомендации Googles . Однако их объяснение не до конца понятно, поэтому я опишу процедуру для Linux подробнее.
Описание:
Инструкции Google по умолчанию для автоматической подписи приложения во время сборки без сохранения паролей и файлов подписи в пути разработки приложения (GIT) довольно неясны. Вот поясненные пошаговые инструкции, как это сделать.
Исходные предположения:
У вас есть приложение под названием «MyApp» в директории , заданной по следующему пути:
$HOME/projects/mydev/MyApp
. Однако каталог MyApp используется и управляется с помощью GIT.проблема
Мы, очевидно, не хотим, чтобы наши файлы сигнатур или паролей находились где-либо в каталоге, контролируемом GIT, даже если мы очень способны их использовать и
.gitignore
т. Д., Все равно слишком рискованно и легко допустить ошибку. Таким образом, мы хотим, чтобы наше хранилище ключей и файлы подписи снаружи.Решение
Нам нужно сделать три (3) вещи:
build.gradle
файл модуля, чтобы использовать (1) и (2).Для этого примера мы назовем два файла:
keystore.properties
MyApp-release-key.jks
Мы можем поместить оба этих файла здесь:
(1) Создайте файл паролей хранилища ключей
Первый файл содержит пароли в виде открытого текста, используемые в; и пути к файлу ключа разблокировки в (2). Начните с заполнения, так как это сделает операцию копирования вставкой проще для следующего шага.
Отредактируйте
keystore.properties
так, чтобы это было:Единственная сложная часть здесь, это
myStoreFileLocation
. Это путь, как видно изbuild.gradle
файла модуля во время сборки. Как правило , это означает , что путь похож и по отношению к:$HOME/projects/mydev/MyApp/app/build.gradle
. Итак, чтобы указать наMyApp-release-key.jks
файл, нам нужно поместить здесь:../../../MyApp-release-key.jks
Здесь мы также выбрали псевдоним "myapp" для ключа. Тогда финальный файл должен выглядеть так:
(2) Создайте файл подписи
Второй файл генерируется автоматически при создании ключа подписи. Если у вас нет других приложений и это ваше единственное хранилище ключей, то создайте файл с:
Это попросит вас ввести два пароля и кучу информации. (То же самое, что и в Android Studio.) Теперь скопируйте / вставьте ранее выбранные пароли.
(3) Отредактируйте файл модуля,
gradle.build
чтобы использовать вышеуказанноеСледующие части должны присутствовать в файле сборки вашего приложения / модуля Gradle. Сначала добавьте следующие строки снаружи и перед вашим
android {}
блоком.Затем, внутри в
android {}
блоке, добавьте:Теперь из оболочки вы можете пересобрать свое приложение с помощью:
Это должно создать правильно подписанное приложение, которое можно использовать в Google Play.
ОБНОВЛЕНИЕ: 2019-04-02
Более поздние версии
keytool
и кое-что говорят вам, что вы должны использовать файл ключей на основе PKCS12 вместо оригинального / default, как я использую выше. Затем они все время говорят вам, что вам следует перейти на новый открытый формат PKCS12. Однако, похоже, что инструменты разработки Android еще не совсем готовы к этому, потому что если вы это сделаете, вы получите следующие странные ошибки:Так что не используйте конвертированный ключ!
источник
keystore.properties
файл в систему управления версиями, поэтому сборка работает на машинах разработчиков. Я описал настройку сервера сборки здесь .keytool
генерации PKCS12 хранилища ключей: вы можете передать-storetype JKS
вkeytool
команде , чтобы установить тип хранилища ключей JKS , который необходим в Android инструментами.Как сказал @Destil, но позвольте другим, у кого нет ключа для сборки: проще, чем предыдущие ответы:
Поместите это в
~/.gradle/gradle.properties
Измените ваш,
build.gradle
как это:Тогда вы можете запустить
gradle assembleRelease
ИЛИgradle build
источник
(В ответ на user672009 выше.)
Еще более простое решение, если вы хотите сохранить свои пароли в хранилище git; тем не менее, хотите включить в него свой build.gradle, который прекрасно работает даже с различными вариантами продуктов, - это создать отдельный файл gradle. Давайте назовем это «signature.gradle» (включите его в ваш .gitignore). Так же, как если бы это был ваш файл build.gradle, за вычетом всего, что не относится к входу в него.
Затем в вашем файле build.gradle включите эту строку прямо под "применить плагин: 'android'"
Если у вас нет или вы используете несколько ароматов, переименуйте «flav1» в «release» выше, и все будет готово. Если вы используете ароматизаторы, продолжайте.
Наконец, свяжите ваши варианты с его правильным signatureConfig в вашем файле build.gradle, и вы должны закончить.
источник
Если у вас уже есть файл хранилища ключей, это может быть так же просто, как добавить несколько параметров в вашу команду сборки:
Не требуется постоянных изменений в вашем проекте Android.
Источник: http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm
источник
Это ответ на user672009 и дополнение к сообщению sdqali (его код падает при сборке отладочной версии при нажатии кнопки «Выполнить» в IDE):
Вы можете использовать следующий код:
источник
keyPassword new String(console.readPassword("Enter key password: "))
чтобы убедиться, что ваш пароль не отображается во время вводаВ более новой Android Studio есть графический интерфейс, который очень прост, и он также заполняет файл Gradle.
File -> Project Structure
Module ->
Выберите основной модуль («приложение» или другое пользовательское имя)Signing
вкладка -> Плюс изображение для добавления новой конфигурацииЗаполните данные на правой стороне
ОК и Gradle файл создается автоматически
Вам придется вручную добавить строку
signingConfig signingConfigs.NameOfYourConfig
внутриbuiltTypes{release{}}
Картинки:
Два важных (!) Примечания:
(РЕДАКТИРОВАТЬ 12/15)
Чтобы создать подписанный APK, вам нужно открыть вкладку «Терминал» в Android Studio (внизу основного интерфейса) и выполнить команду
./gradlew assembleRelease
Если вы забыли
keyAlias
(что часто случается со мной), вам нужно будетBuild -> Generate Signed APK
запустить процесс и увидеть имя ключа Alias.источник
build.gradle
файл, не так ли?Если вы собираете apk через командную строку, как я, тогда вы можете указать конфигурацию подписи в качестве аргументов.
Добавьте это к вашему
build.gradle
Сделай
signingConfigs
такЗатем вы выполняете,
gradlew
как этоисточник
build.gradle
? Верхний уровень? Пожалуйста, добавьте больше кодаapp/build.gradle
файл, о котором я говорю.источник
Вы также можете использовать опцию командной строки -P команды gradle, чтобы помочь подписанию. В свой build.gradle добавьте singingConfigs вот так:
Затем вызовите gradle build следующим образом:
Вы можете использовать -P для установки storeFile и keyAlias, если хотите.
Это в основном решение Destil, но с параметрами командной строки.
Для получения более подробной информации о свойствах gradle, обратитесь к руководству пользователя gradle .
источник
Ответ @ Destil хорош, если вы можете использовать одну и ту же конфигурацию во всех проектах. В качестве альтернативы Android Studio поставляется с
local.properties
файлом, который можно использовать вместо этого, но он предположительно генерируется IDE, и я не могу найти способ расширить его из Android Studio.Это вариант ответа @ jonbo . Этот ответ допускает специфичные для проекта настройки, но требует от разработчика некоторых накладных расходов. В частности, для переноса
signingConfigs
определения в отдельный файл требуется значительный шаблон - особенно если вам нужно сделать это для нескольких проектов, что является основной причиной выбора этого решения вместо Destil's. Это может быть несколько облегчено также включая линиюв файле учетных данных, так как это позволит завершить IDE.
Наконец, большинство решений здесь не позволяют строить проект в режиме отладки - который обрабатывает отладку-подпись автоматически - без предоставления синтаксически, если не семантически правильного
signingConfigs
определения. Если вам не нужно производить сборку релиза с данного компьютера, этот дополнительный шаг можно рассматривать как ненужное препятствие. С другой стороны, это может помочь против невежественных или ленивых коллег, использующих отладочные сборки в производстве.Это решение позволит отлаживать сборки, не беспокоясь об учетных данных, но для создания сборок выпусков потребуются действительные учетные данные, а для этого требуется очень мало стандартного образца. Однако, как недостаток, это может побудить других заменить фиктивные значения реальными учетными данными, и от этого не существует способа защиты.
Это создает фиктивное свойство, которое служит исключительно для создания синтаксически правильного файла сборки. Значения, присвоенные
ext.signing
свойствам `s, не имеют значения, насколько идут отладочные сборки. Чтобы включить релиз сборки, копиюext.signing
вsigning.gradle
и заменить значения фиктивных с действительными учетными данными.Конечно,
signing.gradle
должен быть проигнорирован VCS.источник
Почти все платформы теперь предлагают какие-то брелоки, поэтому нет смысла оставлять пароли с открытым текстом.
Я предлагаю простое решение , которое использует модуль Python Keyring ( в основном компаньон консоль сценарий
keyring
) и минимальную оболочку вокруг Groovy['do', 'something'].execute()
функции :Используя эту функцию,
signingConfigs
раздел становится:Перед запуском
gradle assembleRelease
вы должны установить пароли в связке ключей только один раз:Счастливые релизы!
источник
Расширяя ответ Дэвида Вавра, создайте файл ~ / .gradle / gradle.properties и добавьте
Потом в build.gradle
источник
Мне было очень весело выяснить это. Вот мой проход.
Краткое руководство по созданию файла сборки gradle в IntelliJ (v.13.1.4). В этом пошаговом руководстве предполагается, что вы знаете, как создать файл хранилища ключей. Чтобы этот учебник работал, вам потребуется, чтобы файл хранилища ключей находился в папке вашего приложения, а файл zipalign.exe должен находиться в папке «SDK-ROOT \ tools». Этот файл обычно находится в 'SDK-ROOT \ build-tools', и в этой папке он находится в самой высокой папке API (альфа или бета, я рекомендую альфа-версию).
Для тех из вас, кто хочет прыгнуть прямо сюда, есть файл сборки gradle.
Вы можете собрать часть этого файла сборки (см. Выше) из пункта меню: Структура файла / проекта. Здесь выберите Facets и нажмите «Android-Gradle (приложение)». Отсюда вы увидите вкладки: «Свойства», «Подписание», «Ароматы», «Типы сборки» и «Зависимости», для этого пошагового руководства мы просто будем использовать «Подписывание» и «Типы сборки». В разделе «Типы сборки» (в разделе «Имя») введите любое имя, которое вы хотите идентифицировать для своей конфигурации типа сборки, а в других 4 полях введите информацию о вашем хранилище ключей (задав путь к хранилищу ключей, который находится в папке вашего приложения).
Под полем «Типы сборки» введите значение «assemblyRelease» в поле имени, для «Debuggable» должно быть установлено значение «ложь», для «Jni Debug Build» должно быть значение «ложь», для параметра «Запустить Proguard» - значение «истина», а для параметра «Zip Align» - значение «истина». Это создаст файл сборки, но не так, как показано выше, вам придется добавить несколько вещей в файл сборки позже. Расположение файла ProGuard здесь будет установлено вручную в файле сборки Gradle. (как показано выше)
Контейнеры DSL, которые вы должны будете добавить после этого:
Вы также должны будете добавить:
обратите внимание, что указанный выше контейнер DSL («зависимости») должен находиться внизу файла конфигурации, но не внутри контейнера DSL android. Чтобы построить контейнер зависимостей из меню IntelliJ, выберите: File / Project Structure. Оттуда снова выберите Facets, а затем Android-Gradle (приложение). Вы увидите те же 5 вкладок, как указано выше. Выберите вкладку «Зависимости» и добавьте необходимые зависимости.
После того, как все это будет сделано, вы должны увидеть файл сборки Gradle, похожий на файл в верхней части этого пошагового руководства. Чтобы создать подписанный релиз с выравниванием по почтовому индексу, вам нужно открыть задачи Gradle. Вы можете попасть в это окно, выбрав View / Tool Windows / Gradle. Отсюда вы можете дважды щелкнуть по ссылке «AsAsmbleRelease». Это должно создать ваш развертываемый APK.
Потенциальные проблемы, которые могут возникнуть при компиляции вашего релиза: (но не ограничиваясь ими): ваш файл сборки Gradle находится не в том месте. Есть два файла сборки Gradle; один в корневой папке приложения, а другой в папке приложения под корнем приложения. Вы должны использовать последнее.
У вас также могут быть проблемы с ворсом. (Примечание: Android Developer Studio гораздо лучше распознает проблемы с Lint, чем IntelliJ, вы заметите это при попытке создать подписанный APK из параметров меню)
Чтобы обойти проблемы с линтом, вам нужно поместить следующий контейнер DSL внутри контейнера Android (вверху):
размещение этого в вашем DSL-контейнере для Android приведет к генерации файла ошибки в папке сборки (непосредственно в папке вашего приложения), имя файла должно быть примерно таким: «lint-results-release-fatal.html», этот файл сообщит вам класс, где произошла ошибка. Другой файл, который будет сгенерирован, - это файл XML, который содержит «идентификатор проблемы», связанный с ошибкой lint. Имя файла должно быть что-то вроде 'lint-results-release-fatal.xml'. Где-то в верхней части файла вы увидите «проблему» узла, внутри которой вы увидите нечто похожее на «id =" IDOfYourLintProblem "'
Чтобы устранить эту проблему, откройте файл в своем проекте, который был указан в файле 'lint-results-assemblyRelease-fatal.html', и введите следующую строку кода в файле класса Java чуть выше имени класса: @SuppressLint ("IDOfYourLintProblem «). Возможно, вам придется импортировать 'android.annotation.SuppressLint;'
Таким образом, ваш файл классов Java должен выглядеть так:
Обратите внимание, что подавление ошибок ворса не всегда является лучшей ИДЕЕЙ, вам может быть лучше изменить код, вызвавший ошибки ворса.
Другая проблема, которая может возникнуть, - это если вы не задали переменную среды для переменной среды Gradle HOME. Эта переменная называется «GRADLE_HOME» и должна указывать путь к домашнему каталогу gradle, что-то вроде «C: \ gradle-1.12». Иногда вам также может потребоваться установить переменную среды для «ANDROID_HOME», установив для нее «YOUR- SDK-Root \ SDK»
После того, как это сделано, вернитесь в окно задач Gradle и дважды щелкните по ссылке AsAsmbleRelease.
Если все прошло успешно, вы сможете перейти в папку app \ build \ apk и найти развертываемый APK-файл.
источник
Еще один подход к той же проблеме. Поскольку не рекомендуется хранить какие-либо учетные данные в исходном коде, мы решили установить пароли для хранилища ключей и псевдонима ключей в отдельном файле свойств следующим образом:
Если вы используете git, вы можете создать текстовый файл с именем, например, secure.properties. Вы должны обязательно исключить его из своего хранилища (если вы используете git, добавьте его в файл .gitignore). Затем вам нужно будет создать конфигурацию подписи, как показывают некоторые другие ответы. Разница лишь в том, как вы будете загружать учетные данные:
Никогда не забывайте назначать signatureConfig типу сборки релиза вручную (по некоторым причинам я иногда предполагаю, что он будет использоваться автоматически). Также не обязательно включать proguard, но это рекомендуется.
Нам нравится этот подход лучше, чем использование переменных среды или запрос пользовательского ввода, потому что это можно сделать из среды IDE, переключившись на тип сборки realease и запустив приложение, вместо того, чтобы использовать командную строку.
источник
Android Studio Перейдите в Файл -> Структура проекта или нажмите Ctrl + Alt + Shift + S
Посмотреть изображение
Нажмите Ok
Затем signatureConfigs сгенерирует ваш файл build.gradle.
источник
У меня было несколько проблем, которые я поставил следующую строку в неправильном месте:
Убедитесь, что вы поместили части signatureConfigs в раздел android:
вместо
Легко сделать эту ошибку.
источник
Это 2019 год, и мне нужно подписать APK с V1 (подпись jar) или V2 (полная подпись APK). Я погуглил "генерировать подписанный apk gradle", и это привело меня сюда. Поэтому я добавляю свое оригинальное решение здесь.
Мой оригинальный вопрос: Как использовать V1 (подпись Jar) или V2 (полная подпись APK) из файла build.gradle
источник
Чтобы дополнить другие ответы, вы также можете поместить файл gradle.properties в свою папку модуля вместе с build.gradle на тот случай, если ваше хранилище ключей относится к одному проекту.
источник
Я работаю в Ubuntu14.04. vim ~ / .bashrc и добавить экспорт ANDROID_KEYSTORE = экспорт ANDROID_KEYALIAS =
а затем в build.gradle установить.
источник
System.console()
возвращаетсяnull
.Альтернативой является определение задачи, которая выполняется только в сборках выпуска.
источник
Вы можете запросить пароли из командной строки:
if-then-else
Блок предотвращает запросы паролей , когда вы создаете релиз. Хотяelse
ветка недоступна, она заставляет Gradle создатьinstall...Release
задачу.Предыстория . Как отмечается в https://stackoverflow.com/a/19130098/3664487 , « Сценарии Gradle могут запрашивать ввод данных пользователем с помощью System.console (). Метод readLine ». К сожалению, Gradle всегда будет запрашивать пароль, даже когда вы создаете отладочную версию (см. Как создать файл с подписанным выпуском apk с помощью Gradle? ). К счастью, это можно преодолеть, как я показал выше.
источник
Добавлю мой способ сделать это в React-Native с помощью пакетаact-native-config .
Создайте файл .env:
обратите внимание, что это не должно быть частью контроля версий.
в вашем
build.gradle
:источник
В моем случае я загружал неправильный apk в выпуск другого приложения.
источник
Для Groovy (build.gradle)
Не следует помещать свои учетные данные для подписи непосредственно в файл build.gradle . Вместо этого учетные данные должны исходить из файла, который не контролируется версиями.
Поместите файл signature.properties, где находится модуль build.gradle . Не забудьте добавить его в свой файл .gitignore !
signing.properties
build.gradle
источник
Для Kotlin Script (build.gradle.kts)
Вы не должны помещать свои учетные данные для подписи непосредственно в build.gradle.kts файл . Вместо этого учетные данные должны исходить из файла, который не контролируется версиями.
Поместите файл signature.properties, в котором находится модуль build.gradle.kts для конкретного модуля . Не забудьте добавить его в свой файл .gitignore !
signing.properties
build.gradle.kts
источник
если вы не хотите видеть Cannot вызвать метод readLine () для нулевого объекта. Вам нужно сначала написать в gradle.properties .
источник