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 "******"
}
}
}
La gradle construire des finitions de SUCCÈS, et dans mon build/apk
dossier je ne vois que le ...-release-unsigned.apk
et ...-debug-unaligned.apk
fichiers.
Des suggestions sur la façon de résoudre ce problème?
- developer.android.com/studio/publish/...
- signe de la v1 (pot de signature) ou v2 (full apk signature) version de gradle fichier? la solution ici: " stackoverflow.com/questions/57943259/...
Vous devez vous connecter pour publier un commentaire.
Simple que les précédentes réponses:
Mettre en
~/.gradle/gradle.properties
Modifier votre
build.gradle
comme ceci:Ensuite, vous pouvez exécuter
gradle assembleRelease
new File(path)
si vous voulez qu'elle soit considérée comme absolue..gradle
répertoire? Ne serait-ce pas appliquer ces paramètres à tous de votre Android les projets au lieu d'un projet en particulier? Qu'advient-il si vous avez deux ou plusieurs projets avec deux ou plusieurs fichiers de clés?build.gradle
lignes ont montré ici sont à mettre à l'intérieur de laandroid{}
partie, pas sur le niveau supérieur.J'ai réussi à résoudre l'ajout de ce code, et construire avec
gradle build
:Cela génère un communiqué signé fichier apk.
gradle build
ougradlew build
dans le Terminal/Invite de commandeRemarque que @sdqali du script (au moins lors de l'utilisation de Gradle 1.6) demander le mot de passe
quand vous appelez tout gradle tâche. Puisque vous avez seulement besoin pour faire
gradle assembleRelease
(ou similaire), vous pouvez utiliser l'astuce suivante:Noter que j'ai aussi dû ajouter le suivant (sous android) pour le faire fonctionner:
installRelease
disparu de la liste des tâches... Pourquoi?KEYSTORE
doit être défini, même pour les versions de débogage et pour "gradle sync" à l'intérieur d'Android Studio, sinon ça va donner une erreur sur le chemin d'être nulle.System.console()
n'est pas disponible, essayez quelque chose comme:def storePw = new Scanner(Runtime.getRuntime().exec("/usr/libexec/openssh/ssh-askpass Keystore Password").getInputStream()).useDelimiter("\\n").next()
def storePw = new Scanner(System.in).nextLine()
mais l'inconvénient est que le mot de passe est visible à l'écran.android.signingConfigs.release
valeurs. Si cette solution échoue, vous pouvez essayer de rester avec Gradle 4 jusqu'à ce qu'une solution soit trouvée.Si vous voulez éviter de coder en dur le fichier de clés & mot de passe dans 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.fichier de propriétés à /home/[nom d'utilisateur]/.signature avec ce contenu:
2) créer un gradle.fichier de propriétés (peut-être à la racine de votre répertoire de projet) avec le contenu:
3) voir dans votre construire.gradle comme ceci:
Comme @Destil dit, mais permettre à d'autres personnes qui n'ont pas les clés pour construire:
Moyen plus facile que les précédentes réponses:
Mettre en
~/.gradle/gradle.properties
Modifier votre
build.gradle
comme ceci:Ensuite, vous pouvez exécuter
gradle assembleRelease
OU
gradle build
Automatique de l'application de la signature avec Gradle lors de l'utilisation de git
Il est incroyable de voir comment beaucoup de alambiqué manières, il y a pour ce faire. Voici mon propre chemin, où j'essaie de respecter Googles propre recommandation. Cependant, leur explication n'est pas entièrement clair, donc je vais décrire la procédure pour Linux en détail.
Description:
La valeur par défaut Google instructions automatiquement la signature d'un app
lors de la compilation, sans garder les mots de passe et les fichiers de signatures
dans le développement de votre application (GIT) chemin, c'est plutôt obscure. Voici les
précisé étape par étape les instructions sur la façon de le faire.
Hypothèses initiales:
Vous avez une application appelée "MyApp" dans un répertoire donné par le chemin d'accès suivant:
$HOME/projects/mydev/MyApp
. Cependant, le répertoire MyApp est utilisé etcontrôlé avec GIT.
Problème
De toute évidence, nous ne voulons pas notre signature ou le mot de passe des fichiers de n'importe où dans
le GIT contrôlé répertoire, même si nous sommes très en mesure d'utiliser
.gitignore
etc, il est encore trop risqué et facile de faire une erreur. Si nous voulons que notre fichier de stockage des clés et la signature des fichiers à l'extérieur.Solution
Nous avons besoin de trois (3) choses:
build.gradle
fichier à utiliser (1) et (2).Pour cet exemple, le nom de deux fichiers:
keystore.properties
MyApp-release-key.jks
Nous pouvons mettre ces deux fichiers ici:
(1) Créer le fichier de mot de passe du fichier de clés
Le premier fichier contient le texte en clair des mots de passe; et les chemins de la libération-le fichier de clés dans (2). Commencer à le remplir, car elle permettra de faire un copier coller l'opération plus facile pour la prochaine étape.
Modifier
keystore.properties
de sorte que son contenu est:La seule partie délicate ici, est le
myStoreFileLocation
. C'est le chemin vu de le modulebuild.gradle
fichier lors de la compilation. Cela signifie généralement un chemin similaire par rapport à d':$HOME/projects/mydev/MyApp/app/build.gradle
. Donc pour leMyApp-release-key.jks
fichier, ce que nous devons faire ici est:
../../../MyApp-release-key.jks
Ici, nous avons aussi choisi le "myapp" alias pour la clé. Ensuite, le fichier final devrait ressembler à:
(2) Créer le fichier de signature
Le deuxième fichier est généré automatiquement lorsque vous créez la clé de signature.
Si vous n'avez pas d'autres apps et c'est votre seul fichier de clés, puis créer le fichier avec:
Il vous demandera de deux mots de passe et un tas d'info. (Même chose que dans Android Studio.) Copier/coller votre déjà choisi les mots de passe.
(3) Modifiez votre module
gradle.build
fichier à utiliser le ci-dessusLes éléments suivants doivent être présents dans votre application/module du fichier de build Gradle. Tout d'abord, ajoutez les lignes suivantes à l'extérieur et avant votre
android {}
bloc.Puis, à l'intérieur de la
android {}
bloc, ajouter:Maintenant à partir de la coquille, vous pouvez re-construire votre application avec:
Cela devrait générer un bien signé application qui peut être utilisé dans le Jeu de Google.
Mise à JOUR: 2019-04-02
Les versions plus récentes de
keytool
et quelque chose est vous dire que vous devriez utiliser un PKCS12 en fonction clé au lieu de l'original/par défaut que j'utilise ci-dessus. Ils puis aller sur de vous dire que vous devez les convertir au nouveau format PKCS12. Cependant, il semble que l'Android outils de développement ne sont pas tout à fait prêt pour cela encore, car si vous le faites, vous recevrez des erreurs étranges:Donc ne l'utilisez pas un converti à la clé!
keystore.properties
fichier de contrôle de code source, de sorte que s'appuie le travail sur les machines de dev. J'ai décrit une accumulation de configuration du serveur d' ici.(En réponse à user672009 ci-dessus).
Une même solution plus facile, si vous souhaitez conserver vos mots de passe d'un dépôt git; encore, vous voulez inclure votre build.gradle en elle, que même fonctionne très bien avec les produits de saveurs, c'est de créer un gradle fichier. Appelons ça de la signature.gradle' (de l'inclure dans votre .gitignore). Comme si c'était votre build.gradle fichier moins tout n'est pas liée à la signature en elle.
Ensuite dans votre construction.gradle fichier inclure cette ligne juste en dessous de la "appliquer le plugin: 'android'"
Si vous n'avez pas ou l'utilisation de multiples saveurs, renommer "flavor1" à "libération" ci-dessus, et vous devriez être fini. Si vous utilisez des saveurs de continuer.
Enfin le lien de votre saveurs à sa signingConfig dans votre construction.gradle fichier et vous devriez être fini.
C'est une réponse à user672009 et plus sdqali post (son code crash sur le renforcement de la version de débogage de l'IDE du bouton "Exécuter"):
Vous pouvez utiliser le code suivant:
keyPassword new String(console.readPassword("Enter key password: "))
pour vous assurer que votre mot de passe n'est pas affiché lors de la saisieSi vous construisez apk via la ligne de commande comme moi, alors vous pouvez fournir de signature de configuration en tant qu'arguments.
Ajouter à votre
build.gradle
Faire de votre
signingConfigs
comme cePuis vous exécutez
gradlew
comme cebuild.gradle
? Haut niveau? S'il vous plaît ajouter plus de codeapp/build.gradle
fichier dont je parle.Si vous avez le fichier de magasin de clés déjà, il peut être aussi simple que l'ajout d'un peu de paramètres pour que votre commande de construction:
Pas de changements permanents à votre projet Android nécessaires.
Source: http://www.tinmith.net/wayne/blog/2014/08/gradle-sign-command-line.htm
Dans les nouvelles versions d'Android Studio, il y a une interface graphique manière qui est très facile et il remplit Gradle fichier.
File -> Project Structure
Module ->
Choisir le module principal ('app' ou autres nom personnalisé)Signing
tab -> Plus d'une image à ajouter nouvelle configurationRemplissage des données sur le côté droit
OK et Gradle fichier est automatiquement créé
Vous manuellement ajouter une ligne
signingConfig signingConfigs.NameOfYourConfig
à l'intérieur debuiltTypes{release{}}
Images:
Deux(!) notes:
(MODIFIER 12/15)
Pour créer signé APK, vous devez ouvrir l'onglet Terminal Android Studio (le bas de l'interface principale), et une commande
./gradlew assembleRelease
Si vous avez oublié
keyAlias
(ce qui arrive souvent à moi), vous aurez à lancerBuild -> Generate Signed APK
pour démarrer le processus et voir le nom de l'Alias de clé.build.gradle
fichier, cependant, n'est-ce pas?Vous pouvez également utiliser -P option de ligne de commande de gradle pour aider à la signature. Dans votre construction.gradle, ajouter singingConfigs comme ceci:
Alors appel gradle accumulation de ce genre:
Vous pouvez utiliser -P type storefile et keyAlias si vous préférez.
C'est fondamentalement Destil de la solution, mais avec les options de ligne de commande.
Pour plus de détails sur gradle propriétés, cochez la gradle guide de l'utilisateur.
@Destil la réponse est bonne si vous pouvez réutiliser la même configuration sur tous les projets. Sinon, Android Studio est livré avec un
local.properties
fichier qui peut peut-être être utilisé à la place, mais il est soi-disant en IDE et je ne peux pas trouver un moyen de l'étendre à partir de dans Android Studio.C'est une variante de @jonbo réponse. Cette réponse permet paramètres spécifiques d'un projet, mais il est livré avec un peu de développeur de frais généraux. Plus précisément, d'importants standard est nécessaire pour déplacer le
signingConfigs
définition dans un fichier séparé -- surtout si vous avez besoin de le faire pour de multiples projets, qui est l'une des principales raisons pour choisir cette solution sur Destil de l'. Cela peut être quelque peu atténué par aussi y compris la lignedans les informations d'identification de fichier, car cela permettra l'IDE d'achèvement.
Enfin, la plupart des solutions ne pas permettre de construire le projet en mode debug -- qui gère debug-signature automatiquement-sans fournir un point de vue syntaxique si pas sémantiquement valide
signingConfigs
définition. Si vous n'avez pas besoin de produire un communiqué de construire à partir d'une machine donnée, cette étape supplémentaire peut être vu comme un obstacle inutile. D'autre part, il peut être une aide contre les ignorants ou paresseux collègues de course les versions de débogage de la production.Cette solution permettra de débogage sans se soucier des informations d'identification à tous, mais cela nécessite des informations d'identification valides pour produire les versions release, et il prend très peu de passe-partout. Cependant, comme un inconvénient il pourrait encourager les autres à remplacer les valeurs factices avec de vrais pouvoirs et il n'y a aucun moyen de se protéger contre cela.
Cela crée un mannequin de la propriété qui sert uniquement à produire un syntaxiquement valide du fichier build. Les valeurs affectées à
ext.signing
's propriétés sont sans incidence sur les versions de débogage aller. Pour activer les versions release, copieext.signing
ensigning.gradle
et remplacer les valeurs factices avec des informations d'identification valides.Bien sûr,
signing.gradle
doit être ignoré par VCS.Presque toutes les plates-formes offrent une sorte de porte-clés, donc il n'y a aucune raison de laisser de texte en clair des mots de passe partout.
Je propose une solution simple qui utilise le Python module porte-clés (principalement le compagnon de la console de script
keyring
) et un minimum de wrapper autour de Groovy['do', 'something'].execute()
fonctionnalité:À l'aide de cette fonction, le
signingConfigs
l'article devient:Avant d'exécuter
gradle assembleRelease
vous devez définir les mots de passe de votre trousseau de clés, une seule fois:Heureux versions!
L'extension de la réponse de David Vavra,créer un fichier ~/.gradle/gradle.propriétés et ajouter
Puis dans la construction.gradle
Android Studio
Aller à Fichier -> Structure de Projet ou appuyez sur Ctrl+Alt+Maj+S
Voir L'Image
Cliquez Sur Ok
Puis le signingConfigs va générer sur votre construction.gradle fichier.
J'ai eu beaucoup de plaisir en pensant ça. Ici est ma maison.
De A à Z de plain-pied sur la façon de créer un fichier de build gradle dans IntelliJ (v. 13.1.4)
Cette promenade-à travers suppose que vous savez comment faire un fichier de magasin de clés.
Pour ce tutoriel fonctionne, vous aurez besoin de votre fichier de magasin de clés pour être situé dans votre dossier app et vous aurez besoin d'avoir votre zipalign.exe fichier situé dans le 'SDK-ROOT\outils". Ce fichier se trouve généralement dans 'SDK-ROOT\build-outils" et dans ce dossier, il sera dans le plus haut dossier api (alpha ou bêta, je recommande la version alpha).
Pour ceux d'entre vous qui souhaitent passer directement ici, c'est le fichier de build gradle.
Vous pouvez construire une partie de ce fichier de build (ci-dessus) à partir de l'option de menu: Fichier/Projet de la Structure
De là, sélectionnez Facettes et cliquez sur 'Android-Gradle(App).
De là, vous allez voir les onglets: 'Propriétés', 'Signature', 'Saveurs', 'Build Types" et "Dépendances" pour cette visite, nous allons juste utiliser "Signature" et "Construire des Types".
En vertu de la "construction Types" (dans la section nom) entrez le nom que vous souhaitez identifier votre type de build de configuration et dans les 4 autres champs d'entrer dans votre magasin de certificats de l'information (paramètre au fichier chemin d'accès de la première au titre de votre dossier app).
En vertu de la "Construction de Types' entrez la valeur 'assembleRelease" dans le champ nom, 'Debuggable' doit être défini sur false, 'Jni Debug' doit être fausse, choisissez 'Exécuter Proguard' true 'Zip Aligner' à true. Cela va générer fichier build, mais pas comme décrit ci-dessus, vous devrez ajouter un peu de choses à la construction de la page par la suite. Le ProGuard emplacement du fichier ici sera mis manuellement dans le fichier de build gradle. (comme illustré ci-dessus)
La liste intérieure des récipients, vous aurez à ajouter par la suite sont comme suit:
Vous devrez aussi ajouter:
note ce DSL conteneur au-dessus de('dépendances') doivent être à la base du fichier de configuration, mais pas à l'intérieur de l'android DSL conteneur.
Afin de construire les dépendances contenant de l'Ide, de menus, sélectionnez: Fichier/Projet de la Structure. À partir de là, sélectionnez les Facettes de nouveau et puis Android-Gradle(app). Vous verrez les mêmes 5 onglets comme mentionné ci-dessus. Sélectionnez les "Dépendances" de l'onglet et ajouter les dépendances dont vous avez besoin.
Après tout cela est fait, vous devriez voir un fichier de build Gradle similaire au fichier en haut de cette tour.
Pour construire votre signée zip alignés de presse que vous aurez besoin d'ouvrir le Gradle tâches. Vous pouvez accéder à cette fenêtre en sélectionnant Afficher/Outil Windows/Gradle.
De là, vous pouvez double-Cliquez sur 'assembleAssembleRelease. Cela devrait générer votre déployable APK.
Les problèmes potentiels qui peuvent se produire lors de la compilation de votre communiqué de presse (mais pas limité à): Votre fichier de build Gradle en étant au mauvais endroit. Il y a deux fichiers de build Gradle; - le dans votre dossier racine d'une application et un autre dans le dossier app en vertu de la racine de l'application. Vous devez utilisateur de ce dernier.
Vous pouvez également avoir des peluches problèmes. (Note: Développeur Android Studio est beaucoup mieux percevoir les Peluches de problèmes que IntelliJ vous pouvez le constater lorsque vous essayez de générer un signé APK à partir du menu options)
Pour obtenir autour de la charpie de problèmes, vous aurez besoin de mettre la suite DSL conteneur à l'intérieur de l'android conteneur (en haut):
de mettre cela à l'intérieur de votre android DSL conteneur va provoquer une erreur de fichier doit être généré dans le dossier de création (directement dans votre dossier app) le nom de fichier doit être quelque chose comme " lint-results-release-fatal.html ce dossier va vous dire la classe où l'erreur s'est produite. Un autre fichier qui sera généré est un fichier XML qui contient les " ID " qui est associée avec la fibre d'erreur. Le nom de fichier doit être quelque chose comme "lint-results-release-fatal.xml'. Quelque part près de la partie supérieure du fichier, vous verrez un nœud 'problème' à l'intérieur de laquelle vous verrez quelque chose de similaire à la " id="IDOfYourLintProblem"'
Pour corriger ce problème, ouvrez le fichier dans votre projet a été répertoriée dans le "lint-results-assembleRelease-fatal.html' fichier et entrez la ligne de code suivante dans le fichier de Classe Java juste au-dessus du nom de la classe: @SuppressLint("IDOfYourLintProblem"). Vous pourriez avoir à importer 'android.annotation.SuppressLint;'
De sorte que votre fichier de classe java doit ressembler à:
Noter que la suppression de la charpie des erreurs n'est pas toujours la meilleure IDÉE que vous avez peut-être préférable de changer votre code à l'origine de la charpie erreurs.
Un autre problème qui pourrait éventuellement se produire est si vous n'avez pas défini la variable d'environnement pour le Gradle la variable d'environnement HOME. Cette variable est appelée "GRADLE_HOME" et devrait être le chemin de la gradle répertoire de base, comme quelque chose de "C:\gradle-1.12'
Parfois, vous pouvez également définir la variable d'environnement pour les "ANDROID_HOME' ensemble de ce 'VOTRE-SDK-Root\sdk"
Après ceci est fait retour à la Gradle tâches de la fenêtre et double-cliquez sur le assembleAssembleRelease.
Si tout est réussi, vous devriez être en mesure d'aller dans le dossier app\build\apk et de trouver votre déployable fichier APK.
Encore une autre approche pour le même problème. Comme il n'est pas recommandé de stocker tout type d'informations d'identification dans le code source, nous avons décidé de mettre les mots de passe du magasin de clés et clés alias dans un autre fichier de propriétés comme suit:
Si vous utilisez git, vous pouvez créer un fichier texte appelé, par exemple, en sécurité.les propriétés. Assurez-vous de vous exclure de votre dépôt (si vous utilisez git, ajoutant à l' .gitignore fichier). Ensuite, vous devez créer une signature de configuration, comme certains des autres réponses indiquent. La seule différence est dans la façon dont vous serait de charger les informations d'identification:
Ne jamais oublier de donner la signingConfig de la publication type de build manuellement (pour une raison que j'parfois supposer qu'il sera utilisé automatiquement). Aussi, il n'est pas obligatoire pour permettre proguard, mais il est recommandé.
Nous aimons cette approche mieux que d'utiliser des variables d'environnement ou de demander la saisie de l'utilisateur, car il peut être fait à partir de l'IDE, par la commutation de la sortie type de construction et l'exécution de l'application, plutôt que d'avoir à utiliser la ligne de commande.
J'ai eu plusieurs problèmes que j'ai mis la ligne suivante dans un mauvais endroit:
Assurez-vous que vous placez le signingConfigs pièces à l'intérieur de la section android:
au lieu de
Il est facile de faire cette erreur.
À compléter les autres réponses, vous pouvez également placer votre gradle.les propriétés de fichier dans votre dossier du module, avec de construire.gradle, juste au cas où votre fichier est spécifique à un projet.
je suis travailler dans Ubuntu14.04.
vim ~/.bashrc et ajouter
l'exportation ANDROID_KEYSTORE=
l'exportation ANDROID_KEYALIAS=
puis dans la construction.gradle ensemble.
System.console()
retournenull
.Une alternative consiste à définir une tâche qui s'exécute uniquement sur les versions release.
Vous pouvez demander des mots de passe à partir de la ligne de commande:
La
if-then-else
bloc empêche les demandes de mots de passe lorsque vous êtes en train de construire un communiqué. Bien que laelse
branche est inaccessible, il astuces Gradle dans la création d'uninstall...Release
tâche.Trame de fond. Comme l'a noté https://stackoverflow.com/a/19130098/3664487, "Gradle scripts peuvent invite de saisie de l'utilisateur d'utiliser le Système.console().méthode readLine." Malheureusement, Gradle toujours demander un mot de passe, même lorsque vous êtes la construction d'une version de débogage (cf. Comment créer un communiqué signé fichier apk en utilisant Gradle?). Heureusement, cela peut être surmonté, comme je l'ai montré ci-dessus.
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' } }
,compileSdkVersion 23
, oubuildToolsVersion "23.0.2"
.System.console().readLine()
n'apparaît pas.Il est 2019 et j'ai besoin de signer APK avec V1 (pot de signature) ou V2 (full APK signature). J'ai googlé "générer signé apk gradle" et il m'a amené ici. Donc, je suis en ajoutant ma solution originale ici.
Ma question initiale: Comment utiliser V1 (Pot de signature) ou V2 (Full APK signature) à partir de construire.gradle fichier
si vous ne voulez pas voir Ne peut pas invoquer la méthode readLine() sur l'objet null. vous avez besoin d'écrire dans gradle.propriétés premier.
Si vous, comme moi, veulent juste être en mesure d'exécuter le communiqué sur votre appareil à des fins de test, envisager la création d'un deuxième fichier de clés pour la signature, de sorte que vous pouvez suffit de mettre les mots de passe dans votre build.gradle sans vous inquiéter pour votre marché de magasin de clés de sécurité.
Vous pouvez créer un nouveau fichier de clés en cliquant sur Créer/Générer Signé APK/Créer un nouveau...