Подтвердить что ты не робот

Выпуск подписи в gradle.properties для Android

Итак, я пытаюсь преобразовать все мои скрипты сборки ant в gradle, и я смог найти достаточные ресурсы и документацию по всему, кроме как настроить подпись в gradle. файл свойств.

ant.properties делает это так:

key.alias=alias
key.store.password=password
key.store=keystore.file
key.alias.password=password

Но как мне сделать то же самое в gradle?

4b9b3361

Ответ 1

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

то в файле build.gradle сделайте что-то вроде этого:

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

if (project.hasProperty('keyAlias')) {
    android.signingConfigs.release.keyAlias = keyAlias
}
// do the same for the three other properties
// ...

Выполнение этого способа дает вам гибкость для создания на компьютере с файлом gradle.properties или нет. Свойство "keyalias" считывается только в том случае, если оно существует, поэтому код не прерывается, если он не существует.

Если все свойства существуют, signingConfigs.release будет полностью настроен и будет использоваться для подписи apk во время сборки. Если этого не произойдет, APK будет построен, но не подписан.

Ответ 2

Я смог сделать это со следующим. Я попробовал решение @Xav, но он будет жаловаться во время шага проверки выпуска, если у меня не было установленных свойств. Я уверен, что это недавнее изменение из-за изменения структуры. Я просто хотел помочь, указав, что с else в самом конце я смог заставить release signedConfig равным нулю. Теперь как подписанные, так и неподписанные релизы происходят в зависимости от наличия gradle.properties.

signingConfigs {
    release {
        keyAlias = "blue_sleep"
    }
}

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

if (project.hasProperty('storeFile') &&
        project.hasProperty('storePassword') &&
        project.hasProperty('keyPassword')) {
    android.signingConfigs.release.storeFile = file(storeFile)
    android.signingConfigs.release.storePassword = storePassword
    android.signingConfigs.release.keyPassword = keyPassword
} else {
    android.buildTypes.release.signingConfig = null
}

Некоторые другие полезные заметки, вы можете поместить gradle.properties в ~/.gradle/, если вы не хотите, чтобы он сидел в папке проекта. Также вы можете установить свойство storeFile с абсолютным путем следующим образом: storePath=file:///Users/nick/Dropbox/mycompany.keystore

Ответ 3

Вдохновленный решением Eugens, я придумал немного более короткую дисперсию. Код должен находиться в конфигурации задачи android {}.

File signFile = rootProject.file('sign.properties')
if (signFile.exists()) {
    Properties p = new Properties()
    p.load(new FileInputStream(signFile))
    signingConfigs {
        releaseConfig {
            storeFile file(p.storeFile)
            storePassword p.storePassword
            keyAlias p.keyAlias
            keyPassword p.keyPassword
        }
    }
    buildTypes.release.signingConfig signingConfigs.releaseConfig
}

Ответ 4

Gradle 1.9 не позволяет вам определять свойства. Вы можете добавить их только в ext сейчас. Небольшое дополнение к предыдущим ответам:

signingConfigs {
    debug {
        project.ext.loadSign = false
    }
    release {
        project.ext.loadSign = true
    }
}

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

if ( project.ext.loadSign ) {
    Properties p = new Properties ()
    p.load ( new FileInputStream ( rootProject.file ( 'keys/sign.properties' ) ) )

    android.signingConfigs.release.storeFile file ( p.file )
    android.signingConfigs.release.storePassword p.password
    android.signingConfigs.release.keyAlias p.alias
    android.signingConfigs.release.keyPassword p.keyPassword
}

Ответ 6

Мои требования заключались в том, что любой, кто не имеет хранилища ключей, должен иметь возможность правильно строить. Это самый чистый способ, который я мог найти:

android {
    signingConfigs {
        release    //Filled in readSigningConfigIfAvailable()
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-xyz.txt'
            readSigningConfigIfAvailable()
        }
    }
}

private void readSigningConfigIfAvailable() {
    if (hasAllSigningProperties()) {
        android.signingConfigs.release.storeFile = file(keystore_path)
        android.signingConfigs.release.storePassword = keystore_password
        android.signingConfigs.release.keyAlias = key_alias
        android.signingConfigs.release.keyPassword = key_password
        android.buildTypes.release.signingConfig = android.signingConfigs.release
    } else {
        android.buildTypes.release.signingConfig = null
    }
}

private boolean hasAllSigningProperties() {
    (hasProperty('keystore_path')
    && hasProperty('keystore_password')
    && hasProperty('key_alias')
    && hasProperty('key_password'))
}