Das apksigner
-Tool, das in Version 24.0.3 und höher von
Android SDK Build Tools verwenden, können Sie APKs signieren und bestätigen, dass ein
Die APK-Signatur wird auf allen Android-Versionen erfolgreich bestätigt
Plattform, die von diesem APK unterstützt wird.
Diese Seite enthält eine kurze Anleitung zur Verwendung
und dient als Referenz für die verschiedenen Befehlszeilenoptionen,
die das Tool unterstützt. Eine ausführlichere Beschreibung der
Das apksigner
-Tool wird zum Signieren deiner APKs verwendet. Weitere Informationen findest du unter App signieren.
Achtung : Wenn Sie Ihr APK mit apksigner
signieren
und weitere Änderungen am APK vornehmen, wird die APK-Signatur ungültig.
Wenn Sie
Zum Ausrichten zipalign
Verwenden Sie diese, bevor Sie das APK signieren.
Nutzung
APK signieren
Die Syntax zum Signieren eines APKs mit dem apksigner
-Tool lautet wie folgt:
folgt:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
Wenn du ein APK mit dem apksigner
-Tool signierst, musst du angeben,
privaten Schlüssel und Zertifikat des Unterzeichners. Sie können diese Informationen
auf zwei Arten:
-
Geben Sie eine KeyStore-Datei mit der Option
--ks
an. -
Geben Sie die Datei mit dem privaten Schlüssel und die Zertifikatsdatei mithilfe des
Die Optionen
--key
und--cert
. Die muss die private Schlüsseldatei das PKCS #8-Format haben und die Zertifikatsdatei verwenden Sie das X.509-Format.
Normalerweise signierst du ein APK mit nur einem Unterzeichner. Bei Bedarf
ein APK mit mehreren Unterzeichnern signieren, verwende die Option --next-signer
um die allgemeinen Optionen
auf alle Unterzeichner anwenden:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
Signatur eines APK prüfen
Die Syntax zur Bestätigung der erfolgreichen Bestätigung der APK-Signatur auf unterstützten Plattformen ist:
apksigner verify [options] app-name.apk
Signierschlüssel rotieren
Die Syntax für die Rotation einer Signaturzertifikat-Herkunft oder eine neue Sequenz von wie folgt lautet:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
Optionen
Die folgenden Listen enthalten die Optionen für jeden Befehl, den der
apksigner
-Tool unterstützt.
Befehl signieren
Der Befehl apksigner
zum Signieren hat die folgenden Optionen.
Allgemeine Optionen
Die folgenden Optionen geben grundlegende Einstellungen an, die auf einen Unterzeichner angewendet werden sollen:
--out <apk-filename>
- Der Speicherort, an dem das signierte APK gespeichert werden soll. Wenn diese Option nicht explizit angegeben ist, ist das APK-Paket dort signiert, wodurch die APK-Eingabedatei.
--min-sdk-version <integer>
-
Das niedrigste Android-Framework-API-Level, das
apksigner
verwendet, um bestätigen, dass die APK-Signatur verifiziert wird. Bei höheren Werten kann das um stärkere Sicherheitsparameter beim Signieren der App zu verwenden, die Verfügbarkeit des APK für Geräte mit neueren Android-Versionen. Standardmäßig verwendetapksigner
den Wert desminSdkVersion
-Attribut aus der Manifestdatei der App. --max-sdk-version <integer>
-
Das höchste von
apksigner
verwendete Android-Framework-API-Level um zu bestätigen, dass die APK-Signatur überprüft wird. Standardmäßig weist das Tool verwendet das höchstmögliche API-Level. --rotation-min-sdk-version <integer>
- Das niedrigste API-Level für die rotierte Signatur des APKs -Schlüssel zum Erstellen der APK-Signatur verwenden. Die Der ursprüngliche (nicht rotierte) Signaturschlüssel für das APK wird für alle vorherigen Plattformversionen. Standardmäßig rotierte Signaturschlüssel, die auf Geräten mit Android 13 unterstützt werden (API-Level 33) oder höher, werden mit dem Signaturblock v3.1 verwendet.
--v1-signing-enabled <true | false>
-
Bestimmt, ob
apksigner
das angegebene APK-Paket signiert mit dem traditionellen, JAR-basierten Signaturschema. Standardmäßig verwendet das Tool die Werte von--min-sdk-version
und--max-sdk-version
, um zu entscheiden, wann diese Signatur angewendet werden soll . --v2-signing-enabled <true | false>
-
Bestimmt, ob
apksigner
das angegebene APK-Paket signiert mit dem APK Signaturschema v2. Standardmäßig verwendet das Tool die Werte--min-sdk-version
und--max-sdk-version
für die Entscheidung wann dieses Signaturschema angewendet werden soll. --v3-signing-enabled <true | false>
-
Bestimmt, ob
apksigner
das angegebene APK-Paket signiert mit dem APK Signaturschema v3. Standardmäßig verwendet das Tool die Werte--min-sdk-version
und--max-sdk-version
für die Entscheidung wann dieses Signaturschema angewendet werden soll. --v4-signing-enabled <true | false | only>
-
Bestimmt, ob
apksigner
das angegebene APK-Paket signiert mit dem APK Signaturschema v4. Dieses Schema erstellt eine Signatur in einer separaten Datei (apk-name.apk.idsig
). Wenntrue
und das APK nicht signiert sind, gibt es eine v2- oder v3-Signatur wird anhand der Werte von--min-sdk-version
und--max-sdk-version
. Der Befehl generiert dann die.idsig
-Datei basierend auf dem Inhalt des signierten APK.Verwenden Sie
only
, um nur die Version 4 zu generieren. ohne das APK und die Signaturen zu ändern. vor dem Aufruf.only
schlägt fehl, wenn das APK bereits über eine v2- oder v3-Signatur verfügen oder wenn für die Signatur ein anderer Schlüssel verwendet wurde. als der für den aktuellen Aufruf angegebene.Standardmäßig verwendet das Tool die Werte
--min-sdk-version
und--max-sdk-version
für die Entscheidung wann dieses Signaturschema angewendet werden soll. -v
,--verbose
- Verwenden Sie den ausführlichen Ausgabemodus.
Hinweis : Falls Ihre App durch eine rotierte Signatur
auf einem Gerät mit Android 12L (API-Level 32) oder niedriger installiert ist,
Sie müssen zum Fortfahren --rotation-min-sdk-version 28
verwenden
deine App mit dem rotierten Signaturschlüssel für Android 9 (API-Level 28) an.
Optionen pro Unterzeichner
Die folgenden Optionen geben die Konfiguration eines bestimmten Unterzeichners an. Diese Optionen sind nicht erforderlich, wenn du deine App mit nur einem Unterzeichner signierst.
--next-signer <signer-options>
- Wird verwendet, um verschiedene allgemeine Optionen für jeden Unterzeichner anzugeben.
--v1-signer-name <basename>
-
Der Basisname für die Dateien, die die JAR-basierte Signatur für die
aktuellen Unterzeichner Standardmäßig verwendet
apksigner
den Schlüsselalias von den KeyStore oder den Basisnamen der Schlüsseldatei für diesen Unterzeichner.
Schlüssel- und Zertifikatsoptionen
Die folgenden Optionen geben den privaten Schlüssel und das Zertifikat des Unterzeichners an:
--ks <filename>
-
Der private Schlüssel und die Zertifikatskette des Unterzeichners befinden sich in der angegebenen
Java-basierte KeyStore-Datei. Wenn der Dateiname auf
"NONE"
festgelegt ist, Für den KeyStore, der den Schlüssel und das Zertifikat enthält, ist keine Datei erforderlich. Dies ist bei einigen PKCS #11-KeyStores der Fall. --ks-key-alias <alias>
- Der Name des Alias, der den privaten Schlüssel des Unterzeichners und Zertifikatdaten im KeyStore. Wenn der KeyStore, der mit dem Signer mehrere Schlüssel enthält, müssen Sie diese Option angeben.
--ks-pass <input-format>
-
Das Passwort für den KeyStore, der den privaten Schlüssel und den privaten Schlüssel des Unterzeichners enthält Zertifikat. Sie müssen ein Passwort angeben, um einen KeyStore zu öffnen. Die Das
apksigner
-Tool unterstützt die folgenden Formate:-
pass:<password>
– Passwort inline angegeben durch den Rest desapksigner sign
-Befehls. -
env:<name>
: Das Passwort wird im gegebenen Umgebungsvariable ein. -
file:<filename>
– Das Passwort wird gespeichert als in einer einzelnen Zeile in der jeweiligen Datei ein. -
stdin
: Das Passwort wird als eine Zeile im Feld Standardeingabestream. Dies ist das Standardverhalten für--ks-pass
Hinweis : Wenn Sie mehrere Passwörter in demselben in separaten Zeilen angeben. Das
apksigner
-Tool die Passwörter mit den Unterzeichnern eines APK verknüpfen, je nachdem, in welcher Reihenfolge geben Sie die Unterzeichner an. Wenn Sie für einen Unterzeichner zwei Passwörter angegeben haben,apksigner
interpretiert das erste Passwort als KeyStore und das zweite als Schlüsselpasswort. -
--pass-encoding <charset>
-
Enthält die angegebenen Zeichencodierungen, z. B.
ibm437
oderutf-8
, wenn Sie versuchen, Passwörter verarbeiten, die Nicht-ASCII-Zeichen enthalten.Keytool verschlüsselt Schlüsselspeicher häufig, indem das Passwort mit der Standardeinstellung der Konsole konvertiert wird. charset. Standardmäßig versucht
apksigner
, die Verschlüsselung mit verschiedenen Formen des Passwort:- Unicode-Form
- Das mit dem JVM-Standardzeichensatz codierte Formular
- Unter Java 8 und älteren Versionen wurde das Formular mit dem Standard-Zeichensatz der Konsole codiert.
Unter Java 9 kann
apksigner
den Zeichensatz der Konsole nicht erkennen. Unter Umständen müssen Sie--pass-encoding
angeben, wenn nicht-ASCII-Passwort verwendet. Möglicherweise müssen Sie diese Option auch mit KeyStores festlegen, Keytool, das unter einem anderen Betriebssystem oder in einer anderen Sprache erstellt wurde. --key-pass <input-format>
-
Das Passwort für den privaten Schlüssel des Unterzeichners, der erforderlich ist, wenn der ist der private Schlüssel passwortgeschützt. Das
apksigner
-Tool unterstützt folgende Formate:-
pass:<password>
– Das Passwort wird inline angegeben durch den Rest desapksigner sign
-Befehls. -
env:<name>
: Das Passwort wird im gegebenen Umgebungsvariable ein. -
file:<filename>
– Das Passwort wird gespeichert als in einer einzelnen Zeile in der jeweiligen Datei ein. -
stdin
: Das Passwort wird als eine Zeile im Feld Standardeingabestream. Dies ist das Standardverhalten für--key-pass
-
--ks-type <algorithm>
-
Der Typ oder Algorithmus, der bzw. der mit dem KeyStore verknüpft ist, der die
privaten Schlüssel und Zertifikat des Signaturgebers. Standardmäßig
apksigner
verwendet den Typ, der alskeystore.type
-Konstante in der Datei mit Sicherheitseigenschaften. --ks-provider-name <name>
-
Der Name des JCA-Anbieters, der beim Anfordern des KeyStore des Unterzeichners verwendet werden soll
Implementierung. Standardmäßig verwendet
apksigner
die Methode Anbieter mit höchster Priorität. --ks-provider-class <class-name>
-
Der voll qualifizierte Klassenname des JCA-Anbieters, der beim Anfordern verwendet wird
die KeyStore-Implementierung des Unterzeichners. Diese Option dient als Alternative
für
--ks-provider-name
. Standardmäßigapksigner
verwendet den mit--ks-provider-name
angegebenen Anbieter Option. --ks-provider-arg <value>
-
Stringwert, der als Argument für den Konstruktor der JCA übergeben wird
Anbieterklasse wird die Klasse selbst mit dem
Option
--ks-provider-class
. Standardmäßigapksigner
verwendet den Null-Argument-Konstruktor der Klasse. --key <filename>
-
Der Name der Datei, die den privaten Schlüssel des Unterzeichners enthält. Diese Datei
muss das PKCS #8-DER-Format verwenden. Ist der Schlüssel passwortgeschützt,
apksigner
fordert die Eingabe des Passworts über die Standardeingabe auf es sei denn, Sie geben mit der Methode Option--key-pass
. --cert <filename>
- Der Name der Datei, die die Zertifikatskette des Unterzeichners enthält. Dieses -Datei muss das X.509 PEM- oder DER-Format haben.
Befehl überprüfen
Der Befehl apksigner
verify hat die folgenden Optionen.
--print-certs
- Informationen zu den Signaturzertifikaten des APK anzeigen.
--min-sdk-version <integer>
-
Das niedrigste Android-Framework-API-Level, das
apksigner
verwendet, um bestätigen, dass die APK-Signatur verifiziert wird. Bei höheren Werten kann das um stärkere Sicherheitsparameter beim Signieren der App zu verwenden, die Verfügbarkeit des APK für Geräte mit neueren Android-Versionen. Standardmäßig verwendetapksigner
den Wert desminSdkVersion
-Attribut aus der Manifestdatei der App. --max-sdk-version <integer>
-
Das höchste von
apksigner
verwendete Android-Framework-API-Level um zu bestätigen, dass die APK-Signatur überprüft wird. Standardmäßig weist das Tool verwendet das höchstmögliche API-Level. -v
,--verbose
- Verwenden Sie den ausführlichen Ausgabemodus.
-Werr
- Behandeln Sie Warnungen wie Fehler.
Beispiele
Im Folgenden finden Sie Beispiele für die Verwendung von apksigner
.
APK signieren
Signiere ein APK mit release.jks
. Dies ist der einzige Schlüssel im
Schlüsselspeicher:
$ apksigner sign --ks release.jks app.apk
Signiere ein APK mit einem privaten Schlüssel und einem Zertifikat, die als separate Dateien gespeichert sind:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Signiere ein APK mit zwei Schlüsseln:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
Signieren Sie ein APK mit einem rotierten Signaturschlüssel und dem Rotations-Targeting SDK-Version 28 oder höher:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
Signieren Sie ein APK mit einem rotierten Signaturschlüssel und dem Rotations-Targeting auf SDK-Version 33 oder höher:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
Signatur eines APK prüfen
Prüfe, ob die Gültigkeit der APK-Signaturen auf allen Android-Plattformen, die das APK unterstützt:
$ apksigner verify app.apk
Prüfe, ob die Gültigkeit der APK-Signaturen auf Android 4.0.3 (API-Level 15) und höher:
$ apksigner verify --min-sdk-version 15 app.apk
Signierschlüssel rotieren
Aktivieren Sie eine Signaturzertifikatsherkunft, die die Schlüsselrotation unterstützt:
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
Rotieren Sie Ihre Signaturschlüssel noch einmal:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks