Как создать 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 453

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.

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/

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.

  1. File -> Project Structure

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

  3. Signing tab - > плюс изображение для добавления новой конфигурации

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

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

  6. вам придется вручную добавить строку signingConfig signingConfigs.NameOfYourConfig внутри builtTypes{release{}}

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

enter image description here

enter image description here

два важных(!) Примечания:

(EDIT 12/15)

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

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

Android Studio Перейти к File - > Структура Проекта или нажмите Ctrl+Alt + Shift+S

Посмотреть Изображение

enter image description here

Нажмите Кнопку ОК

тогда signingConfigs будет генерировать на вашей сборке.файл gradle.

enter image description here

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