การแก้ปัญหาบริการเกมของ Play ในเกม Android

หน้านี้อธิบายวิธีแก้ปัญหาที่อาจพบขณะพัฒนาเกม Android ด้วยบริการเกมของ Google Play

การบันทึก

หากต้องการแก้ปัญหาเกี่ยวกับเกม คุณสามารถเปิดการบันทึกแบบละเอียดในอุปกรณ์ได้โดยใช้คำสั่ง adb shell จากนั้นคุณจะดูข้อความในบันทึกของบริการเกมของ Google Play ได้โดยใช้ Logcat

เปิดใช้การบันทึก

วิธีเปิดใช้การบันทึกในอุปกรณ์ทดสอบ

  1. เชื่อมต่ออุปกรณ์กับเครื่องที่ติดตั้ง Android SDK

  2. เปิดเทอร์มินัลแล้วเรียกใช้คำสั่งนี้

    adb shell setprop log.tag.Games VERBOSE
  3. เรียกใช้เกมในอุปกรณ์และจำลองปัญหาที่คุณพยายามแก้ไขข้อบกพร่อง

  4. ดูบันทึก

    adb logcat

ปิดใช้การบันทึก

หากต้องการปิดใช้การบันทึกแบบละเอียดสำหรับบริการเกมของ Play ในอุปกรณ์และย้อนกลับไปใช้ลักษณะการทำงานของการบันทึกเดิม ให้เรียกใช้คำสั่งต่อไปนี้

adb shell setprop log.tag.Games INFO

ไม่สามารถลงชื่อเข้าใช้

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

ตรวจสอบแท็กข้อมูลเมตา

AndroidManifest.xml ต้องมีแท็กข้อมูลเมตาของเกม วิธียืนยันว่าตั้งค่าแท็กข้อมูลเมตาอย่างถูกต้องแล้วมีดังนี้

  1. เปิด AndroidManifest.xml และตรวจสอบว่ามีแท็ก meta-data ดังที่แสดงด้านล่าง

    <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />
    
  2. ค้นหาคำจำกัดความของทรัพยากร @string/app_id โดยปกติแล้วจะกำหนดไว้ในไฟล์ XML ซึ่งอยู่ในไดเรกทอรี res/xml เช่น res/xml/strings.xml หรือ res/xml/ids.xml

  3. ตรวจสอบว่าค่าของทรัพยากร @string/app_id ตรงกับรหัสตัวเลขของแอปพลิเคชัน ค่าของทรัพยากรนี้ควรมีเฉพาะตัวเลขเท่านั้น เช่น

    <string name="app_id">123456789012</string>
    

ตรวจสอบชื่อแพ็กเกจ

ชื่อแพ็กเกจของเกมต้องตรงกับชื่อแพ็กเกจในรหัสไคลเอ็นต์ วิธียืนยันชื่อแพ็กเกจ

  1. เปิด AndroidManifest.xml แล้วตรวจสอบว่าชื่อแพ็กเกจของเกมถูกต้อง ชื่อแพ็กเกจคือค่าของแอตทริบิวต์ package ในแท็ก manifest

  2. ยืนยันชื่อแพ็กเกจที่คุณระบุเมื่อสร้างรหัสไคลเอ็นต์ หากต้องการยืนยันชื่อแพ็กเกจใน Google Play Console ให้ไปที่ Play Console แล้วคลิกรายการที่สอดคล้องกับเกมของคุณ

  3. ไปที่แท็บแอปที่เชื่อมโยง แล้วตรวจสอบรายการรหัสไคลเอ็นต์ ควรมีแอป Android ที่เชื่อมโยงอยู่ในรายการนี้ซึ่งมีชื่อแพ็กเกจตรงกับชื่อแพ็กเกจใน AndroidManifest.xml หากไม่ตรงกัน ให้สร้าง Client ID ใหม่ที่มีชื่อแพ็กเกจที่ถูกต้อง แล้วลองลงชื่อเข้าใช้อีกครั้ง

ตรวจสอบลายนิ้วมือของใบรับรอง

ใบรับรองที่คุณใช้ลงนามในเกมควรตรงกับลายนิ้วมือของใบรับรองที่เชื่อมโยงกับรหัสไคลเอ็นต์ หากต้องการยืนยัน ให้ตรวจสอบลายนิ้วมือ SHA1 ของใบรับรองดังนี้

  1. ค้นหาไฟล์ใบรับรองและรับลายนิ้วมือ SHA1 หากต้องการรับลายนิ้วมือ SHA1 ให้เรียกใช้คำสั่งนี้

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. จดลำดับของตัวเลขฐาน 16 ที่มีป้ายกำกับ SHA1: ในเอาต์พุต นั่นคือลายนิ้วมือของใบรับรอง

จากนั้นตรวจสอบว่าเครื่องมือบิลด์ใช้ใบรับรองนี้หรือไม่ โดยทำดังนี้

  1. สร้าง APK ของเกมจากเครื่องมือบิลด์และลงนามด้วยใบรับรองที่ต้องการ คัดลอก APK ที่สร้างขึ้นไปยังไดเรกทอรีชั่วคราว
  2. ในไดเรกทอรีชั่วคราว ให้เรียกใช้คำสั่งต่อไปนี้เพื่อแตกไฟล์ APK

    unzip YourGame.apk
    
  3. สร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง RSA

    keytool -printcert -file META-INF/CERT.RSA
    

    หรือจะสร้างคีย์ส่วนตัวโดยใช้ไฟล์ใบรับรอง DSA ก็ได้ โดยทำดังนี้

    keytool -printcert -file META-INF/CERT.DSA
    
  4. จดลำดับของตัวเลขฐาน 16 ในบรรทัดที่มีป้ายกำกับ SHA1:

    ลำดับตัวเลขนี้ควรตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า หากไม่ตรงกัน แสดงว่าเครื่องมือบิลด์หรือระบบไม่ได้รับการกำหนดค่าให้ลงนามในแอปพลิเคชันด้วยใบรับรอง ในกรณีนี้ โปรดดูเอกสารประกอบของสภาพแวดล้อมของบิลด์ เพื่อดูวิธีกำหนดค่าอย่างถูกต้อง แล้วลองลงชื่อเข้าใช้อีกครั้ง

จากนั้นตรวจสอบว่าลายนิ้วมือของใบรับรองตรงกับลายนิ้วมือที่กำหนดค่าในรหัสไคลเอ็นต์หรือไม่ โดยทำดังนี้

  1. เปิด Play Console แล้วไปที่เกมของคุณ
  2. ในหน้ารายละเอียดเกม ให้เลื่อนไปที่ด้านล่างสุด แล้วคลิกลิงก์ไปยังโปรเจ็กต์ Google Cloud Platform ที่ลิงก์
  3. เลือกโปรเจ็กต์
  4. เลือก API และการตรวจสอบสิทธิ์ในแถบด้านข้างทางซ้าย ตรวจสอบว่าสถานะ Google Play Games Services API เป็นเปิดในรายการ API ที่แสดง
  5. เลือกแอปที่ลงทะเบียนในแถบด้านข้างทางซ้าย
  6. ขยายส่วนรหัสไคลเอ็นต์ OAuth 2.0 แล้วจดลายนิ้วมือของใบรับรอง (SHA1)

หากลายนิ้วมือนี้ไม่ตรงกับลายนิ้วมือของใบรับรองจากขั้นตอนก่อนหน้า คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ที่มีลายนิ้วมือของใบรับรองที่ถูกต้อง คุณต้องสร้างรหัสไคลเอ็นต์ใหม่ใน Play Console ไม่ใช่ในโปรเจ็กต์ Google Cloud Platform

ตรวจสอบว่าเปิดใช้บัญชีทดสอบแล้ว

ก่อนที่จะเผยแพร่เกม ต้องเปิดใช้บัญชีที่สร้างเกมใน Play Console เป็นผู้ทดสอบด้วย วิธีตรวจสอบว่ากำหนดค่าอย่างถูกต้อง

  1. เปิด Play Console แล้วไปที่เกมของคุณ
  2. เปิดแท็บการทดสอบ
  3. ตรวจสอบว่าบัญชีที่คุณพยายามลงชื่อเข้าใช้มีอยู่ในรายชื่อผู้ทดสอบ

หากบัญชีที่คุณพยายามลงชื่อเข้าใช้ไม่อยู่ในรายชื่อ ให้เพิ่มบัญชีลงในรายชื่อ รอสักครู่ แล้วลองลงชื่อเข้าใช้อีกครั้ง

ปัญหาเกี่ยวกับ 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...
        }
    }