Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

apksigner

Alat apksigner yang tersedia dalam Android SDK Build Tools revisi 24.0.3 dan yang lebih tinggi, 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 atribut minSdkVersion 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 v4. 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 v4. 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). Jika true 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. Gunakan only 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 fitur apksigner 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 perintah apksigner 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 atau utf-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 perintah apksigner 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 konstanta keystore.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 atribut minSdkVersion 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