หน้านี้อธิบายวิธีแก้ปัญหาที่อาจพบขณะพัฒนาเกม Android ด้วยบริการเกมของ Google Play
การบันทึก
หากต้องการแก้ปัญหาเกี่ยวกับเกม คุณสามารถเปิดการบันทึกแบบละเอียดในอุปกรณ์ได้โดยใช้คำสั่ง adb shell จากนั้นคุณจะดูข้อความในบันทึกของบริการเกมของ Google Play ได้โดยใช้ Logcat
เปิดใช้การบันทึก
วิธีเปิดใช้การบันทึกในอุปกรณ์ทดสอบ
- เชื่อมต่ออุปกรณ์กับเครื่องที่ติดตั้ง Android SDK 
- เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งนี้ - adb shell setprop log.tag.Games VERBOSE 
- เรียกใช้เกมในอุปกรณ์และจำลองปัญหาที่คุณพยายามแก้ไขข้อบกพร่อง 
- ดูบันทึก - adb logcat 
ปิดใช้การบันทึก
หากต้องการปิดใช้การบันทึกแบบละเอียดสำหรับบริการเกมของ Play ในอุปกรณ์และย้อนกลับไปใช้ลักษณะการทำงานของการบันทึกเดิม ให้เรียกใช้คำสั่งต่อไปนี้
adb shell setprop log.tag.Games INFO
ไม่สามารถลงชื่อเข้าใช้
หากลงชื่อเข้าใช้เกมให้ผู้เล่นไม่ได้ ก่อนอื่นให้ตรวจสอบว่าคุณได้ทำตามวิธีการเพื่อสร้างรหัสไคลเอ็นต์และกำหนดค่าบริการเกมแล้ว หากยังพบข้อผิดพลาดในการลงชื่อเข้าใช้ ให้ตรวจสอบรายการต่อไปนี้เพื่อให้แน่ใจว่าเกมของคุณได้รับการตั้งค่าอย่างถูกต้อง
ตรวจสอบแท็กข้อมูลเมตา
AndroidManifest.xml ต้องมีแท็กข้อมูลเมตาของเกม วิธียืนยันว่าตั้งค่าแท็กข้อมูลเมตาอย่างถูกต้องแล้วมีดังนี้
- เปิด - AndroidManifest.xmlและตรวจสอบว่ามีแท็ก- meta-dataดังที่แสดงด้านล่าง- <meta-data android:name="com.google.android.gms.games.APP_ID" android:value="@string/app_id" />
- ค้นหาคำจำกัดความของทรัพยากร - @string/app_idโดยปกติแล้วจะกำหนดไว้ในไฟล์ XML ซึ่งอยู่ในไดเรกทอรี- res/xmlเช่น- res/xml/strings.xmlหรือ- res/xml/ids.xml
- ตรวจสอบว่าค่าของทรัพยากร - @string/app_idตรงกับรหัสตัวเลขของแอปพลิเคชัน ค่าของทรัพยากรนี้ควรมีเฉพาะตัวเลขเท่านั้น เช่น- <string name="app_id">123456789012</string>
ตรวจสอบชื่อแพ็กเกจ
ชื่อแพ็กเกจของเกมต้องตรงกับชื่อแพ็กเกจในรหัสไคลเอ็นต์ วิธียืนยันชื่อแพ็กเกจ
- เปิด - AndroidManifest.xmlแล้วตรวจสอบว่าชื่อแพ็กเกจของเกมถูกต้อง ชื่อแพ็กเกจคือค่าของแอตทริบิวต์- packageในแท็ก- manifest
- ยืนยันชื่อแพ็กเกจที่คุณระบุเมื่อสร้างรหัสไคลเอ็นต์ หากต้องการยืนยันชื่อแพ็กเกจใน Google Play Console ให้ไปที่ Play Console แล้วคลิกรายการที่สอดคล้องกับเกมของคุณ 
- ไปที่แท็บแอปที่เชื่อมโยง แล้วตรวจสอบรายการรหัสไคลเอ็นต์ ควรมีแอป Android ที่เชื่อมโยงอยู่ในรายการนี้ซึ่งมีชื่อแพ็กเกจตรงกับชื่อแพ็กเกจใน - AndroidManifest.xmlหากไม่ตรงกัน ให้สร้าง Client ID ใหม่ที่มีชื่อแพ็กเกจที่ถูกต้อง แล้วลองลงชื่อเข้าใช้อีกครั้ง
ตรวจสอบลายนิ้วมือของใบรับรอง
ใบรับรองที่คุณใช้ลงนามในเกมควรตรงกับลายนิ้วมือของใบรับรองที่เชื่อมโยงกับรหัสไคลเอ็นต์ หากต้องการยืนยัน ให้ตรวจสอบลายนิ้วมือ SHA1 ของใบรับรองดังนี้
- ค้นหาไฟล์ใบรับรองและรับลายนิ้วมือ SHA1 หากต้องการรับลายนิ้วมือ SHA1 ให้เรียกใช้คำสั่งนี้ - keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
- จดลำดับของตัวเลขฐาน 16 ที่มีป้ายกำกับ - SHA1:ในเอาต์พุต นั่นคือลายนิ้วมือของใบรับรอง
จากนั้นตรวจสอบว่าเครื่องมือบิลด์ใช้ใบรับรองนี้หรือไม่ โดยทำดังนี้
- สร้าง APK ของเกมจากเครื่องมือบิลด์และลงนามด้วยใบรับรองที่ต้องการ คัดลอก APK ที่สร้างขึ้นไปยังไดเรกทอรีชั่วคราว
- ในไดเรกทอรีชั่วคราว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อแตกไฟล์ APK - unzip YourGame.apk
- สร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง RSA - keytool -printcert -file META-INF/CERT.RSA- หรือจะสร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง DSA ก็ได้ โดยทำดังนี้ - keytool -printcert -file META-INF/CERT.DSA
- จดลำดับของตัวเลขฐาน 16 ในบรรทัดที่มีป้ายกำกับ - SHA1:- ลำดับตัวเลขนี้ควรตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า หากไม่ตรงกัน แสดงว่าเครื่องมือบิลด์หรือระบบไม่ได้รับการกำหนดค่าให้ลงนามในแอปพลิเคชันด้วยใบรับรอง ในกรณีนี้ โปรดดูเอกสารประกอบของสภาพแวดล้อมของบิลด์ เพื่อดูวิธีกำหนดค่าอย่างถูกต้อง แล้วลองลงชื่อเข้าใช้อีกครั้ง 
จากนั้นตรวจสอบว่าลายนิ้วมือของใบรับรองตรงกับลายนิ้วมือที่กำหนดค่าในรหัสไคลเอ็นต์หรือไม่ โดยทำดังนี้
- เปิด Play Console แล้วไปที่เกมของคุณ
- ในหน้ารายละเอียดเกม ให้เลื่อนไปที่ด้านล่างสุด แล้วคลิกลิงก์ไปยังโปรเจ็กต์ Google Cloud Platform ที่ลิงก์
- เลือกโปรเจ็กต์
- เลือก API และการตรวจสอบสิทธิ์ในแถบด้านข้างทางซ้าย ตรวจสอบว่าสถานะ Google Play Games Services API เป็นเปิดในรายการ API ที่แสดง
- เลือกแอปที่ลงทะเบียนในแถบด้านข้างทางซ้าย
- ขยายส่วนรหัสไคลเอ็นต์ OAuth 2.0 แล้วจดลายนิ้วมือของใบรับรอง (SHA1)
หากลายนิ้วมือนี้ไม่ตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ที่มีลายนิ้วมือของใบรับรองที่ถูกต้อง คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ใน Play Console ไม่ใช่ในโปรเจ็กต์ Google Cloud Platform
ตรวจสอบว่าเปิดใช้บัญชีทดสอบแล้ว
ก่อนที่จะเผยแพร่เกม ต้องเปิดใช้บัญชีที่สร้างเกมใน Play Console เป็นผู้ทดสอบด้วย วิธีตรวจสอบว่ากำหนดค่าอย่างถูกต้อง
- เปิด Play Console แล้วไปที่เกมของคุณ
- เปิดแท็บการทดสอบ
- ตรวจสอบว่าบัญชีที่คุณพยายามลงชื่อเข้าใช้มีอยู่ในรายชื่อผู้ทดสอบ
หากบัญชีที่คุณพยายามลงชื่อเข้าใช้ไม่อยู่ในรายชื่อ ให้เพิ่มบัญชีลงในรายชื่อ รอสักครู่ แล้วลองลงชื่อเข้าใช้อีกครั้ง
ปัญหาเกี่ยวกับ Proguard
หากคุณใช้ Proguard และเห็นข้อผิดพลาดใน APK ที่มีการปรับให้ยากต่อการอ่าน (Obfuscate) ให้ตรวจสอบระดับ API เป้าหมายใน AndroidManifest.xml โปรดตั้งค่าเป็น 17 ขึ้นไป
สาเหตุอื่นๆ ที่ทำให้เกิดปัญหาในการตั้งค่า
ตรวจสอบสาเหตุอื่นๆ ที่พบบ่อยของข้อผิดพลาด
- หากเผยแพร่เกมแล้ว ให้ตรวจสอบว่าการตั้งค่าเกมได้รับการเผยแพร่ด้วย (คุณสามารถเผยแพร่แอปพลิเคชันโดยไม่ต้องเผยแพร่การตั้งค่าเกม) โดยไปที่ Google Play Console แล้วไปที่แอปของคุณ จากนั้นตรวจสอบว่าช่องข้างชื่อเกมระบุว่าเผยแพร่แล้ว หากระบุว่าอยู่ในสถานะอื่น เช่น "พร้อมเผยแพร่" หรือ "พร้อมทดสอบ" ให้คลิกช่อง แล้วเลือกเผยแพร่เกม
- หากเผยแพร่เกมไม่ได้ ให้ตรวจสอบว่ารหัสไคลเอ็นต์ 1 รหัสเปิดใช้ตัวเลือกแอปนี้เหมาะสำหรับการติดตั้งใหม่แล้ว
Listener ที่ไม่ระบุตัวตน
อย่าใช้ Listener ที่ไม่ระบุตัวตน Listener ที่ไม่ระบุตัวตนคือการใช้งานอินเทอร์เฟซ Listener ที่กำหนดไว้ในบรรทัด ดังที่แสดงด้านล่าง
    ImageManager im = ...;
    // Anonymous listener -- dangerous:
    im.loadImage(new ImageManager.OnImageLoadedListener() {
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }
Listener ที่ไม่ระบุตัวตนไม่น่าเชื่อถือเนื่องจาก Play Games SDK จะเก็บไว้เป็นการอ้างอิงอย่างอ่อน (weak reference)
ซึ่งหมายความว่าเครื่องมือจัดการหน่วยความจำที่ไม่ใช้แล้วอาจเรียกคืน Listener เหล่านี้ก่อนที่จะมีการเรียกใช้ คุณควรใช้ Listener โดยใช้ออบเจ็กต์ที่คงอยู่
เช่น
Activity แทน
    public class MyActivity extends Activity
            implements ImageManager.OnImageLoadedListener {
        private void loadOurImages() {
            ImageManager im = ...;
            im.loadImage(this);
        }
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }
