Mémo commandes ADB et keytool pour Android

Si comme moi tu n’as pas de background de développement en Java et que tu as choisi de perdre des années d’espérance de vie en voulant développer des applications mobiles, tu t’es sûrement déjà frotté aux commandes ADB et keytool pour Android.

Je ne vais même pas parler ici des certificats pour iOS parce que… l’article serait juste trop long. Alors voici un court mémo des principales commandes à utiliser pour développer et déployer une application Android.

Les commandes Android Debug Bridge (ADB)

Ces commandes permettent de lancer une application compilée sur un émulateur ou un device connecté en USB. ADB regorge de commandes pour tirer partie des fonctionnalités d’un téléphone. Malheureusement, sa grande instabilité nécessite un mémo de commandes parce que ce foutu téléphone n’est plus détecté alors que ça marchait très bien il y a 5 minutes p#t@!n

Explorer le contenu d’une application installée sur le téléphone

$ adb shell "run-as com.app.dev ls /data/data/com.app.dev/"

Où com.app.dev est le bundleID de votre application. C’est extrêmement pratique lorsqu’il s’agit de débugger des fonctions de stockage sur l’appareil ou afin de comprendre le poids effectif de son application.

Installer un APK directement

$ adb install [-f] apk.apk

Bien plus rapide que de transférer le fichier manuellement, c’est probablement la commande qu’on utilise le plus souvent. L’option -f permet de remplacer une précédente version déjà installée.

Lister les devices connectés

$ adb devices

Permet de vérifier que le device est bien détecté. Il est courant qu’il ne le soit pas lors du premier branchement USB. Cela nécessite généralement de s’y reprendre à deux fois (au mieux !).

Astuce : détecter un device qui ne veut pas apparaître dans la liste

$ adb kill-server && adb start-server && adb devices

Il arrive souvent que ADB fasse de la résistance et ne veuille pas détecter les devices pourtant bien connectés même après plusieurs reconnexions. Cela est plus courant sur Linux et surtout sur Windows que sur OSX, va comprendre.


Les commandes de base keytool

Keytool c’est pas forcément évident, mais à côté des certifs d’Apple c’est EZ PZ.

Keytool, comme son nom l’indique, permet de générer des clés ou autres certificats afin de signer vos applications en mode release. Bien que cela reste infiniment plus simple à gérer sur Android que pour les devices Apple, il est bon de connaître quelques commandes basiques pour l’essentiel des manipulations qu’on peut avoir à faire.
Je n’expliquerai pas en profondeur les options de ces commandes, il y a en a bien trop. Alors, RTFM !

Générer un certificat

$ keytool -genkey -alias alias-du-certif -keyalg RSA -keysize 2048 -validity 10000

On peut spécifier un keystore de destination avec -keystore destination.kesytore

Signer et aligner une application Android

$ jarsigner -sigalg SHA1withRSA -digestalg SHA1 -keystore source.keystore apk.apk alias-certificat -verbose

$ ~/path-to-android-sdk/build-tools/last-version/zipalign 4 apk.apk apk-signed.apk

Où source.keystore est le fichier où se trouve votre certificat, apk.apk est votre APK non signé et apk-signed.apk est votre APK de destination.


Commandes avancées keytool

Déplacer et gérer des certificats peut être un peu tricky lorsqu’on ne connaît pas du fait de la grande quantité d’options des commandes de keytool.
On peut arriver au même résultat de différentes manières.

Exporter un ou plusieurs certificats depuis un keystore vers un autre (ou le créer directement)

keytool -importkeystore -destkeystore destination.keystore [-srcalias alias1 alias2] -srckeystore source.keystore -v

Cette commande est utile pour générer un keystore ne contenant que les clés utiles à un projet (alpha, beta, prod…). C’est une bonne chose d’avoir un seul fichier contenant tous les certificats nécessaires à l’entretien d’un projet au même endroit.

Il faudra spécifier le mot de passe du keystore de destination dans tous les cas, puisque si il n’existe pas, il sera directement créé.

Si tu n’as pas pensé à créer directement un fichier keystore séparé pour votre projet, les certificats que tu utilises déjà se trouveront dans le keystore par défaut de votre machine. C’est à partir de celui-ci que tu devras les importer dans le nouveau. Par défaut, sur système unix, ce fichier est : ~/.keystore, mais j’imagine que cela peut changer selon votre distribution.

Si tu ne souhaites importer qu’une partie des certificats du fichier source, et c’est probablement ce tu veux, il ne faut pas oublier l’option -srcalias suivi des alias des certiicats à importer.

Exporter un certificat depuis un keystore

keytool -export -keystore store.keystore -alias certifAlias -file certificat.cer

Permet d’extraire depuis un keystore un seul certificat avec l’alias certifAliasdans un fichier certificat.cer. Cela permet d’échanger uniquement un certificat plutôt que tout un keystore.

Importer un certificat dans un keystore déjà existant

keytool -import -file certificat.cert -alias certifAlias -keystore destination.keystore -v

Cela s’avère utile pour ajouter un certificat à un keystore déjà créé.

Changer le mot de passe d’un certificat au sein d’un keystore

keytool -keypasswd -alias alias-de-la-cle -keystore source.keystore

Si tu souhaites donner la main à un tiers sur un certificat (comme un client qui voudrait pouvoir compiler lui-même son appli, par exemple), tu peux changer le mot de passe d’un certificat de cette manière.

Vérifier le contenu d’un keystore

keytool -list -keystore source.keystore

Last but not least, si tu veux vérifier les certificats à disposition au sein d’un keystore, voire faire du ménage avec les essais ratés, c’est comme ça qu’il faut faire.