Dies ist eine stark gekürzte Zusammenfassung der englischsprachigen Anleitung zum Signieren von Apps: http://developer.android.com/guide/publishing/app-signing.html.
Teile des Postings beziehen sich speziell auf die Entwicklung mit Eclipse und auf OS X.
Überblick
Alle Apps, die auf einem Android-Gerät installiert werden sollen, müssen signiert sein. Dazu wird ein Zertifikat mit einem privaten Schlüssel (private key) benötigt. Dieses Zertifikat kann mit den Standard-Tools Keytool und Jarsigner selbst erstellt werden. Es dient dazu, den Urheber der App identifizieren zu können. Keytool und Jarsigner sind im JDK (Java Development Kit) enthalten.
Es gibt zwei Arten der Signierung: debug mode und release mode.
Während man die App entwickelt, kann man im debug mode kompilieren. Keytool sorgt dafür, dass die App bei jedem Kompilieren mit dem debug key signiert wird.
Wenn die App fertig ist und veröffentlicht werden soll, muss man im release mode kompilieren und einen private key zum signieren benutzen.
Wenn man mit Eclipse entwickelt und und das ADT (Android Development Tools) Plugin für Eclipse benutzt, kann man mit dem ADT Export Wizard in einem einzigen Schritt die App kompilieren, einen private key generieren und die App damit signieren.
Strategien zum Signieren
Google empfiehlt, für alle Apps dasselbe Zertifikat zu benutzen. Dabei spielt es keine Rolle, ob es sich um gänzlich unterschiedliche Apps oder um Updates bereits existierender Apps handelt. Die Gründe:
- Updates
Bei der Installation eines Updates einer App werden die Zertifikate verglichen. Wenn die Zertifikate übereinstmmen, erlaubt das System die Installation. Wenn die Zertifikate nicht übereinstimmen, muss man das Update mit einem neuen package name versehen. Damit handelt es sich für Android um ein anderes Programm und wird entsprechend nicht als Update installiert. Ich gehe davon aus, dass dies dazu führt, dass eventuell gespeicherten Userdaten der ‘alten’ App unter der ‘neuen’ App nicht mehr zur Verfügung stehen.
- Modularität / Code and data sharing
Nähere Infos siehe Original-Anleitung.
Bei der Erstellung eines Zertifikats wird die Gültigkeitsdauer definiert. Es ist darauf zu achten, dass diese groß genug gewählt wird, denn nach Ablauf der Gültigkeitsdauer wird ein Update der App nicht mehr ohne weiters möglich sein. Die Empfehlung liegt bei 25 Jahren.
Wenn die App im Android Market veröffentlicht werden soll, darf die Gültigkeitsdauer nicht vor dem 22. Oktober 2033 enden.
Basis-Setup
Die SDK build tools greifen beim Signieren der App auf keytools und jarsigner zu. Es ist dafür zu sorgen, dass das SDK die Pfade zu den Tools kennt. Darum sollten die Pfade entweder in JAVA_HOME oder die Pfadvariable PATH eingetragen werden.
Signieren im Debug Mode
Um den Entwickelung-Prozess und das Debuggen von Android Apps zu vereinfachen, gibt es den debug mode. Wenn man im debug mode arbeitet, signieren die SDK build tools die App bei jeder Kompilierung automatisch mit einem debug keystore und debug key.
Wenn man mit Eclipse entwickelt und die ADT Plugin benutzt, ist das Signieren im debug mode per Voreinstellung aktiviert. Alles läuft automatisch.
Das Debug-Zertifikat hat eine Gültigkeit von 365 Tagen.
Signieren im Release Mode
Das Signieren im release mode erfordert 4 Schritte:
- Bereitstellen eines passenden private keys
- Die App im realease mode kompilieren
- Signieren der App mit dem private key
Bereitstellen eines passenden private keys
Entweder man hat bereits einen private key oder man erzeugt ihn mit keytools. Hier ist ein Beispiel, wie man mit keytool einen private key erstellt:
keytool -genkey -v -keystore my-release-key.keystore
-alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Die einzelnen Parameter:
- -genkey
Erzeugt einen key.
- -v
Umfangreichere Rückmeldungen von keytool aktivieren.
- -keystore
Der Name des keytores, der den private key beinhaltet.
- -alias
Ein Alias für den key. Nur die ersten 8 Zeichen werden berücksichtigt.
- -keyalg
Der Verschlüsselungsalgorithmus, der beim Erstellen des keys benutzt werden soll.
- -keysize
2048 bits oder mehr werden empfohlen.
- -validity
Die Gültigkeitsdauer des keys in Tagen. 10000 oder mehr werden empfohlen.
Über diesen Link findet man eine ausfühliche Beschreibung von keytools: http://download.oracle.com/javase/1.5.0/docs/tooldocs/#security
Nach Eingabe des o.g. Kommandos werden die folgenden Informationen abgefragt:
- Keystore-Password, min. 6 Zeichen
- Wiederholung des Keystore-Passwords
- Vor- und Nachname
- Name der organisatorischen Einheit
- Name der Organisation
- Name der Stadt der Gemeinde
- Name des Bundeslandes oder der Provinz
- Landescode
Wenn man das alles eingegeben hat, bekommt man die eingegeben Daten angezeigt und wird gefragt, ob alles richtig ist. Achtung, wer die Abfragen und Meldungen von keystore in Deutsch bekommt, wird bei der Abfrage
Ist CN=Rolf Dohrmann, OU=Rolf Dohrmann, O=Rolf Dohrmann,
L=Ottersberg, ST=Niedersachsen, C=DE richtig?
[Nein]: ja
Keytools speichert den keystore in dem Verzeichnis, in dem man sich aktuell befindet.
Um die Sache abzukürzen – es folgen noch einige Aktionen mit jarsigner, die bewirken, dass die App mit dem Zertifikat signiert wird. Eine genaue Beschreibung befindet sich im Originaldokument. Ich persönlich arbeite mit Eclipse, und da kann man sich das Leben etwas einfacher machen.
App kompilieren und signieren mit Eclipse und dem ADT Plugin
Die gute Nachricht: Wenn man mit Eclipse arbeitet und das ADT-Plugin installiert hat, kann man den Export Wizard benutzen. Dieser übernimmt alle Aktionen, die sonst manuell mit keytools und jarsigner durchgeführt werden müssten. Was ist zu tun?
- Das Projekt im Project Exporer auswählen.
- Rechte Maustaste -> Export.
- Android / Export Android Application auswählen. Next.
- Project auswählen, falls es noch nicht im Eingabefeld steht. Next.
- Den keystore zuordnen. Angenommen, man hat bereits einen keystore mit keytools erstellt: Bei ‘Location’ den Pfad angeben und bei ‘Password’ das vorher festgelegte Passwort für den keystore eingeben. Next.
- Der Alias sollte schon eingetragen sein. Das Passwort für den key eingeben. Next.
- Angeben, wo die fertige APK gespeichert werden soll. Finish.
Auf diese Weise hat man sich die vielen Kommandos im Terminalfenster gespart. Besten Dank an die Entwicker des ADT Plugins!
Happy Coding,
Rolf Dohrmann