เครื่องมือ apksigner
ซึ่งมีอยู่ในเวอร์ชัน 24.0.3 ขึ้นไป
เครื่องมือสร้าง APK ของ Android SDK จะช่วยให้คุณสามารถ
รับรอง APK และยืนยันว่า
ลายเซ็นของ APK จะได้รับการยืนยันใน Android ทุกเวอร์ชันสำเร็จ
แพลตฟอร์มที่ APK นั้นรองรับ
หน้านี้จะแนะนำสั้นๆ ในการใช้
เครื่องมือและทำหน้าที่เป็นข้อมูลอ้างอิงสำหรับตัวเลือกบรรทัดคำสั่งต่างๆ
ที่เครื่องมือนี้สนับสนุน หากต้องการคำอธิบายที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับวิธี
เครื่องมือ apksigner
ใช้สำหรับรับรอง APK ของคุณ โปรดดูส่วนรับรองแอป
ข้อควรระวัง: หากคุณรับรอง APK โดยใช้ apksigner
และทำการเปลี่ยนแปลง APK เพิ่มเติมจะทำให้ลายเซ็นของ APK ไม่ถูกต้อง
หากคุณใช้
zipalign
เพื่อจัดข้อความ
APK ของคุณ ให้ใช้ไฟล์
ก่อนลงนาม APK
การใช้งาน
ลงนาม APK
ไวยากรณ์สำหรับการรับรอง APK โดยใช้เครื่องมือ apksigner
เป็นไปตาม
ดังต่อไปนี้:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem [signer_options] app-name.apk
เมื่อคุณลงนาม APK โดยใช้เครื่องมือ apksigner
คุณต้องระบุ
คีย์ส่วนตัวและใบรับรองของผู้ลงนาม คุณสามารถรวมข้อมูลนี้ใน
มี 2 วิธี ได้แก่
-
ระบุไฟล์ KeyStore โดยใช้ตัวเลือก
--ks
-
ระบุไฟล์คีย์ส่วนตัวและไฟล์ใบรับรองแยกต่างหากโดยใช้
--key
และ--cert
ตัวเลือกตามลำดับ ไฟล์คีย์ส่วนตัวต้องใช้รูปแบบ PKCS #8 และไฟล์ใบรับรองต้อง ใช้รูปแบบ X.509
โดยปกติ คุณจะลงนาม APK โดยใช้ผู้ลงนามเพียงรายเดียว หากคุณจำเป็นต้องทำดังนี้
ลงนาม APK โดยใช้ผู้ลงนามหลายคน ใช้ตัวเลือก --next-signer
เพื่อแยกชุดตัวเลือกทั่วไปเป็น
ให้ใช้กับผู้ลงนามแต่ละคน
apksigner sign [signer_1_options] --next-signer [signer_2_options] app-name.apk
ยืนยันลายเซ็นของ APK
ไวยากรณ์สำหรับยืนยันว่าการยืนยันลายเซ็นของ APK สำเร็จ บนแพลตฟอร์มที่รองรับดังต่อไปนี้
apksigner verify [options] app-name.apk
หมุนเวียนคีย์การรับรอง
ชุดคำสั่งตามรูปแบบไวยากรณ์สำหรับการหมุนเวียนบรรทัดฐานใบรับรองที่ลงนามหรือลำดับใหม่ของ ดังนี้
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file \ --old-signer --ks old-signer-jks \ --new-signer --ks new-signer-jks
ตัวเลือก
รายการต่อไปนี้มีชุดตัวเลือกสำหรับแต่ละคำสั่งที่ฟังก์ชัน
รองรับเครื่องมือ apksigner
ลงนามในคำสั่ง
คำสั่งเครื่องหมาย apksigner
มีตัวเลือกต่อไปนี้
ตัวเลือกทั่วไป
ตัวเลือกต่อไปนี้ระบุการตั้งค่าพื้นฐานที่จะใช้กับผู้เซ็น
--out <apk-filename>
- ตำแหน่งที่คุณต้องการบันทึก APK ที่ลงชื่อแล้ว หากตัวเลือกนี้ไม่ได้ ที่ระบุอย่างชัดเจน แพ็กเกจ APK มีการลงชื่อกำกับ ซึ่งจะเขียนทับ ไฟล์ APK ที่ป้อน
--min-sdk-version <integer>
-
ระดับ API เฟรมเวิร์ก Android ต่ำสุดที่
apksigner
ใช้เพื่อ ให้ยืนยันว่าลายเซ็นของ APK จะได้รับการยืนยัน ค่าที่สูงขึ้นช่วยให้ เครื่องมือที่จะใช้พารามิเตอร์ความปลอดภัยที่เข้มงวดขึ้นเมื่อรับรองแอป แต่จำกัด ความพร้อมให้บริการของ APK สำหรับอุปกรณ์ที่ใช้ Android เวอร์ชันล่าสุด โดยค่าเริ่มต้นapksigner
จะใช้ค่าของพารามิเตอร์minSdkVersion
จากไฟล์ Manifest ของแอป --max-sdk-version <integer>
-
ระดับ API เฟรมเวิร์ก Android สูงสุดที่
apksigner
ใช้ เพื่อยืนยันว่าลายเซ็นของ APK จะได้รับการยืนยัน โดยค่าเริ่มต้น เครื่องมือ ใช้ระดับ API สูงสุดเท่าที่จะเป็นไปได้ --rotation-min-sdk-version <integer>
- ระดับ API ต่ำสุดที่หมุนเวียนการรับรองของ APK ควรใช้เพื่อสร้างลายเซ็นของ APK จะมีการใช้คีย์ Signing ดั้งเดิม (ไม่หมุน) สำหรับ APK ทั้งหมด เวอร์ชันก่อนๆ ของแพลตฟอร์ม โดยค่าเริ่มต้น คีย์การรับรองแบบหมุนเวียน ซึ่งรองรับในอุปกรณ์ที่ใช้ Android 13 (API ระดับ 33) ขึ้นไปจะใช้กับบล็อกการรับรองเวอร์ชัน 3.1
--v1-signing-enabled <true | false>
-
ระบุว่า
apksigner
ลงนามในแพ็กเกจ APK ที่กำหนดหรือไม่ โดยใช้แผนการลงนามแบบดั้งเดิมที่ใช้ JAR โดยค่าเริ่มต้น เครื่องมือจะใช้ ค่าของ--min-sdk-version
และ--max-sdk-version
เพื่อตัดสินใจว่าจะใช้ลายเซ็นนี้เมื่อใด สคีม --v2-signing-enabled <true | false>
-
ระบุว่า
apksigner
ลงนามในแพ็กเกจ APK ที่กำหนดหรือไม่ โดยใช้ APK Signature Scheme v2 โดยค่าเริ่มต้น เครื่องมือจะใช้ค่าของ--min-sdk-version
และ--max-sdk-version
จะตัดสินใจ เวลาที่ควรใช้รูปแบบลายเซ็นนี้ --v3-signing-enabled <true | false>
-
ระบุว่า
apksigner
ลงนามในแพ็กเกจ APK ที่กำหนดหรือไม่ โดยใช้ APK Signature Scheme v3 โดยค่าเริ่มต้น เครื่องมือจะใช้ค่าของ--min-sdk-version
และ--max-sdk-version
จะตัดสินใจ เวลาที่ควรใช้รูปแบบลายเซ็นนี้ --v4-signing-enabled <true | false | only>
-
ระบุว่า
apksigner
รับรองแพ็กเกจ APK ที่ระบุหรือไม่ โดยใช้ APK Signature Scheme v4 รูปแบบนี้ จะสร้างลายเซ็นในไฟล์แยกต่างหาก (apk-name.apk.idsig
) หากtrue
และ APK ไม่ได้ลงนาม จะใช้ลายเซ็น v2 หรือ v3 สร้างขึ้นตามค่าของ--min-sdk-version
และ--max-sdk-version
จากนั้นคำสั่งจะสร้าง.idsig
ไฟล์ตามเนื้อหาของ APK ที่ลงนามใช้
only
เพื่อสร้างเฉพาะ v4 ลายเซ็นโดยไม่แก้ไข APK และลายเซ็นใดๆ ที่มีก่อนการเรียกใช้only
ล้มเหลวหาก APK ไม่ มีลายเซ็น v2 หรือ v3 อยู่แล้ว หรือหากลายเซ็นใช้คีย์อื่น มากกว่าที่กำหนดไว้สำหรับการเรียกใช้ปัจจุบันโดยค่าเริ่มต้น เครื่องมือจะใช้ค่าของ
--min-sdk-version
และ--max-sdk-version
จะตัดสินใจ เวลาที่ควรใช้รูปแบบลายเซ็นนี้ -v
,--verbose
- ใช้โหมดเอาต์พุตแบบละเอียด
หมายเหตุ: หากแอปลงนามด้วยการรับรองแบบหมุนเวียน
ในอุปกรณ์ที่ใช้ Android 12L (API ระดับ 32) หรือต่ำกว่า คุณก็จะ
ต้องใช้ --rotation-min-sdk-version 28
เพื่อลงนามต่อ
แอปด้วยคีย์ Signing แบบหมุนเวียนสำหรับ Android 9 (API ระดับ 28)
ตัวเลือกต่อผู้ลงนาม
ตัวเลือกต่อไปนี้จะระบุการกำหนดค่าของผู้ลงนามแต่ละคน เหล่านี้ ตัวเลือกไม่จำเป็นหากคุณรับรองแอปโดยใช้ผู้ลงนามเพียง 1 รายเท่านั้น
--next-signer <signer-options>
- ใช้เพื่อระบุตัวเลือกทั่วไปต่างๆ สำหรับผู้ลงนามแต่ละคน
--v1-signer-name <basename>
-
ชื่อฐานสำหรับไฟล์ที่ประกอบด้วยลายเซ็นแบบ JAR สำหรับ
ผู้ลงนามปัจจุบัน โดยค่าเริ่มต้น
apksigner
จะใช้ชื่อแทนคีย์ของ KeyStore หรือชื่อพื้นฐานของไฟล์คีย์สำหรับผู้เซ็น
ตัวเลือกคีย์และใบรับรอง
ตัวเลือกต่อไปนี้ระบุคีย์ส่วนตัวและใบรับรองของผู้ลงนาม
--ks <filename>
-
คีย์ส่วนตัวและชุดใบรับรองของผู้ลงนามอยู่ใน
ไฟล์ KeyStore แบบ Java หากตั้งชื่อไฟล์เป็น
"NONE"
KeyStore ที่มีคีย์และใบรับรองไม่จำเป็นต้องใช้ไฟล์ ซึ่งเป็นกรณีสำหรับ KeyStore ของ PKCS #11 บางรายการ --ks-key-alias <alias>
- ชื่อของชื่อแทนที่แสดงถึงคีย์ส่วนตัวของผู้ลงนามและ ข้อมูลใบรับรองภายใน KeyStore หากคีย์สโตร์เชื่อมโยงกับ เครื่องมือลงนามมีคีย์หลายรายการ คุณต้องระบุตัวเลือกนี้
--ks-pass <input-format>
-
รหัสผ่านสำหรับ KeyStore ที่มีคีย์ส่วนตัวของผู้ลงนามและ ใบรับรอง คุณต้องระบุรหัสผ่านเพื่อเปิด KeyStore เครื่องมือ
apksigner
รองรับรูปแบบต่อไปนี้-
pass:<password>
– ป้อนรหัสผ่านในบรรทัด ด้วยคำสั่งapksigner sign
ที่เหลือ -
env:<name>
– รหัสผ่านจัดเก็บอยู่ใน ตัวแปรสภาพแวดล้อม -
file:<filename>
– รหัสผ่านจะจัดเก็บเป็น บรรทัดเดียวในไฟล์ที่กำหนด -
stdin
– รหัสผ่านจะแสดงเป็นบรรทัดเดียวใน สตรีมอินพุตมาตรฐาน นี่คือลักษณะการทำงานเริ่มต้นของ--ks-pass
หมายเหตุ: หากคุณใส่รหัสผ่านหลายรหัสเป็นรหัสเดียวกัน ให้ระบุไฟล์โดยแยกบรรทัดกัน เครื่องมือ
apksigner
เชื่อมโยงรหัสผ่านกับผู้ลงนาม APK ตามลำดับ ที่คุณจะระบุผู้ลงนาม หากคุณระบุรหัสผ่านไว้ 2 รหัสสำหรับผู้ลงนามapksigner
ตีความรหัสผ่านแรกเป็น KeyStore และรหัสผ่านที่ 2 เป็นรหัสผ่านหลัก -
--pass-encoding <charset>
-
รวมการเข้ารหัสอักขระที่ระบุ เช่น
ibm437
หรือutf-8
เมื่อพยายาม จัดการรหัสผ่านที่มีอักขระที่ไม่ใช่ ASCIIเครื่องมือคีย์มักจะเข้ารหัสคีย์สโตร์ด้วยการเปลี่ยนรหัสผ่านโดยใช้ค่าเริ่มต้นของคอนโซล ชุดอักขระ โดยค่าเริ่มต้น
apksigner
จะพยายามถอดรหัสโดยใช้ข้อมูลของ รหัสผ่าน:- แบบฟอร์ม Unicode
- แบบฟอร์มที่เข้ารหัสโดยใช้ชุดอักขระเริ่มต้น JVM
- ใน Java 8 และเก่ากว่า แบบฟอร์มจะเข้ารหัสโดยใช้ชุดอักขระเริ่มต้นของคอนโซล
ใน Java 9
apksigner
จะตรวจไม่พบชุดอักขระของคอนโซล คุณอาจต้องระบุ--pass-encoding
เมื่อ โดยใช้รหัสผ่านที่ไม่ใช่ ASCII นอกจากนี้ คุณอาจต้องระบุตัวเลือกนี้กับ KeyStore ที่ เครื่องมือคีย์ที่สร้างขึ้นบนระบบปฏิบัติการอื่นหรือในภาษาอื่น --key-pass <input-format>
-
รหัสผ่านสำหรับคีย์ส่วนตัวของผู้ลงนาม ซึ่งจำเป็นต้องใช้หาก คีย์ส่วนตัวมีการป้องกันด้วยรหัสผ่าน เครื่องมือ
apksigner
รองรับรูปแบบต่อไปนี้-
pass:<password>
– ป้อนรหัสผ่านในบรรทัด ด้วยคำสั่งapksigner sign
ที่เหลือ -
env:<name>
– รหัสผ่านจัดเก็บอยู่ใน ตัวแปรสภาพแวดล้อม -
file:<filename>
– รหัสผ่านจะจัดเก็บเป็น บรรทัดเดียวในไฟล์ที่กำหนด -
stdin
– รหัสผ่านจะแสดงเป็นบรรทัดเดียวใน สตรีมอินพุตมาตรฐาน นี่คือลักษณะการทำงานเริ่มต้นของ--key-pass
-
--ks-type <algorithm>
-
ประเภทหรืออัลกอริทึมที่เชื่อมโยงกับ KeyStore ซึ่งมี
คีย์ส่วนตัวและใบรับรองของผู้ลงนาม โดยค่าเริ่มต้นคือ
apksigner
ใช้ประเภทที่กำหนดไว้เป็นค่าคงที่keystore.type
ในฟังก์ชัน ไฟล์คุณสมบัติความปลอดภัย --ks-provider-name <name>
-
ชื่อผู้ให้บริการ JCA ที่จะใช้เมื่อขอ KeyStore ของผู้ลงนาม
การใช้งานของคุณ โดยค่าเริ่มต้น
apksigner
จะใช้เมธอด ผู้ให้บริการที่มีลำดับความสำคัญสูงสุด --ks-provider-class <class-name>
-
ชื่อคลาสที่มีคุณสมบัติครบถ้วนของผู้ให้บริการ JCA ที่จะใช้เมื่อส่งคำขอ
การติดตั้งใช้งาน KeyStore ของผู้ลงนาม ตัวเลือกนี้ใช้เป็นทางเลือก
ในราคา
--ks-provider-name
โดยค่าเริ่มต้นคือapksigner
ใช้ผู้ให้บริการที่ระบุด้วย--ks-provider-name
ตัวเลือก --ks-provider-arg <value>
-
ค่าสตริงที่จะส่งผ่านเป็นอาร์กิวเมนต์สำหรับเครื่องมือสร้างของ JCA
คลาสของผู้ให้บริการ ระบบจะกำหนดคลาสด้วย
--ks-provider-class
โดยค่าเริ่มต้นคือapksigner
ใช้ตัวสร้างอาร์กิวเมนต์ศูนย์ของคลาส --key <filename>
-
ชื่อไฟล์ที่มีคีย์ส่วนตัวของผู้ลงนาม ไฟล์นี้
ต้องใช้รูปแบบ PKCS #8 DER หากคีย์มีการป้องกันด้วยรหัสผ่าน
apksigner
แจ้งให้ป้อนรหัสผ่านโดยใช้อินพุตมาตรฐาน เว้นแต่คุณจะระบุรูปแบบอินพุตประเภทอื่นโดยใช้--key-pass
--cert <filename>
- ชื่อไฟล์ที่มีชุดใบรับรองของผู้ลงนาม ช่วงเวลานี้ ต้องใช้รูปแบบ X.509 PEM หรือ DER
ยืนยันคำสั่ง
คำสั่งยืนยัน apksigner
มีตัวเลือกต่อไปนี้
--print-certs
- แสดงข้อมูลเกี่ยวกับใบรับรองที่มีการรับรองของ APK
--min-sdk-version <integer>
-
ระดับ API เฟรมเวิร์ก Android ต่ำสุดที่
apksigner
ใช้เพื่อ ให้ยืนยันว่าลายเซ็นของ APK จะได้รับการยืนยัน ค่าที่สูงขึ้นช่วยให้ เครื่องมือที่จะใช้พารามิเตอร์ความปลอดภัยที่เข้มงวดขึ้นเมื่อรับรองแอป แต่จำกัด ความพร้อมให้บริการของ APK สำหรับอุปกรณ์ที่ใช้ Android เวอร์ชันล่าสุด โดยค่าเริ่มต้นapksigner
จะใช้ค่าของพารามิเตอร์minSdkVersion
จากไฟล์ Manifest ของแอป --max-sdk-version <integer>
-
ระดับ API เฟรมเวิร์ก Android สูงสุดที่
apksigner
ใช้ เพื่อยืนยันว่าลายเซ็นของ APK จะได้รับการยืนยัน โดยค่าเริ่มต้น เครื่องมือ ใช้ระดับ API สูงสุดเท่าที่จะเป็นไปได้ -v
,--verbose
- ใช้โหมดเอาต์พุตแบบละเอียด
-Werr
- ถือว่าคำเตือนเป็นข้อผิดพลาด
ตัวอย่าง
ตัวอย่างการใช้ apksigner
มีดังนี้
ลงนาม APK
ลงนาม APK โดยใช้ release.jks
ซึ่งเป็นคีย์เดียวใน
คีย์สโตร์:
$ apksigner sign --ks release.jks app.apk
ลงนาม APK โดยใช้คีย์ส่วนตัวและใบรับรองที่จัดเก็บเป็นไฟล์แยกกัน
$ apksigner sign --key release.pk8 --cert release.x509.pem app.apk
ลงนาม APK โดยใช้คีย์ 2 อัน ได้แก่
$ apksigner sign --ks first-release-key.jks --next-signer --ks second-release-key.jks app.apk
รับรอง APK ด้วยคีย์ Signing แบบหมุนเวียน และ SDK การกำหนดเป้าหมายการหมุนเวียนเวอร์ชัน 28 ขึ้นไป ดังนี้
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk \ --rotation-min-sdk-version 28
ลงนาม APK ด้วยคีย์ Signing แบบหมุนเวียน และ SDK การกำหนดเป้าหมายการหมุนเวียนเวอร์ชัน 33 ขึ้นไป:
$ apksigner sign --ks release.jks --next-signer --ks release2.jks \ --lineage /path/to/signing/history/lineage app.apk
ยืนยันลายเซ็นของ APK
ตรวจสอบว่าลายเซ็นของ APK ควรได้รับการยืนยันว่าถูกต้องหรือไม่ใน แพลตฟอร์ม Android ทั้งหมดที่ APK สนับสนุน ได้แก่
$ apksigner verify app.apk
ตรวจสอบว่าลายเซ็นของ APK ควรได้รับการยืนยันว่าถูกต้องหรือไม่ใน Android 4.0.3 (API ระดับ 15) ขึ้นไป
$ apksigner verify --min-sdk-version 15 app.apk
หมุนเวียนคีย์การรับรอง
เปิดใช้งานกลุ่มผู้รับใบรับรองที่มีการรับรองซึ่งรองรับการหมุนเวียนคีย์:
$ apksigner rotate --out /path/to/new/file --old-signer \ --ks release.jks --new-signer --ks release2.jks
หมุนเวียนคีย์การรับรองอีกครั้ง โดยทำดังนี้
$ apksigner rotate --in /path/to/existing/lineage \ --out /path/to/new/file --old-signer --ks release2.jks \ --new-signer --ks release3.jks