J'essaie donc de convertir graduellement tous mes scripts de compilation ant et je suis parvenu à trouver de nombreuses ressources et documentation sur tout cela, à l'exception de la configuration de la signature dans le fichier gradle.properties.
ant.properties fait comme ça:
key.alias=alias
key.store.password=password
key.store=keystore.file
key.alias.password=password
Mais comment puis-je faire la même chose en grade?
Dans votre fichier gradle.properties file stockez les mêmes valeurs que dans le fichier ant.properties , je pense que vous devrez utiliser des noms plus simples, comme keyAlias
, par exemple. Il suffit de supprimer les points pour être sûr.
ensuite, dans votre fichier build.gradle , faites quelque chose comme ceci:
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
// ...
En procédant ainsi, vous avez la possibilité de créer sur un ordinateur doté du fichier gradle.properties ou non. La propriété "keyalias" n'est lue que si elle existe, donc le code avec n'échoue pas s'il n'est pas là.
Si toutes les propriétés sont présentes, signingConfigs.release
sera entièrement configuré et sera utilisé pour signer l'apk lors de la construction. Si ce n'est pas là, l'APK sera construit mais non signé.
J'ai pu le faire avec ce qui suit. J'ai essayé la solution de @ Xav, mais elle se plaindrait lors de l'étape de validation de la version, si les propriétés n'étaient pas définies. Je suis sûr qu'il s'agit d'un changement récent en raison de la modification importante du cadre. Je voulais simplement vous aider en soulignant qu'avec la variable else
à la fin, j'ai été en mesure de forcer la publication de signatureConfig à null. Désormais, les versions signées et non signées dépendent de la présence de 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
}
Quelques autres notes utiles, vous pouvez mettre le fichier gradle.properties dans ~/.gradle/si vous ne le souhaitez pas dans le dossier du projet. Vous pouvez également définir la propriété storeFile
avec un chemin absolu comme celui-ci: storePath=file:///Users/nick/Dropbox/mycompany.keystore
Inspiré par la solution d'Eugens, j'ai proposé un écart un peu plus court. Le code doit être dans la configuration de la tâche 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
}
Gradle 1.9 ne vous permet pas de définir des propriétés. Vous pouvez les ajouter uniquement à ext maintenant. Petit ajout aux réponses précédentes:
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
}
Il existe un bon guide à ce sujet - https://github.com/almalkawi/Android-Guide/wiki/Generating-signed-release-APK-using-Gradle
Mes exigences étaient que toute personne sans le magasin de clés devrait pouvoir construire correctement. C'est le moyen le plus propre que j'ai pu trouver:
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'))
}