apksigner

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 verwendet apksigner den Wert des minSdkVersion-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.

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.

--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). Wenn true 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.

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 des apksigner 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 oder utf-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 des apksigner 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 als keystore.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äßig apksigner 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äßig apksigner 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 verwendet apksigner den Wert des minSdkVersion-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