web-dev-qa-db-fra.com

Libérez la signature dans gradle.properties pour Android

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?

19
Gnathonic

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

33
Xavier Ducrohet

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

22
GrkEngineer

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

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
}
3
Eugen Martynov
2
Stan Sidel

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'))
}
0
Shubham Chaudhary