Как создать файл apk со знаком релиза с помощью Gradle?

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

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

Это некоторые из кода в моем файле gradle:

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

сборка gradle завершается успешно, и в my build/apk Папка я вижу только ...-release-unsigned.apk и ...-debug-unaligned.apk файлы.

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

26 ответов


более простой способ, чем предыдущие ответы:

этой ~/.gradle/gradle.properties

RELEASE_STORE_FILE={path to your keystore}
RELEASE_STORE_PASSWORD=*****
RELEASE_KEY_ALIAS=*****
RELEASE_KEY_PASSWORD=*****

изменить build.gradle такой:

...    
signingConfigs {

   release {
       storeFile file(RELEASE_STORE_FILE)
       storePassword RELEASE_STORE_PASSWORD
       keyAlias RELEASE_KEY_ALIAS
       keyPassword RELEASE_KEY_PASSWORD
   }
}

buildTypes {
        release {
            signingConfig signingConfigs.release
        }
}
....

затем вы можете запустить gradle assembleRelease


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

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

это создает подписанный файл apk выпуска.


обратите внимание, что скрипт @sdqali будет (по крайней мере, при использовании Gradle 1.6) запрашивать пароль в любое время вы призываете любой задача gradle. Так как вам это нужно только при выполнении gradle assembleRelease (или аналогичный), вы можете использовать следующий трюк:

android {
    ...
    signingConfigs {
        release {
            // We can leave these in environment variables
            storeFile file(System.getenv("KEYSTORE"))
            keyAlias System.getenv("KEY_ALIAS")

            // These two lines make gradle believe that the signingConfigs
            // section is complete. Without them, tasks like installRelease
            // will not be available!
            storePassword "notYourRealPassword"
            keyPassword "notYourRealPassword"
        }
    }
    ...
}

task askForPasswords << {
    // Must create String because System.readPassword() returns char[]
    // (and assigning that below fails silently)
    def storePw = new String(System.console().readPassword("Keystore password: "))
    def keyPw  = new String(System.console().readPassword("Key password: "))

    android.signingConfigs.release.storePassword = storePw
    android.signingConfigs.release.keyPassword = keyPw
}

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.equals("packageRelease")) {
        theTask.dependsOn "askForPasswords"
    }
}

обратите внимание, что мне также пришлось добавить следующее (под android), чтобы заставить его работать:

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

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

по сути:

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

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 включите эту строку прямо под "применить плагин: 'андроид'"

 apply from: 'signing.gradle'

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

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

  ...

  productFlavors {

      flavor1 {
          ...
          signingConfig signingConfigs.flavor1
      }

      flavor2 {
          ...
          signingConfig signingConfigs.flavor2
      }
  }

  ...

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

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


описание:

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

первоначальные предположения:

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

enter image description here

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

решение

нужно сделать три (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 вашего приложения/модуля. Сначала добавьте следующие строки за пределами и до код 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 есть GUI-способ, который очень прост, и он также заполняет файл Gradle.

  1. File -> Project Structure

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

  3. Signing tab - > Plus image для добавления новой конфигурации

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

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

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

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

enter image description here

enter image description here

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

(редактирование 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 для установки файла хранилища и keyAlias, если хотите.

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

для получения более подробной информации о свойствах 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 определение в отдельный файл - особенно если вам нужно сделать это для нескольких проектов, что является основной причиной выбора этого решения над Destil. Это может быть несколько облегчено и в том числе строку

apply plugin: 'com.android.application'

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

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

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

// 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 (в основном консольный скрипт companion 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 до Z пошаговое руководство по созданию файла сборки gradle в IntelliJ (V.13.1.4) Это пошаговое руководство предполагает, что вы знаете, как сделать файл keystore. Для работы этого урока вам понадобится файл хранилища ключей, расположенный в папке приложения, и вам понадобится zipalign.exe-файл, который будет расположен в "SDK-ROOT\tools". Этот файл обычно находится в "SDK-ROOT\build-tools" и в этой папке будет в самой высокой папке api (alpha или beta я рекомендую альфа-версию).

для тех из вас, кто хочет прыгать прямо здесь, это файл сборки 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" в поле Имя, "Debuggable" должно быть установлено значение false, "JNI Debug Build" должно быть false, "Run Proguard" - true и "Zip Align" - true. Это создаст build файл, но не так, как показано выше, вам придется добавить несколько вещей в файл сборки после этого. Расположение файла 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. Это должно генерировать ваш развертываемый APK.

потенциальные проблемы, которые могут возникнуть при компиляции вашего выпуска (но не ограничиваются): ваш файл сборки 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""

чтобы исправить эту проблему откройте файл в своем проекте, который был указан в 'lint-results-assembleRelease-fatal.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 типу сборки выпуска вручную (по какой-то причине я иногда предполагаю, что он будет использоваться автоматически). Кроме того, не обязательно включать proguard, но это рекомендуется.

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


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

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

enter image description here

Нажмите Ok

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

enter image description here


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


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

а затем в build.набор градля.

    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
  }

  ...
}

...

на if-then-else блок предотвращает запросы паролей при создании выпуска. Хотя ... --2--> ветка недоступна, она обманывает 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...