วิธีลงนาม Apk ที่รวบรวมไว้แล้ว


121

ฉันได้ถอดรหัส APK ด้วย apktool แล้ว (เนื่องจากซอร์สโค้ดเดิมหายไป) ดังนั้นฉันจึงสามารถแก้ไขปัญหาบางอย่างกับไฟล์ xml เลย์เอาต์ได้ จากนั้นฉันได้สร้างมันขึ้นมาใหม่ด้วย apktool และเมื่อฉันพยายามติดตั้งบนอุปกรณ์ของฉัน (โดยใช้ adb: adb install appname.apk) มันทำให้ฉันเกิดข้อผิดพลาดนี้:

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

แต่ apk ดั้งเดิมได้รับการลงนามโดยที่เก็บคีย์ (บน eclipse IDE) อันนี้ไม่ใช่ฉันจะเซ็นชื่ออย่างถูกต้องด้วยไฟล์คีย์สโตนดั้งเดิมนอก Eclipse ได้อย่างไร!?


ใช่จุดรวมของใบรับรองคือการหยุดผู้คนจากการทำเช่นนี้ ... ถ้าคุณไม่ได้มีใบรับรองเดิมคุณ gonna มีการงอกใหม่หนึ่ง
edthethird

นั่นเป็นเพียงแค่ฉันมีใบรับรองดั้งเดิม แต่การถอดรหัส / สร้าง apk ใหม่ลบออก
svarog

คำตอบ:


286

สร้างคีย์โดยใช้

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

จากนั้นลงนาม apk โดยใช้:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

ตรวจสอบที่นี่สำหรับข้อมูลเพิ่มเติม


11
นี่น่าจะเป็นคำตอบ 27 โหวตกับ 3 สำหรับคำตอบเดิมมาเลย!
Kyle

1
หากคุณทำเช่นนี้และพยายามติดตั้ง APK คุณอาจพบข้อผิดพลาด INSTALL_FAILED_DUPLICATE_PERMISSION สิ่งนี้เกิดขึ้นเมื่อไม่สามารถเขียนทับ APK ดั้งเดิมได้ (เช่นระบบหรือแอปในตัว)
Couitchy

@Couitchy adb shell pm install -r /data/tmp/myapk.apk
Dr Deo

14
หากคุณไม่ต้องการรบกวนการสร้างคีย์คุณสามารถใช้คีย์ดีบักกับ: jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~ ​​/ .android / debug.keystore app.apk androiddebugkey -storepass android
เม็ด

3
มีความแตกต่างระหว่างการใช้jarsignerและapksigner? หนึ่งต้องมีการลงนามจากนั้น zipaligning และ zipaligning อื่น ๆ แล้วจึงลงชื่อเข้าใช้
Maria Ines Parnisari

73

กระบวนการอัตโนมัติ:

ใช้เครื่องมือนี้ (ใช้ apksigner ใหม่จาก Google):

https://github.com/patrickfav/uber-apk-signer

คำเตือน: ฉันเป็นผู้พัฒนา :)

กระบวนการด้วยตนเอง:

ขั้นตอนที่ 1: สร้าง Keystore (เพียงครั้งเดียว)

คุณต้องสร้างที่เก็บคีย์หนึ่งครั้งและใช้เพื่อลงนามunsignedapk ของคุณ ใช้สิ่งที่จัดเตรียมโดย JDK ที่พบในkeytool %JAVA_HOME%/bin/

keytool -genkey -v -keystore my.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias app

ขั้นตอนที่ 2 หรือ 4: Zipalign

zipalign ซึ่งเป็นเครื่องมือที่จัดเตรียมโดย Android SDK ที่พบในเช่น%ANDROID_HOME%/sdk/build-tools/24.0.2/เป็นขั้นตอนการเพิ่มประสิทธิภาพที่จำเป็นหากคุณต้องการอัปโหลด apk ไปยัง Play Store

zipalign -p 4 my.apk my-aligned.apk

หมายเหตุ:เมื่อใช้แบบเก่าjarsignerคุณจำเป็นต้อง zipalign หลังจากเซ็นชื่อ เมื่อใช้apksignerวิธีการใหม่ที่คุณทำก่อนเซ็นชื่อ (ฉันรู้ว่าสับสน) การเรียกใช้ zipalign ก่อน apksigner จะทำงานได้ดีเนื่องจาก apksigner รักษาการจัดแนวและการบีบอัด APK ไว้ (ไม่เหมือนกับ jarsigner)

คุณสามารถตรวจสอบการจัดตำแหน่งด้วย

zipalign -c 4 my-aligned.apk

ขั้นตอนที่ 3: ลงชื่อและยืนยัน

ใช้ build-tools 24.0.2 และเก่ากว่า

ใช้jarsignerซึ่งเช่นเดียวกับเครื่องมือที่มาพร้อมกับการกระจาย JDK ที่พบ %JAVA_HOME%/bin/และใช้ในลักษณะนี้:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my.keystore my-app.apk my_alias_name

และสามารถตรวจสอบได้ด้วย

jarsigner -verify -verbose my_application.apk

ใช้ build-tools 24.0.3 และใหม่กว่า

Android 7.0 แนะนำ APK Signature Scheme v2 ซึ่งเป็นรูปแบบการลงนามแอปใหม่ที่ให้เวลาในการติดตั้งแอปเร็วขึ้นและการป้องกันที่มากขึ้นจากการแก้ไขไฟล์ APK โดยไม่ได้รับอนุญาต (ดูรายละเอียดเพิ่มเติมที่นี่และที่นี่ ) ดังนั้น Google จึงใช้ผู้ลงนาม apk ของตนเองที่เรียกว่าapksigner (duh!) ไฟล์สคริปต์สามารถพบได้ใน%ANDROID_HOME%/sdk/build-tools/24.0.3/(. jar อยู่ใน/libโฟลเดอร์ย่อย) ใช้แบบนี้ครับ

apksigner sign --ks my.keystore my-app.apk --ks-key-alias alias_name

และสามารถตรวจสอบได้ด้วย

apksigner verify my-app.apk

ดูเอกสารอย่างเป็นทางการได้ที่นี่


6
ขอบคุณสำหรับ uber-apk-signer! เครื่องมือที่ยอดเยี่ยม!
cantoni

2
สำหรับ build-tools 24.0.3 วิธีเรียก zipalign ที่ถูกต้องคือ zipalign -p 4 my.apk my-aligned.apk
kinORn Nirvana

ขอบคุณสำหรับคำอธิบาย! ลองใช้ uber-apk-signer ก่อน แต่ล้มเหลวอาจเป็นเพราะฉันติดตั้ง openJDK ในระบบของฉันแทนที่จะเป็น oracles "official" java ดังนั้นฉันจึงลองใช้วิธีแบบแมนนวล แต่ก็ล้มเหลว (ยังคงมีข้อผิดพลาดเหมือนเดิม[INSTALL_PARSE_FAILED_NO_CERTIFICATES]) การตรวจสอบกับ Uber-apk ลงนามให้ฉันลึกบางsignature VERIFY FAILED[ ... ERROR: JAR signer CERT.RSA: JAR signature META-INF/CERT.RSA uses digest algorithm 2.16.840.1.101.3.4.2.1 and signature algorithm 1.2.840.113549.1.1.1 which is not supported on API Levels [[15, 17]]] ใช่ Android 4.2.2, SHA256 ไม่มีใช่หรือไม่ ความคิด?
antiplex

@antiplex โปรดรายงานปัญหาใน github ไม่ใช่ SO
Patrick Favre

@ for3st คุณหมายความว่าปัญหาของฉันอาจไม่ได้เกิดจากความรู้ที่ จำกัด ของฉันเกี่ยวกับการลงนาม apk แต่เนื่องจาก uber-apk-signer เข้ากันไม่ได้บางรูปแบบ? แต่ถึงอย่างนั้นวิธีด้วยตนเองก็ล้มเหลวซึ่งดูเหมือนไม่เกี่ยวข้องกับเครื่องมือของคุณ ...
antiplex

14

วิธีที่เร็วที่สุดคือการเซ็นชื่อกับที่เก็บคีย์การดีบัก:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/.android/debug.keystore app.apk androiddebugkey -storepass android

หรือบน Windows:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore %USERPROFILE%/.android/debug.keystore test.apk androiddebugkey -storepass android

6

คุณใช้ jarsigner เพื่อลงนาม APK ของ คุณไม่จำเป็นต้องลงชื่อกับที่เก็บคีย์เดิมเพียงแค่สร้างที่เก็บคีย์ใหม่ อ่านรายละเอียดเพิ่มเติม: http://developer.android.com/guide/publishing/app-signing.html


1
ลิงก์เสีย
jayatubi

4

สำหรับพวกคุณที่ไม่ต้องการสร้างไฟล์ bat เพื่อแก้ไขสำหรับทุกโปรเจ็กต์หรือไม่ต้องการจำคำสั่งทั้งหมดที่เกี่ยวข้องกับโปรแกรม keytools และ jarsigner และเพียงแค่ต้องการทำให้เสร็จในกระบวนการเดียวให้ใช้โปรแกรมนี้:

http://lukealderton.com/projects/programs/android-apk-signer-aligner.aspx

ฉันสร้างมันขึ้นมาเพราะฉันเบื่อกับกระบวนการที่ยาวนานในการต้องพิมพ์ตำแหน่งไฟล์ทั้งหมดทุกครั้ง

โปรแกรมนี้สามารถบันทึกการกำหนดค่าของคุณได้ดังนั้นในครั้งต่อไปที่คุณเริ่มต้นคุณเพียงแค่กดสร้างมันจะจัดการให้คุณ แค่นั้นแหละ.

ไม่จำเป็นต้องติดตั้งมันพกพาได้อย่างสมบูรณ์และบันทึกการกำหนดค่าใน CSV ในโฟลเดอร์เดียวกัน


4

คำตอบที่อัปเดต

ตรวจสอบhttps://shatter-box.com/knowledgebase/android-apk-signing-tool-apk-signer/

คำตอบเก่า

ตรวจสอบผู้ลงนาม apkเป็นวิธีที่ดีในการลงนามแอปของคุณ


1
ถูกต้องที่สุดเพราะเป็นกระทู้เก่าคุณสามารถดูได้ที่นี่shatter-box.com/knowledgebase/…
shereifhawary
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.