619 votes

Comment créer un communiqué signé fichier apk en utilisant Gradle?

Je voudrais avoir mon build Gradle pour créer un communiqué signé fichier apk à l'aide de Gradle.

Je ne sais pas si le code est correct ou si il me manque un paramètre au moment de gradle build?

C'est une partie du code dans mon gradle fichier:

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

Le gradle construire des finitions de SUCCÈS, et dans mon build/apk le dossier, je ne vois que l' ...-release-unsigned.apk et ...-debug-unaligned.apk fichiers.

Toutes les suggestions sur comment résoudre ce problème?

581voto

Destil Points 3673

Moyen plus facile que les précédentes réponses:

Mettre cela en ~/.gradle/gradle.properties

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

Modifier votre build.gradle comme ceci:

...    
signingConfigs {

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

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

Ensuite, vous pouvez exécuter gradle assembleRelease

289voto

arcone Points 3276

J'ai réussi à résoudre l'ajout de ce code, et construire avec l' gradle build:

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

Cela génère un communiqué signé fichier apk.

175voto

sdqali Points 1304

C'est une réponse à user672009:

Gradle scripts peuvent invite de saisie de l'utilisateur à l'aide de l' System.console().readLineméthode. Le code ci-dessus réécrit pour utiliser ce seront les suivantes:

...
signingConfigs {
    release {
        storeFile file(System.console().readLine("\n\$ Enter keystore path: "))
        storePassword System.console().readPassword("\n\$ Enter keystore password: ")
        keyAlias System.console().readLine("\n\$ Enter key alias: ")
        keyPassword System.console().readPassword("\n\$ Enter key password: ")
    }
}

Cette invite pour chacun des paramètres.

Cela dit, dans ces situations, vous êtes mieux de définition des variables d'environnement pour ces paramètres et de les utiliser dans le gradle fichier. Les variables d'environnement peuvent être accessibles avec System.getenv("<VAR-NAME>")

... 
signingConfigs {
    release {
        storeFile file(System.getenv("KEYSTORE"))
        storePassword System.getenv("KEYSTORE_PASSWORD")
        keyAlias System.getenv("KEY_ALIAS")
        keyPassword System.getenv("KEY_PASSWORD")
    }
}

Cheers

74voto

caspase Points 912

Notez que @sdqali du script (au moins lors de l'utilisation de Gradle 1.6) demander le mot de passe à tout moment, vous appelez tout gradle tâche. Puisque vous n'aurez besoin lorsque vous effectuez gradle assembleRelease (ou similaire), vous pouvez utiliser l'astuce suivante:

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"
    }
}

Notez que j'ai aussi dû ajouter le suivant (sous android) pour le faire fonctionner:

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

69voto

Igor Ganapolsky Points 2851

Si vous voulez éviter de coder en dur le fichier de clés et mot de passe à construire.gradle, vous pouvez utiliser un fichier de propriétés, comme expliqué ici: la MANIPULATION de la SIGNATURE de CONFIGS AVEC GRADLE

En gros:

1) créer un myproject.les propriétés de fichier dans /home/[nom d'utilisateur]/.la signature avec ce contenu:

keystore=[path to]\release.keystore
keystore.password=*********
keyAlias=***********
keyPassword=********

2) créer un gradle.fichier de propriétés (peut-être à la racine de votre répertoire de projet) avec le contenu:

MyProject.properties=/home/[username]/.signing/myproject.properties

3) indiquez dans votre build.gradle comme ceci:

    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']
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X