Alat apksigner
yang tersedia dalam Android SDK Build Tools revisi 24.0.3 dan
yang lebih baru, memungkinkan Anda untuk menandatangani
APK dan mengonfirmasi bahwa tanda tangan APK akan berhasil diverifikasi pada semua versi platform
Android yang didukung oleh APK tersebut. Halaman ini menyajikan panduan singkat dalam menggunakan
alat dan berfungsi sebagai referensi bagi beragam opsi command line yang
didukung oleh alat tersebut. Untuk mengetahui deskripsi lebih lengkap tentang cara alat
apksigner
digunakan untuk menandatangani APK, lihat panduan Menandatangani aplikasi.
Perhatian: Jika Anda menandatangani APK menggunakan apksigner
dan membuat perubahan lebih lanjut pada APK, tanda tangan APK menjadi tidak valid.
Oleh karena itu, Anda harus menggunakan alat seperti zipalign
sebelum menandatangani
APK.
Penggunaan
Menandatangani APK
Sintaks untuk penandatanganan APK menggunakan alat apksigner
adalah sebagai
berikut:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
Saat menandatangani APK menggunakan alat apksigner
, Anda harus memberikan
kunci pribadi dan sertifikat penanda tangan. Anda dapat memasukkan informasi ini dengan
dua cara berbeda:
-
Menentukan file KeyStore menggunakan opsi
--ks
. -
Menentukan file kunci pribadi dan file sertifikat secara terpisah menggunakan opsi
--key
dan--cert
. File kunci pribadi harus menggunakan format PKCS #8, dan file sertifikat harus menggunakan format X.509.
Biasanya, Anda dapat menandatangani APK cukup menggunakan satu penanda tangan. Jika Anda perlu menandatangani APK
menggunakan beberapa penanda tangan, gunakan opsi
--next-signer
untuk memisahkan kumpulan opsi umum
yang akan diterapkan ke setiap penanda tangan:
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
Memverifikasi tanda tangan APK
Sintaksis untuk mengonfirmasi bahwa tanda tangan APK akan berhasil diverifikasi pada platform yang didukung adalah sebagai berikut:
apksigner verify [options] app-name.apk
Memutar kunci tanda tangan
Sintaksis untuk memutar urutan sertifikat penandatanganan, atau urutan baru tanda tangan, adalah sebagai berikut:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
Opsi
Daftar berikut mencakup sekumpulan opsi untuk setiap perintah yang didukung oleh alat
apksigner
.
Menandatangani perintah
Opsi umum
Opsi berikut menentukan setelan dasar untuk diterapkan ke penanda tangan:
--out <apk-filename>
- Lokasi tempat Anda ingin menyimpan APK yang ditandatangani. Jika opsi ini tidak disediakan secara eksplisit, paket APK akan ditandatangani di tempat, menimpa file APK input.
--min-sdk-version <integer>
-
API level framework Android terendah yang digunakan
apksigner
untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Nilai yang lebih tinggi memungkinkan alat menggunakan parameter keamanan yang lebih kuat saat menandatangani aplikasi tetapi membatasi ketersediaan APK ke perangkat yang menjalankan versi Android yang lebih baru. Secara default,apksigner
menggunakan nilai atributminSdkVersion
dari file manifes aplikasi. --max-sdk-version <integer>
-
API level framework Android tertinggi yang digunakan
apksigner
untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Secara default, alat ini menggunakan API level setinggi mungkin. --v1-signing-enabled <true | false>
-
Menentukan apakah
apksigner
menandatangani paket APK tertentu menggunakan skema penandatanganan tradisional berbasis JAR. Secara default, alat tersebut akan menggunakan nilai--min-sdk-version
dan--max-sdk-version
untuk menentukan kapan harus menerapkan skema tanda tangan ini. --v2-signing-enabled <true | false>
-
Menentukan apakah
apksigner
menandatangani paket APK tertentu menggunakan APK Signature Scheme v2. Secara default, alat tersebut akan menggunakan nilai--min-sdk-version
dan--max-sdk-version
untuk menentukan kapan harus menerapkan skema tanda tangan ini. --v3-signing-enabled <true | false>
-
Menentukan apakah
apksigner
menandatangani paket APK tertentu menggunakan APK Signature Scheme v3. Secara default, alat tersebut akan menggunakan nilai--min-sdk-version
dan--max-sdk-version
untuk menentukan kapan harus menerapkan skema tanda tangan ini. --v4-signing-enabled <true | false | only>
-
Menentukan apakah
apksigner
menandatangani paket APK tertentu menggunakan APK Signature Scheme v4. Skema ini menghasilkan tanda tangan dalam file terpisah (apk-name.apk.idsig
). Jikatrue
dan APK tidak ditandatangani, maka tanda tangan v2 atau v3 akan dihasilkan berdasarkan nilai--min-sdk-version
dan--max-sdk-version
. Perintah tersebut kemudian menghasilkan file.idsig
berdasarkan konten APK yang ditandatangani. Gunakanonly
untuk menghasilkan tanda tangan v4 saja tanpa memodifikasi APK dan tanda tangan yang dimilikinya sebelum pemanggilan.only
akan gagal jika APK tidak memiliki tanda tangan v2 atau v3, atau jika tanda tangan menggunakan kunci yang berbeda dari yang disediakan untuk pemanggilan saat ini. Secara default, alat tersebut akan menggunakan nilai--min-sdk-version
dan--max-sdk-version
untuk menentukan kapan harus menerapkan skema tanda tangan ini. --v4-no-merkle-tree
-
Secara default, file
.idsig
menyertakan hierarki merkle lengkap file APK. Dengan flag ini, apksigner menghasilkan file.idsig
APK Signature Scheme v4 tanpa disematkan hierarki Merkle sepenuhnya. Opsi ini mengurangi ukuran file tanda tangan, tetapi memaksa alat apa pun yang memerlukan hierarki tersebut untuk menghitung ulang lagi, atau memanggil fiturapksigner
lagi. -v
,--verbose
- Menggunakan mode output panjang.
Opsi per penanda tangan
Opsi berikut ini akan menentukan konfigurasi penanda tangan tertentu. Opsi ini tidak diperlukan jika Anda menandatangani aplikasi hanya menggunakan satu penanda tangan.
--next-signer <signer-options>
- Digunakan untuk menentukan opsi umum yang berbeda bagi setiap penanda tangan.
--v1-signer-name <basename>
-
Nama dasar file yang berisi tanda tangan berbasis JAR untuk penanda tangan
saat ini. Secara default,
apksigner
menggunakan alias kunci dari KeyStore atau nama dasar file kunci untuk penanda tangan ini.
Opsi kunci dan sertifikat
Opsi berikut menentukan kunci pribadi dan sertifikat penanda tangan:
--ks <filename>
-
Kunci pribadi dan rangkaian sertifikat penanda tangan berada di file KeyStore berbasis
Java yang ditentukan. Jika nama file ditetapkan ke
"NONE"
, KeyStore yang berisi kunci dan sertifikat tidak akan memerlukan file yang ditentukan, yang merupakan kasus bagi beberapa KeyStore PKCS #11. --ks-key-alias <alias>
- Nama alias yang merepresentasikan kunci pribadi dan data sertifikat penanda tangan dalam KeyStore. Jika KeyStore yang dikaitkan dengan penanda tangan berisi beberapa kunci, Anda harus menentukan opsi ini.
--ks-pass <input-format>
-
Sandi untuk KeyStore yang berisi kunci pribadi dan sertifikat penanda tangan. Anda harus menyediakan sandi untuk membuka KeyStore. Alat
apksigner
mendukung format berikut:-
pass:<password>
– Sandi yang disediakan sesuai dengan perintahapksigner sign
lainnya. -
env:<name>
– Sandi disimpan dalam variabel lingkungan tertentu. -
file:<filename>
– Sandi disimpan sebagai satu baris dalam file tertentu. -
stdin
– Sandi disediakan sebagai satu baris dalam stream input standar. Ini adalah perilaku default untuk--ks-pass
.
Catatan: Jika Anda memasukkan beberapa sandi dalam file yang sama, tentukan sandi tersebut di baris yang berbeda. Alat
apksigner
akan mengaitkan sandi dengan penanda tangan APK berdasarkan urutan yang Anda tentukan kepada penanda tangan. Jika Anda telah memberikan dua sandi untuk penanda tangan,apksigner
akan menginterpretasikan sandi pertama sebagai sandi KeyStore dan yang kedua sebagai sandi kunci. -
--pass-encoding <charset>
-
Menyertakan encoding karakter tertentu yang ditentukan (seperti,
ibm437
atauutf-8
) ketika mencoba menangani sandi yang berisi karakter non-ASCII.Keytool sering mengenkripsi keystore dengan mengonversi sandi menggunakan charset default konsol. Secara default,
apksigner
mencoba mendekripsi menggunakan beberapa bentuk sandi: bentuk Unicode, bentuk yang dienkodekan menggunakan charset default JVM, dan, pada Java 8 dan yang lebih lama, bentuk yang dienkode menggunakan charset default konsol. Pada Java 9,apksigner
tidak dapat mendeteksi charset konsol. Jadi, Anda mungkin perlu menentukan--pass-encoding
ketika yang digunakan adalah sandi non-ASCII. Anda mungkin juga perlu menentukan opsi ini dengan keystore yang dibuat oleh keytool pada OS yang berbeda atau di tempat yang berbeda. --key-pass <input-format>
-
Sandi untuk kunci pribadi penanda tangan, yang diperlukan jika kunci pribadi dilindungi sandi. Alat
apksigner
mendukung format berikut:-
pass:<password>
– Sandi yang disediakan sesuai dengan perintahapksigner sign
lainnya. -
env:<name>
– Sandi disimpan dalam variabel lingkungan tertentu. -
file:<filename>
– Sandi disimpan sebagai satu baris dalam file tertentu. -
stdin
– Sandi disediakan sebagai satu baris dalam stream input standar. Ini adalah perilaku default untuk--key-pass
.
Catatan: Jika Anda memasukkan beberapa sandi dalam file yang sama, tentukan sandi tersebut di baris yang berbeda. Alat
apksigner
akan mengaitkan sandi dengan penanda tangan APK berdasarkan urutan yang Anda tentukan kepada penanda tangan. Jika Anda telah memberikan dua sandi untuk penanda tangan,apksigner
akan menginterpretasikan sandi pertama sebagai sandi KeyStore dan yang kedua sebagai sandi kunci. -
--ks-type <algorithm>
-
Jenis atau algoritme yang dikaitkan dengan KeyStore yang berisi
kunci pribadi dan sertifikat penanda tangan. Secara default,
apksigner
menggunakan jenis yang ditentukan sebagai konstantakeystore.type
dalam file properti Keamanan. --ks-provider-name <name>
-
Nama Penyedia JCA yang digunakan saat meminta implementasi KeyStore
penanda tangan. Secara default,
apksigner
menggunakan penyedia dengan prioritas tertinggi. --ks-provider-class <class-name>
-
Nama class Penyedia JCA yang sepenuhnya memenuhi syarat yang digunakan saat meminta
implementasi KeyStore penanda tangan. Opsi ini berfungsi sebagai alternatif untuk
--ks-provider-name
. Secara default,apksigner
menggunakan penyedia yang ditentukan dengan opsi--ks-provider-name
. --ks-provider-arg <value>
-
Nilai string akan diberikan sebagai argumen bagi konstruktor class
Penyedia JCA; class itu sendiri didefinisikan dengan opsi
--ks-provider-class
. Secara default,apksigner
menggunakan konstruktor 0-argumen class. --key <filename>
-
Nama file yang berisi kunci pribadi penanda tangan. File ini
harus menggunakan format DER PKCS #8. Jika kuncinya dilindungi sandi,
apksigner
akan meminta sandi menggunakan input standar kecuali Anda menentukan jenis format input lain yang menggunakan opsi--key-pass
. --cert <filename>
- Nama file yang berisi rantai sertifikat penanda tangan. File ini harus menggunakan format PEM atau DER X.509.
Memverifikasi perintah
--print-certs
- Menampilkan informasi tentang sertifikat penandatanganan APK.
--min-sdk-version <integer>
-
API level framework Android terendah yang digunakan
apksigner
untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Nilai yang lebih tinggi memungkinkan alat menggunakan parameter keamanan yang lebih kuat saat menandatangani aplikasi tetapi membatasi ketersediaan APK ke perangkat yang menjalankan versi Android yang lebih baru. Secara default,apksigner
menggunakan nilai atributminSdkVersion
dari file manifes aplikasi. --max-sdk-version <integer>
-
API level framework Android tertinggi yang digunakan
apksigner
untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Secara default, alat ini menggunakan API level setinggi mungkin. -v
,--verbose
- Menggunakan mode output panjang.
-Werr
- Memperlakukan peringatan sebagai error.
Contoh
Menandatangani APK
Menandatangani APK menggunakan release.jks
, yang merupakan satu-satunya kunci di
KeyStore:
$ apksigner sign --ks release.jks app.apk
Menandatangani APK menggunakan kunci pribadi dan sertifikat, yang disimpan sebagai file terpisah:
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Menandatangani APK menggunakan dua tombol:
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
Memverifikasi tanda tangan APK
Periksa apakah tanda tangan APK diharapkan untuk dikonfirmasi sebagai valid pada semua platform Android yang didukung APK:
$ apksigner verify app.apk
Periksa apakah tanda tangan APK diharapkan untuk dikonfirmasi sebagai valid pada Android 4.0.3 (API level 15) dan yang lebih tinggi:
$ apksigner verify --min-sdk-version 15 app.apk
Memutar kunci tanda tangan
Aktifkan urutan sertifikat penandatanganan yang mendukung pemutaran kunci:
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
Memutar kembali tombol penandatanganan:
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks