Lo strumento apksigner
, disponibile nella revisione 24.0.3 e successive di
Android SDK Build Tools, ti consente di firmare gli APK e verificare che
La firma dell'APK verrà verificata su tutte le versioni di Android
supportata dall'APK.
Questa pagina presenta una breve guida all'uso
lo strumento e funge da riferimento per le diverse opzioni della riga di comando
supportati dallo strumento. Per una descrizione più completa di come
Lo strumento apksigner
viene utilizzato per firmare gli APK. Consulta la pagina Firmare l'app.
Attenzione: se firmi l'APK utilizzando apksigner
e apportare ulteriori modifiche all'APK, la firma dell'APK viene invalidata.
Se utilizzi
zipalign
per allineare
l'APK, usalo prima di firmare l'APK.
Utilizzo
Firma un APK
La sintassi per firmare un APK utilizzando lo strumento apksigner
è la seguente:
che segue:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
Se firmi un APK usando lo strumento apksigner
, devi fornire
la chiave privata e il certificato del firmatario. Puoi includere queste informazioni
in due modi:
-
Specifica un file di archivio chiavi utilizzando l'opzione
--ks
. -
Specifica separatamente il file della chiave privata e il file del certificato utilizzando il metodo
rispettivamente le opzioni
--key
e--cert
. La il file della chiave privata deve essere nel formato PKCS #8 e il file del certificato deve nel formato X.509.
In genere, firmi un APK usando un solo firmatario. Per
firmare un APK utilizzando più firmatari, usa l'opzione --next-signer
per separare l'insieme di opzioni generali
applicare a ciascun firmatario:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
Verificare la firma di un APK
La sintassi per confermare l'esito positivo della verifica della firma di un APK sulle piattaforme supportate è il seguente:
apksigner verify [options] app-name.apk
Ruota le chiavi di firma
La sintassi per la rotazione di una derivazione di un certificato di firma o di una nuova sequenza di firme, è il seguente:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
Opzioni
I seguenti elenchi includono l'insieme di opzioni per ogni comando che il
Supportati dallo strumento apksigner
.
Firma comando
Il comando del simbolo apksigner
ha le seguenti opzioni.
Opzioni generali
Le seguenti opzioni specificano le impostazioni di base da applicare a un firmatario:
--out <apk-filename>
- La posizione in cui vuoi salvare l'APK firmato. Se questa opzione non è fornito in modo esplicito, il pacchetto APK è già connesso, quindi sovrascrive il file APK di input.
--min-sdk-version <integer>
-
Il livello API del framework Android più basso utilizzato da
apksigner
per per confermare che la firma dell'APK verrà verificata. Valori più alti consentono per usare parametri di sicurezza più efficaci durante la firma dell'app, ma limitando la disponibilità dell'APK su dispositivi su cui sono installate versioni più recenti di Android. Per impostazione predefinita,apksigner
utilizza il valore dell'attributominSdkVersion
del file manifest dell'app. --max-sdk-version <integer>
-
Il più alto livello API del framework Android utilizzato da
apksigner
per confermare la verifica della firma dell'APK. Per impostazione predefinita, utilizza il livello API più alto possibile. --rotation-min-sdk-version <integer>
- Il livello API più basso della firma a rotazione dell'APK dovrebbe usare per produrre la firma dell'APK. La la chiave di firma originale (non ruotata) per l'APK verrà usata per tutti le versioni precedenti della piattaforma. Per impostazione predefinita, Chiavi di firma ruotate, supportate sui dispositivi con Android 13 (livello API 33) o versioni successive, vengono utilizzati con il blocco di firma v3.1.
--v1-signing-enabled <true | false>
-
Consente di stabilire se
apksigner
firma il pacchetto APK specificato usando lo schema di firma tradizionale basato su JAR. Per impostazione predefinita, lo strumento utilizza i valori di--min-sdk-version
e--max-sdk-version
per decidere quando applicare questa firma . --v2-signing-enabled <true | false>
-
Consente di stabilire se
apksigner
firma il pacchetto APK specificato utilizzando l'APK Schema di firma v2. Per impostazione predefinita, lo strumento utilizza i valori--min-sdk-version
e--max-sdk-version
a decidere quando applicare questo schema di firma. --v3-signing-enabled <true | false>
-
Consente di stabilire se
apksigner
firma il pacchetto APK specificato utilizzando l'APK Schema di firma v3. Per impostazione predefinita, lo strumento utilizza i valori--min-sdk-version
e--max-sdk-version
a decidere quando applicare questo schema di firma. --v4-signing-enabled <true | false | only>
-
Consente di stabilire se
apksigner
o meno firma il pacchetto APK specificato utilizzando l'APK Schema di firma v4. Questo schema genera una firma in un file separato (apk-name.apk.idsig
). Setrue
e l'APK non sono firmati, viene visualizzata una firma v2 o v3 viene generato in base ai valori di--min-sdk-version
e--max-sdk-version
. Il comando produce quindi.idsig
in base ai contenuti dell'APK firmato.Utilizza
only
per generare solo la versione v4 senza modificare l'APK e le firme che aveva prima della chiamata.only
non funziona se l'APK non Avere già una firma v2 o v3 o se la firma ha utilizzato una chiave diversa rispetto a quello fornito per la chiamata attuale.Per impostazione predefinita, lo strumento utilizza i valori
--min-sdk-version
e--max-sdk-version
a decidere quando applicare questo schema di firma. -v
,--verbose
- Utilizza la modalità di output dettagliato.
Nota : se la tua app è stata firmata da una firma a rotazione
su un dispositivo con Android 12L (livello API 32) o versioni precedenti,
devi usare --rotation-min-sdk-version 28
per continuare ad accedere
la tua app con la chiave di firma ruotata per Android 9 (livello API 28).
Opzioni per firmatario
Le seguenti opzioni specificano la configurazione di un particolare firmatario. Questi non sono necessarie se firmi l'app usando un solo firmatario.
--next-signer <signer-options>
- Utilizzato per specificare diverse opzioni generali per ciascun firmatario.
--v1-signer-name <basename>
-
Il nome di base dei file che compongono la firma basata su JAR per
firmatario corrente. Per impostazione predefinita,
apksigner
utilizza l'alias della chiave l'archivio chiavi o il nome base del file della chiave per il firmatario.
Opzioni chiave e certificato
Le seguenti opzioni specificano la chiave privata e il certificato del firmatario:
--ks <filename>
-
La chiave privata e la catena di certificati del firmatario si trovano nella
File di archivio chiavi basato su Java. Se il nome del file è impostato su
"NONE"
, l'archivio chiavi contenente la chiave e il certificato non ha bisogno di un file come specificato per alcuni archivi chiavi PKCS #11. --ks-key-alias <alias>
- Il nome dell'alias che rappresenta la chiave privata del firmatario all'interno dell'archivio chiavi. Se l'archivio chiavi associato firmatario contiene più chiavi, devi specificare questa opzione.
--ks-pass <input-format>
-
La password dell'archivio chiavi che contiene la chiave privata del firmatario e certificato. Devi fornire una password per aprire un archivio chiavi. La Lo strumento
apksigner
supporta i seguenti formati:-
pass:<password>
- Password fornita in linea con il resto del comandoapksigner sign
. -
env:<name>
- La password è memorizzata nel variabile di ambiente. -
file:<filename>
- La password viene memorizzata come singola riga nel file specificato. -
stdin
– La password viene fornita su un'unica riga in il flusso di input standard. Questo è il comportamento predefinito per--ks-pass
.
Nota : se includi più password nello stesso indirizzo, specificali su righe separate. Lo strumento
apksigner
associa le password ai firmatari di un APK in base all'ordine in cui tu specifichi i firmatari. Se hai fornito due password per un firmatario,apksigner
interpreta la prima password come un archivio chiavi e la seconda come password della chiave. -
--pass-encoding <charset>
-
Include le codifiche dei caratteri specificate, come
ibm437
outf-8
quando provi a gestire password contenenti caratteri non ASCII.Keytool spesso cripta gli archivi chiavi convertendo la password utilizzando il metodo . Per impostazione predefinita,
apksigner
tenta di decriptare utilizzando diverse forme di password:- Il modulo Unicode
- Il formato è codificato utilizzando il set di caratteri predefinito JVM
- In Java 8 e versioni precedenti, il formato è codificato utilizzando il set di caratteri predefinito della console
In Java 9,
apksigner
non è in grado di rilevare il set di caratteri della console. Potresti dover specificare--pass-encoding
quando e una password non ASCII. Potresti dover specificare questa opzione anche per i keystore che keytool creato su un sistema operativo diverso o in una lingua diversa. --key-pass <input-format>
-
La password per la chiave privata del firmatario, che è necessaria se la chiave privata è protetta da password. Lo strumento
apksigner
supporta i seguenti formati:-
pass:<password>
- Password fornita in linea con il resto del comandoapksigner sign
. -
env:<name>
- La password è memorizzata nel variabile di ambiente. -
file:<filename>
- La password viene memorizzata come singola riga nel file specificato. -
stdin
– La password viene fornita su un'unica riga in il flusso di input standard. Questo è il comportamento predefinito per--key-pass
.
-
--ks-type <algorithm>
-
Il tipo o l'algoritmo associato all'archivio chiavi che contiene la funzione
chiave privata e il certificato del firmatario. Per impostazione predefinita,
apksigner
utilizza il tipo definito come costantekeystore.type
in File delle proprietà di sicurezza. --ks-provider-name <name>
-
Il nome del provider JCA da utilizzare per richiedere l'archivio chiavi del firmatario
implementazione. Per impostazione predefinita,
apksigner
utilizza con la massima priorità. --ks-provider-class <class-name>
-
Il nome completo della classe del provider JCA da utilizzare per la richiesta
l'implementazione dell'archivio chiavi del firmatario. Questa opzione è un'alternativa
per
--ks-provider-name
. Per impostazione predefinita,apksigner
utilizza il fornitore specificato con--ks-provider-name
. --ks-provider-arg <value>
-
Un valore stringa da passare come argomento per il costruttore di JCA
Classe provider; la classe stessa è definita con
Opzione
--ks-provider-class
. Per impostazione predefinita,apksigner
utilizza il costruttore di argomento zero della classe. --key <filename>
-
Il nome del file che contiene la chiave privata del firmatario. Questo file
deve usare il formato DER PKCS #8. Se la chiave è protetta da password,
apksigner
richiede la password utilizzando l'input standard a meno che non specifichi un tipo di formato di input diverso utilizzando Opzione--key-pass
. --cert <filename>
- Il nome del file che contiene la catena di certificati del firmatario. Questo deve usare il formato X.509 PEM o DER.
Comando di verifica
Il comando di verifica apksigner
offre le seguenti opzioni.
--print-certs
- Mostra informazioni sui certificati di firma dell'APK.
--min-sdk-version <integer>
-
Il livello API del framework Android più basso utilizzato da
apksigner
per per confermare che la firma dell'APK sarà verificata. Valori più alti consentono per usare parametri di sicurezza più efficaci durante la firma dell'app, ma limitando la disponibilità dell'APK su dispositivi su cui sono installate versioni più recenti di Android. Per impostazione predefinita,apksigner
utilizza il valore dell'attributominSdkVersion
del file manifest dell'app. --max-sdk-version <integer>
-
Il più alto livello API del framework Android utilizzato da
apksigner
per confermare che la firma dell'APK sarà verificata. Per impostazione predefinita, utilizza il livello API più alto possibile. -v
,--verbose
- Utilizza la modalità di output dettagliato.
-Werr
- Considera gli avvisi come errori.
Esempi
Di seguito sono riportati alcuni esempi che utilizzano apksigner
.
Firma un APK
Firma un APK utilizzando release.jks
, che è l'unica chiave nella
Archivio chiavi:
$ apksigner sign --ks release.jks app.apk
Firma un APK usando una chiave privata e un certificato archiviati come file separati:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Firma un APK utilizzando due chiavi:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
Firma un APK con una chiave di firma ruotata e la versione 28 o versioni successive dell'SDK che ha come target la rotazione:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
Firma un APK con una chiave di firma ruotata e la versione 33 o versioni successive dell'SDK che ha come target la rotazione:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
Verificare la firma di un APK
Controlla se la validità delle firme degli APK dovrebbe essere confermata il giorno tutte le piattaforme Android supportate dall'APK:
$ apksigner verify app.apk
Controlla se la validità delle firme degli APK dovrebbe essere confermata il giorno Android 4.0.3 (livello API 15) e versioni successive:
$ apksigner verify --min-sdk-version 15 app.apk
Ruota le chiavi di firma
Abilita una derivazione del certificato di firma che supporta la rotazione delle chiavi:
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
Ruota di nuovo le chiavi di firma:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks