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

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

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

Это код в файле Gradle:

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

Строка Gradle завершает SUCCESSFUL, а в моей папке build/apk я вижу только файлы ...-release-unsigned.apk и ...-debug-unaligned.apk.

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

Ответ 1

Мне удалось решить это, добавив этот код, и построив gradle build:

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

Это создает подписанный файл apk release.

Ответ 2

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

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

Ответ 3

Обратите внимание, что @sdqali script будет (по крайней мере, при использовании 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
    }
}

Ответ 4

Если вы хотите избежать hardcoding вашего хранилища ключей и пароля в build.gradle, вы можете использовать файл свойств, как описано здесь: КОНФИДЕНЦИАЛЬНЫЕ ПОДТВЕРЖДЕНИЯ ОБРАБОТКИ С GRADLE

В принципе:

1) создайте файл myproject.properties в /home/[имя_пользователя]/. подпись с таким содержимым:

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

Ответ 5

Подобно @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

Ответ 6

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

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


Описание:

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

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

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

enter image description here

проблема

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

Решение

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

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

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

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

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

cd $HOME/projects/mydev/

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

Первый файл содержит пароли в виде открытого текста, используемые в; и пути к файлу ключа разблокировки в (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.


ОБНОВЛЕНИЕ: 2019-04-02

Более свежие версии keytool и кое-что говорят вам, что вы должны использовать файл ключей на основе PKCS12 вместо оригинального /default, как я использую выше. Затем они все время говорят вам, что вам следует перейти на новый открытый формат PKCS12. Однако, похоже, что инструменты разработки Android еще не совсем готовы к этому, потому что если вы это сделаете, вы получите следующие странные ошибки:

com.android.ide.common.signing.KeytoolException: удалось прочитать ключ XXX из хранилища "F:\XXX\XXX.jks": ошибка получения ключа: заданный последний блок заполнен неправильно. Такие проблемы могут возникнуть, если во время расшифровки используется плохой ключ.

Так что не используйте конвертированный ключ!

Ответ 7

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

Еще более простое решение, если вы хотите сохранить свои пароли из репозитория git; тем не менее, хотите включить в него свой build.gradle, который отлично работает с продуктами, - это создать отдельный файл 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
      }
  }

  ...

Ответ 8

Это ответ на 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 "Run" button
    signingConfigs {
        release {

        }
    }

}

Ответ 9

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

Ответ 10

В новой версии Android Studio существует очень простой способ работы с графическим интерфейсом, который также заполняет файл Gradle.

  • File -> Project Structure

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

  • Signing вкладка → Плюс изображение для добавления новой конфигурации

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

  • Файл ОК и Gradle автоматически создается

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

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

enter image description here

enter image description here

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

(EDIT 12/15)

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

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

Ответ 11

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

./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

Ответ 12

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

Ответ 13

Вы также можете использовать опцию командной строки -P gradle, чтобы помочь подписать. В вашем build.gradle добавьте singingConfigs, как это:

signingConfigs {
   release {
       storeFile file("path/to/your/keystore")
       storePassword RELEASE_STORE_PASSWORD
       keyAlias "your.key.alias"
       keyPassword RELEASE_KEY_PASSWORD
   }
}

Затем вызовите gradle следующим образом:

gradle -PRELEASE_KEYSTORE_PASSWORD=******* -PRELEASE_KEY_PASSWORD=****** build

Вы можете использовать -P для установки storeFile и keyAlias, если хотите.

Это в основном решение Destil, но с параметрами командной строки.

Подробнее о свойствах gradle см. в gradle руководстве пользователя.

Ответ 14

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

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

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 в signing.gradle и замените фиктивные значения на допустимые учетные данные.

// signing.gradle
ext.signing = [
        storeFilePath : 'real/keystore',
        storePassword : 'real keystore password',
        keyAlias : 'real key alias',
        keyPassword : 'real key password',
]

Конечно, signing.gradle следует игнорировать VCS.

Ответ 15

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

Я предлагаю простое решение, которое использует Python Keyring module (в основном консоль сопутствующих сообщений script 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 вам нужно установить пароли в своей цепочке, только один раз:

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

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

Ответ 16

Расширение ответа Дэвида Вавра, создайте файл ~/.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
      }
    }
  }

Ответ 17

Мне было очень весело выяснить это. Вот мой проход.

Краткое руководство по созданию файла сборки gradle в IntelliJ (v.13.1.4). В этом пошаговом руководстве предполагается, что вы знаете, как создать файл хранилища ключей. Чтобы этот учебник работал, вам потребуется, чтобы файл хранилища ключей находился в папке вашего приложения, а файл 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 {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

Вы можете собрать часть этого файла сборки (см. Выше) из пункта меню: Структура файла/проекта. Здесь выберите Facets и нажмите "Android-Gradle (приложение)". Отсюда вы увидите вкладки: "Свойства", "Подписание", "Ароматы", "Типы сборки" и "Зависимости", для этого пошагового руководства мы просто будем использовать "Подписывание" и "Типы сборки". В разделе "Типы сборки" (в разделе "Имя") введите любое имя, которое вы хотите идентифицировать для своей конфигурации типа сборки, и в других 4 полях введите информацию о вашем хранилище ключей (задав путь к хранилищу ключей, который находится в папке вашего приложения).

В поле "Типы сборки" введите значение "assemblyRelease" в поле имени, для "Debuggable" должно быть установлено значение "ложь", для "Jni Debug Build" должно быть значение "ложь", для параметра "Запустить Proguard" - значение "истина", а для "Zip Align" - значение "истина". Это сгенерирует файл сборки, но не так, как показано выше, вам придется добавить несколько вещей в файл сборки позже. Расположение файла ProGuard здесь будет установлено вручную в файле сборки Gradle. (как показано выше)

Контейнеры DSL, которые вы должны будете добавить после этого:

android {
    ....
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    ....
}

Вы также должны будете добавить:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-v4:20.0.0'
    implementation 'com.android.support:appcompat-v7:20.0.0'
}

обратите внимание, что указанный выше контейнер 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 (вверху):

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

размещение этого в вашем 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 должен выглядеть так:

package com.WarwickWestonWright.developers4u.app.CandidateArea;

import android.annotation.SuppressLint;
... other imports

@SuppressLint("IDOfYourLintProblem")
public class SearchForJobsFragment extends Fragment {... rest of your class definition}

Обратите внимание, что подавление ошибок ворса не всегда является лучшей ИДЕЕЙ, вам может быть лучше изменить код, вызвавший ошибки ворса.

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

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

Если все прошло успешно, вы сможете перейти в папку app\build\apk и найти развертываемый APK файл.

Ответ 18

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

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

Ответ 19

Android Studio Перейдите в Файл → Структура проекта или нажмите Ctrl + Alt + Shift + S

См. изображение

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

Нажмите Ok

Тогда подписьConfigs будет сгенерирована в файле build.gradle.

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

Ответ 20

У меня было несколько проблем, которые я поставил в следующей строке:

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

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

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

вместо

android
{
    ....
}

signingConfigs {
   release {
        ...
   }
}

Легко сделать эту ошибку.

Ответ 21

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

Ответ 22

Я работаю в Ubuntu14.04. vim ~/.bashrc и добавить export ANDROID_KEYSTORE = экспорт 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 "Run" button
    signingConfigs {
        release {

        }
    }

}

Ответ 23

Альтернативой является определение задачи, которая выполняется только при создании релизов.

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

Ответ 24

Вы можете запросить пароли из командной строки:

...

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
  }

  ...
}

...

Блок if-then-else предотвращает запросы на пароли при создании выпуска. Хотя ветвь else недоступна, она выполняет Gradle при создании задачи install...Release.

Предыстория. Как отмечено fooobar.com/questions/16659/..., сценарии Gradle могут запрашивать ввод пользователя с помощью метода System.console(). ReadLine. "К сожалению, Gradle всегда будет запрашивать пароль, даже когда вы создаете отладочную версию (cf. Как создать файл подписанного apk с версией Gradle?.). К счастью, это можно преодолеть, как я показал выше.

Ответ 25

если вы не хотите видеть Невозможно вызвать метод readLine() для нулевого объекта. вам нужно сначала написать gradle.properties.

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

Ответ 26

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

Вы можете создать новое хранилище ключей, нажав "Создать/сгенерировать подписанный APK/Создать новый...