-

@ minseo
2025-02-19 12:29:20
ชาว Android Developer หลายคนอาจจะเคยมางาน Android Bangkok 2025 แล้วได้ฟัง session พี่เอก ที่ชื่อว่า [“Why App Signing Matters for Your Android Apps”](https://www.mikkipastel.com/android-bangkok-conference-2024/#why-app-signing-matters-for-your-android-apps-somkiat-khitwongwattana-%E2%80%93-gde-android) แล้วอยากตรวจ APK Signature Scheme ของแอพเราเองบ้าง จริง ๆ มันตรวจง่ายมาก ๆ เลย ทุกคนทำตามได้แน่นอน

ก่อนอื่นขออธิบาย APK Signature Scheme กันก่อน มันคือ script การยืนยันตัวตน และ code ข้างในยังเป็นเหมือนเดิม แบ่งจากการทำ signing
- v1 scheme: รองรับ Android ทุก version และรองรับแค่ java code แต่ไม่ครอบคลุม resource เพราะว่าถ้า resource เปลี่ยน แต่ signature เหมือนเดิม ดังนั้นไม่แนะนำให้ใช้ เนื่องจากเรื่องความปลอดภัย และ performance → APK Signature Scheme v1
- v2+ Scheme: ครอบคลุมทุกไฟล์ เป็นการแทรก APK Signing block เข้าไป → APK Signature Scheme v2, v3, v3.1, v4
วิธีการตรวจแบบง่ายมาก ๆ แบบไม่ต้องไปลงอะไรเพิ่ม คือใช้ apksigner เป็นหนึ่งใน Android SDK command line tool ที่มีมาตั้งแต่ version 24.0.3 ที่เอาไว้ sign apk, ตรวจสอบ apk ของเรา รวมไปถึง rotate key ด้วย
ในที่นี้เราใช้ verify command เพื่อดูรายละเอียด apk ของเรากัน หน้าตาตัว command เป็นแบบนี้
```
apksigner version [option] app-name.apk
```
ก่อนอื่น หา path ของเจ้า apksigner ซึ่งทางเราใช้ macbook ดังนั้นมันจะไปอยู่ path หน้าตาแบบนี้
```
/Users/{username}/Library/Android/sdk/build-tools/{version}/apksigner
```
เอาเจ้า path นี้ไปแทนที่ apksigner ทำให้เราเรียกตัว cmd นี้จากที่ไหนก็ได้ อย่างทำงานที่บ้าน เอ้ยไม่ใช่ อย่างเราเปิดหน้า terminal บน Android Studio ก็แปะอันนี้ได้เลย ไม่ต้องไปที่ path ที่อยู่ของ apksigner โดยตรง
จากนั้นเตรียมไฟล์ apk ที่เป็น build release มานะ ไม่งั้นมันจะ check ไม่ได้เน้อ
ต่อมามาใช้คำสั่งนี้กัน
```
apksigner verify --print-certs -v app-name.apk
```
อธิบายแต่ละ option กันก่อนเลย
- --print-certs: บอกข้อมูลพวก certificate, algorithm ในการ sign และ public key
- -v: แอพเราตอนนี้ signing signature scheme version อะไร
ไม่ยากเลยใช่ไหม
ถ้าเพื่อน ๆ ไม่อยากใช้ v1 แล้ว อยากใช้อันอื่น สามารถใส่ประมาณนี้ที่ build.gradle ที่ module app
```
android {
...
signingConfigs {
release {
v1SigningEnabled false
enableV2Signing true
enableV3Signing true
enableV4Signing true
}
}
}
```
หวังว่าจะเป็นประโยชน์กับชาว #siamstr น้า