apksigner

Fitur apksigner, tersedia dalam Android SDK Build Tools revisi 24.0.3 dan yang lebih baru, memungkinkan Anda mengonfirmasi bahwa tanda tangan APK akan berhasil diverifikasi di semua versi platform Android yang didukung oleh APK tersebut. Halaman ini menyajikan panduan singkat dalam menggunakan fitur dan berfungsi sebagai referensi bagi opsi command line berbeda yang didukung oleh fitur tersebut. Untuk mengetahui deskripsi lebih lengkap tentang cara fitur apksigner digunakan guna menandatangani APK, lihat panduan Menandatangani aplikasi.

Perhatian: Jika Anda menandatangani APK menggunakan apksigner dan membuat perubahan lebih lanjut pada APK, tanda tangan APK akan menjadi tidak valid. Oleh karena itu, Anda harus menggunakan fitur seperti zipalign sebelum menandatangani APK.

Penggunaan

Menandatangani APK

Sintaks untuk penandatanganan APK menggunakan fitur apksigner adalah sebagai berikut:

    apksigner sign --ks keystore.jks |
      --key key.pk8 --cert cert.x509.pem
      [signer_options] app-name.apk
    

Saat Anda menandatangani APK menggunakan fitur 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. Ketika 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 fitur 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>
Level API framework Android terendah yang digunakan apksigner untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Nilai yang lebih tinggi memungkinkan fitur menggunakan parameter keamanan yang lebih kuat ketika menandatangani aplikasi tetapi membatasi ketersediaan APK ke perangkat yang menjalankan versi Android yang lebih baru. Secara default, apksigner akan menggunakan nilai atribut minSdkVersion dari file manifes aplikasi.
--max-sdk-version <integer>
Level API framework Android tertinggi yang digunakan apksigner untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Secara default, fitur ini menggunakan level API setinggi mungkin.
--v1-signing-enabled <true | false>
Menentukan apakah apksigner menandatangani paket APK tertentu menggunakan skema penandatanganan tradisional berbasis JAR. Secara default, fitur tersebut 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, fitur ini menggunakan nilai --min-sdk-version dan --max-sdk-version untuk memutuskan kapan menerapkan skema tanda tangan ini.
-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 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 rantai 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. Fitur 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 aliran input standar. Hal ini adalah perilaku default untuk --ks-pass.

Catatan: Jika Anda memasukkan beberapa sandi dalam file yang sama, tentukan sandi tersebut di baris yang berbeda. Fitur 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 mengartikan sandi pertama sebagai sandi KeyStore dan yang kedua sebagai sandi kunci.

--pass-encoding <charset>
Menyertakan pengodean karakter yang ditentukan (seperti, ibm437 atau utf-8 ) ketika mencoba menangani sandi yang berisi karakter non-ASCII.

Keytool sering mengenkripsi keystore dengan mengubah 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. Fitur 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 aliran input standar. Hal ini adalah perilaku default untuk --key-pass.

Catatan: Jika Anda memasukkan beberapa sandi dalam file yang sama, tentukan sandi tersebut di baris yang berbeda. Fitur 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 mengartikan 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 yang berkualifikasi penuh dari Penyedia JCA 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 untuk diberikan sebagai argumen bagi konstruktor class Penyedia JCA; class itu sendiri ditentukan 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 X.509 PEM atau DER.

Memverifikasi perintah

--print-certs
Menampilkan informasi tentang sertifikat penandatanganan APK.
--min-sdk-version <integer>
Level API framework Android terendah yang digunakan apksigner untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Nilai yang lebih tinggi memungkinkan fitur menggunakan parameter keamanan yang lebih kuat ketika menandatangani aplikasi tetapi membatasi ketersediaan APK ke perangkat yang menjalankan versi Android yang lebih baru. Secara default, apksigner akan menggunakan nilai atribut minSdkVersion dari file manifes aplikasi.
--max-sdk-version <integer>
Level API framework Android tertinggi yang digunakan apksigner untuk mengonfirmasi bahwa tanda tangan APK akan diverifikasi. Secara default, fitur ini menggunakan level API 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