27 พฤษภาคม 2557

[Android Dev Tips] Debug Keystore และ Signed Keystore คืออะไร? ต่างกันอย่างไร?


        วันนี้ขอเป็นอีกเรื่องหนึ่งที่ไม่ค่อยจะมีใครเค้าพูดถึงกันอีกตามเคย โดยคราวนี้เป็นเรื่องของ Keystore ที่ผู้ที่หลงเข้ามาอ่านบางคนนั้นคุ้นเคยกันดี ซึ่งใช้ในเวลาที่ Export โปรเจคให้กลายเป็นไฟล์ APK ก่อนจะนำไปอัปโหลดขึ้น Google Play นั่นเอง


        แต่รู้หรือไม่ว่า Keystore นั้นแบ่งออกเป็นสองแบบคือ Debug Keystore กับ Signed Keystore ด้วยนะเออ.... แล้วมันต่างกันอย่างไรล่ะ?

        Keystore เป็นไฟล์ที่ใช้สำหรับ Export แอปพลิเคชัน โดยข้อมูลของ Keystore จะถูกบันทึกลงไปในไฟล์ APK หรือพูดแบบนิยามๆเลยก็จะเป็นไฟล์กุญแจที่ใช้ในเก็บการเข้ารหัสสำหรับ APK ที่ทำการ Export

        โดยที่แอปพลิเคชันบน Google Play จะมีการตรวจสอบ Keystore ดังกล่าว สมมติว่าถ้าผู้ที่หลงเข้ามาอ่านทำการอัปเดทแอปพลิเคชันเป็นเวอร์ชันใหม่ แต่ว่าไฟล์ APK ตัวที่เป็นเวอร์ชันใหม่ดันไปใช้ Keystore คนละตัวกัน ทาง Google Play ก็จะไม่ยอมให้อัปเดท เพราะถือว่า Keystore นั้นไม่ตรงกับของเดิม

        ก่อนจะเข้าใจวรายละเอียดของ Keystore อื่นต้องรู้เงื่อนไขของการติดตั้งแอปพลิเคชันลงบนอุปกรณ์แอนดรอยด์ใดๆก่อน ซึ่งจะมีเงื่อนไขว่า

        • การติดตั้งแอปพลิเคชันลงบนอุปกรณ์แอนดรอยด์นั้นจะต้องอยู่ในรูปของ APK เท่านั้น 

        ดังนั้นถ้าลองคิดดูให้ดีๆว่าตอนที่ผู้ที่หลงเข้ามาอ่านทดสอบแอปพลิเคชันบนอุปกรณ์แอนดรอยด์ก็จะต้อง Export ออกมาเป็น APK เช่นกัน

        อ้าว....ตอนทดสอบแอปพลิเคชันไม่เห็นจะต้อง Export อะไรเลย ที่ต้องทำก็แค่กด Run As.. เท่านั้นเอง มันก็ติดตั้งแอปพลิเคชันลงบนเครื่องจริงหรือ Emulator ให้แล้ว




        ซึ่งจริงๆแล้วโปรแกรมก็จะทำการ Export เป็นไฟล์ APK แล้วติดตั้งลงในอุปกรณ์แอนดรอยด์ให้นั่นแหละ แล้วก็ติดตั้งลงบนเครื่องจริงหรือ Emulator ผ่าน ADB Command โดยที่ผู้ที่หลงเข้ามาอ่านไม่ต้องไปนั่ง Export แล้วติดตั้งเอง

        ถ้างั้นก็เข้าเงื่อนไขที่สองต่อเลย

        • การ Export เป็นไฟล์ APK จะต้องใช้ Keystore เสมอ

        อ้าว!! ตอนที่ Export เป็นไฟล์ APK เพื่ออัปโหลดขึ้น Google Play ผู้ที่หลงเข้ามาอ่านจะต้องสร้าง Keystore เพื่อเอามาใช้ Export ก็จริง แต่ทว่าตอนกด Run As... เพื่อทดสอบการทำงานไม่เห็นต้องใช้ Keystore อะไรเลยนี่?

        เนื่องจากเป็นการทดสอบแอปพลิเคชัน ดังนั้นจึงไม่จำเป็นต้องใช้ Keystore ที่สร้างขึ้นมา แต่ทว่าทาง Android SDK ได้เตรียมไฟล์ Keystore สำหรับใช้ Export เพื่อทดสอบแอปพลิเคชันไว้แล้วนั่นเอง โดยมีชื่อว่า debug.keystore (คุ้นๆกันมั้ย) โดยจะอยู่ที่ C:\Users\{Username}\.android นั่นเอง (เจ้าของบล็อกใช้ Windows 8.1 ดังนั้นที่อยู่ของไฟล์อาจจะต่างกับเจ้าของบล็อกนะ)


        ซึ่งเจ้าไฟล์ตัวนี้จะถูกสร้างขึ้นมาตอนที่ Android SDK เริ่มทำงานในโปรแกรม Eclipse หรือ Android Studio นั่นเอง (ต่อให้ลบทิ้ง พอเปิดโปรแกรมใหม่มันก็จะสร้างไฟล์ตัวใหม่ขึ้นมาแทนที่)

        เมื่อใดที่ผู้ที่หลงเข้ามาอ่านกดติดตั้งแอปพลิเคชันลงบนอุปกรณ์แอนดรอยด์เพื่อทำการทดสอบ โปรแกรมก็จะทำการ Export เป็นไฟล์ APK โดยใช้ Keystore ตัวนี้นั่นเอง


        ดังนั้นจะมี Keystore อยู่ด้วยกันหลักๆสองตัวที่ผู้ที่หลงเข้ามาอ่านจะใช้งานกัน โดยตัวแรกคือ debug.keystore ซึ่งนี่แหละที่เรียกกันว่า Debug Keystore เป็น Keystore ที่เอาไว้ Export ตอนทดสอบ (Debug) แอปพลิเคชันเท่านั้น ส่วน Keystore อีกตัวก็คือตัวที่ผู้ที่หลงเข้ามาอ่านจะต้องสร้างขึ้นมาเพื่อใช้ Export เป็นไฟล์ APK สำหรับนำไปอัปโหลดขึ้น Google Play ซึ่งเรียกกันว่า Signed Keystore 

        ซึ่ง Keystore ทั้งสองแบบนี้มีความแตกต่างกัน และ Keystore ทุกตัวที่ถูกสร้างขึ้นมาไม่ว่าจะเป็น Signed Keystore หรือ Debug Keystore จะไม่เหมือนกัน (เว้นแต่ว่าก๊อปไฟล์ Keystore ไปใช้) ดังนั้น debug.keystore บนคอมสองเครื่องก็จะเป็นคนละตัวกัน และนอกจากนี้ Keystore ยังสามารถตรวจสอบได้อีกด้วยว่าอันไหนเป็น Debug Keystore กับ Signed Keystore ดังนั้นจึงไม่มีทางเอาไฟล์ APK ที่ Export จาก Debug Keystore ไปอัปโหลดขึ้น Google Play ได้


        Keystore แต่ละตัวต่างกันแล้วมีผลยังไงล่ะ?
     
        ให้นึกภาพในเวลาที่ผู้ที่หลงเข้ามาอ่านใช้งาน Google Maps Android API V2 ซึ่งทาง Google กำหนดไว้ว่าผู้ที่หลงเข้ามาอ่านจะต้องไปดึงรหัส SHA1 ที่อยู่ใน Keystore เพื่อนำไปกรอกในเว็ปเพื่อขอรหัสในการใช้งาน Google Maps แต่เนื่องจากว่า Keystore แต่ละตัวนั้นไม่เหมือนกัน (เว้นแต่ว่าก๊อปไฟล์มาใช้) รหัส SHA1 นั้นจึงไม่เหมือนกัน และแอปพลิเคชันที่ใช้ Google Maps ก็จะเช็ค SHA1 Keystore ที่ใช้ Export แอปพลิเคชันตัวนั้นๆ แล้วเทียบกับที่กรอกลงในเว็ปว่าตรงกันหรือไม่



        ดังนั้นสมมติว่าผู้ที่หลงเข้ามาอ่านใช้รหัส SHA1 ของ debug.keystore เพื่อลองเขียนแอปพลิเคชันที่ใช้ Google Maps ดู แล้วเกิดคอมพิวเตอร์พังขึ้นมาต้องลงวินโดว์ใหม่ อย่าลืมว่า debug.keystore ก็จะหายไปเช่นกัน (เพราะ C:/ โดนลบทิ้งเรียบร้อย) ดังนั้นเมื่อลงโปรแกรมใหม่แล้วเปิดขึ้นมา Android SDK ก็จะทำการสร้าง debug.keystore ตัวใหม่ขึ้นมา ซึ่งจะมี SHA1 ไม่เหมือนเดิมนั่นเอง (เพราะมันคนละตัวกัน) ดังนั้นจึงทำให้หลังจากลงวินโดว์ใหม่แล้วลองทดสอบแอปพลิเคชันตัวเดิมอีกครั้ง กลายเป็นว่าไม่ทำงานซะงั้น ทั้งนี้ก็เพราะ SHA1 ไม่เหมือนเดิมนั่นเอง ทำให้ต้องไปอัปเดทรหัส SHA1 ในหน้าเว็ปเสียใหม่

        และอย่าลืมว่าเมื่อ Export เป็นไฟล์ APK ด้วย Signed Keystore แล้วต้องไปอัปเดทรหัส SHA1 ซะด้วยนะ (ในเว็ปสามารถใช้รหัส SHA1 ได้มากกว่าหนึ่งอัน จึงสามารถใส่เผื่อไว้ทั้ง Debug Keystore และ Signed Keystore ได้) เพราะมีผู้ที่หลงเข้ามาอ่านหลายๆคนเจอปัญหาเมื่อ Export ด้วย Signed Keystore แล้ว Google Maps ทำงานไม่ได้ เนื่องจากไม่รู้ว่า Keystore ที่ใช้เป็นคนละตัวกับตอนทดสอบนั่นเอง


        อ๊ะๆ เริ่มมึนๆ เดี๋ยวก็ Signed Keystore เดี๋ยวก็ Debug Keystore เยอะแยะไปหมดอ่านเยอะๆแล้วเริ่มจะมึนๆล่ะสิ ถ้างั้นเข้าสู่โค๊ดสั้นๆเกี่ยวกับ Keystore ซักหน่อย  เป็นโค๊ดสำหรับตรวจสอบว่าแอปพลิเคชันที่กำลังทำงานอยู่นี้ Export มาจาก Signed Keystore หรือว่า Debug Keystore
boolean isDebugKeystore = BuildConfig.DEBUG;

        คำสั่งนี้จะใช้เมื่อไรก็ได้ โดยค่าที่ได้จะเป็น Boolean ถ้าค่าเป็น True ก็หมายความว่าแอปพลิเคชันนี้ Export จาก Debug Keystore แต่ถ้าค่าเป็น False ก็หมายความว่ามาจาก Signed Keystore นั่นเอง


เพิ่มเติมความรู้

        • Signed Keystore สร้างขึ้นมาอันเดียวก็พอ เพราะสามารถใช้ Export สำหรับแอปพลิเคชันกี่ตัวก้ได้ ไม่จำเป็นต้องสร้าง Keystore หลายๆอันนะ



        • เมื่อ Export ด้วย Debug Keystore หรือกด Run As... ไฟล์ที่ได้จากการ Export จะอยู่ในโฟลเดอร์ bin ของโปรเจคนั้นๆ หรือก็คือไฟล์ APK ที่บางคนก๊อปไปลงในเครื่องหรือเข้าใจผิดนำไปอัปโหลดขึ้น Google Play นั่นเอง (แล้ว Google Play ก็จะแจ้งกลับมาว่าใช้ไม่ได้เพราะไม่ใช่ Signed Keystore)


        ภาพตัวอย่างนี้แอปพลิเคชันชื่อว่า Keystore ดังนั้นเวลา Export ออกมาก็จะมีชื่อไฟล์เป็น Keystore.apk


        • ผู้ที่หลงเข้ามาอ่านสามารถใช้ Debug Keystore ของตนเองที่มีอยู่แล้วก็ได้เช่นกัน โดยกำหนดที่ Preference ของโปรแกรม โดยจะอยู่ใน Android > Build (ย้ำว่าต้องเป็น Debug Keystore นะ) และนอกจากนี้ยังสามารถดูรหัส SHA1 และ MD5 ของ debug.keystore ได้จากหน้านี้อีกด้วยล่ะ!



        • Signed Keystore นั้นมีค่า อย่ากินทิ้งกินขว้าง เอ้ย!! ไม่ใช่แล้ว!! จงอย่าทำหาย จงเก็บไว้ให้ดี เพราะถ้าทำหายไปเมื่อไรละก็ จะไม่สามารถอัปเดทแอปพลิเคชันที่เคยอัปโหลดขึ้น Google Play ได้ เพราะมันจะให้ใช้ Signed Keystore ของตัวเดิมที่เคยอัปโหลดไปในเวอร์ชันแรกสุด (แต่ถ้าหายก่อนจะอัปโหลดขึ้นไปก็ไม่ต้องห่วง สร้างอันใหม่แล้ว Export ด้วยอันใหม่แทน)

        ดังนั้นจะสำรองไฟล์ไว้หลายชุดก็ดี หรือจะเก็บไว้บน Cloud ก็ได้ แต่ที่สำคัญอีกอย่างก็คือ อย่าลืมรหัสผ่านของ Alias Name ของ Keystore ซะล่ะ!!



        • จริงๆมีคลาส Keystore ด้วยแหละ แต่ว่าไม่ค่อยได้ใช้อยู่แล้ว ก็เลยไม่ขออธิบายนะ แต่ถ้าสนใจก็ลองเข้าไปดู Reference ของคลาสตัวนี้ได้ที่ KeyStore [Android Developer]




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium