เหตุใดไฟล์ APK จึงต้องมีการลงนาม?
แอป Android ทุกแอปต้องมีการเซ็นชื่อแบบดิจิทัลก่อนจึงจะสามารถติดตั้งได้ ลายเซ็นมีจุดประสงค์หลายประการ:
- ตรวจสอบตัวตนของนักพัฒนาแอป
- ตรวจสอบให้แน่ใจว่า APK ไม่ได้ถูกดัดแปลง
- อนุญาตให้ Android จับคู่การอัปเดตแอปกับเวอร์ชันดั้งเดิม
- จำเป็นสำหรับการติดตั้งบนอุปกรณ์ Android ทั้งหมด
ต้องมีเครื่องมือเดสก์ท็อป
การลงนาม APK ต้องใช้เครื่องมือบรรทัดคำสั่ง (JDK / Android SDK) สิ่งนี้ไม่สามารถทำได้ในเว็บเบราว์เซอร์ ทำตามคำแนะนำด้านล่างเพื่อลงนาม APK บนคอมพิวเตอร์ของคุณ
วิธีที่ 1: ลงชื่อด้วย apksigner (แนะนำ)
apksigner เป็นเครื่องมือลงนาม APK อย่างเป็นทางการของ Google ซึ่งรวมอยู่ใน Android SDK Build Tools
ขั้นตอนที่ 1: สร้างที่เก็บคีย์
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
ขั้นตอนที่ 2: ลงนาม APK
apksigner sign --ks my-release-key.jks \
--ks-key-alias my-key-alias \
--out signed-app.apk unsigned-app.apk
ขั้นตอนที่ 3: ตรวจสอบลายเซ็น
apksigner verify --verbose signed-app.apk
วิธีที่ 2: ลงชื่อด้วย jarsigner (Legacy)
# Sign
jarsigner -verbose -sigalg SHA256withRSA \
-digestalg SHA-256 \
-keystore my-release-key.jks \
app-unsigned.apk my-key-alias
# Verify
jarsigner -verify -verbose app-signed.apk
ขั้นตอนที่ 4: Zipalign (สำคัญ!)
หลังจากลงนามแล้ว ให้เพิ่มประสิทธิภาพ APK ด้วย zipalign:
zipalign -v 4 signed-app.apk aligned-app.apk
การลงนามการแก้ไขข้อบกพร่อง (สำหรับการทดสอบ)
เพื่อวัตถุประสงค์ในการทดสอบ คุณสามารถใช้ที่เก็บคีย์ดีบัก Android เริ่มต้นได้:
# Location of debug keystore:
# Linux/Mac: ~/.android/debug.keystore
# Windows: C:\Users\{USERNAME}\.android\debug.keystore
# Sign with debug key
apksigner sign --ks ~/.android/debug.keystore \
--ks-key-alias androiddebugkey \
--ks-pass pass:android \
app.apk
การเปรียบเทียบเครื่องมือการลงนาม
| เกณฑ์ | apksigner | จาร์ซิกเนอร์ |
|---|---|---|
| ลายเซ็น V1 | ||
| ลายเซ็น V2 | ||
| ลายเซ็น V3 | ||
| ที่แนะนำ | มรดก |
ผู้ลงนาม APK — คำถามที่พบบ่อย
คำถามทั่วไปเกี่ยวกับการลงนาม APK, ที่เก็บคีย์ และการลงนามโค้ด Android
เหตุใดการจัดตำแหน่ง (zipalign ก่อน apksigner) จึงมีความสำคัญใน Android 11–15
หนึ่งในข้อผิดพลาดที่พบบ่อยที่สุดที่นักพัฒนาและ modder เกิดขึ้นเมื่อลงนาม APK ที่แก้ไขหรือรวมเข้าด้วยกัน คือ การเรียกใช้ zipalign หลังจาก ในการลงนามแพ็คเกจ หรือใช้ยูทิลิตี้ jarsigner ดั้งเดิมของ Java แทน Android SDK apksigner ของ Google เนื่องจาก APK Signature Scheme v2 และ v3 คำนวณแฮชที่เข้ารหัสบนรูปแบบไบนารีทั้งหมดของไฟล์ ZIP การแก้ไขการชดเชยไบต์ด้วย zipalign หลังจากการลงนามจะทำให้บล็อกลายเซ็น v2/v3 เป็นโมฆะทันที
ตั้งแต่ Android 11 (API ระดับ 30) เป็นต้นไป และบังคับใช้กับ Android 14 และ 15 อย่างเคร่งครัด PackageManager กำหนดให้มีเงื่อนไขที่ไม่สามารถต่อรองได้ 2 ข้อสำหรับ APK ใดๆ ที่กำหนดเป้าหมายระดับ SDK สมัยใหม่:
- resources.arsc แบบ 4 ไบต์ที่ไม่มีการบีบอัด: ตารางทรัพยากรที่คอมไพล์แล้ว (resources.arsc) จะต้องจัดเก็บโดยไม่มีการบีบอัด (STORED) และจัดแนวบนขอบเขต 4 ไบต์เพื่อให้ Android สามารถแมปหน่วยความจำ (mmap) ได้โดยตรงโดยไม่ต้องคัดลอกลงใน RAM ดำเนินการลงนาม zipalign -p -f -v 4 input.apk aligned.apk ก่อน เสมอ
- บล็อกลายเซ็นบังคับ v2+: การลงนาม APK ที่กำหนดเป้าหมาย API 30+ ด้วย jarsigner (ซึ่งเขียนเฉพาะลายเซ็น v1 META-INF/) จะทำให้ Android 11–15 ปฏิเสธการติดตั้งด้วย INSTALL_PARSE_FAILED_NO_CERTIFICATES ใช้ตัวสร้างคำสั่งแบบโต้ตอบด้านบนเพื่อสร้างคำสั่ง apksigner --v2-signing-enabled=true ที่แน่นอนสำหรับที่เก็บคีย์ของคุณ หรือตรวจสอบเอาต์พุตที่ลงนามของคุณใน เครื่องมือตรวจสอบลายเซ็น APK ของเรา