การแก้ปัญหาบริการเกมของ 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 หากมีข้อมูลไม่ตรงกัน ให้สร้าง รหัสไคลเอ็นต์ที่มีชื่อแพ็กเกจที่ถูกต้อง และลองลงชื่อเข้าใช้อีกครั้ง

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

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

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

    keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -v
    
  2. จดบันทึกลำดับของเลขฐานสิบหกที่มีป้ายกำกับว่า 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. สังเกตลำดับของเลขฐานสิบหกในบรรทัด SHA1:

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

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

  1. เปิด Play Console และไปที่เกม
  2. ในหน้ารายละเอียดเกม ให้เลื่อนลงไปด้านล่างแล้วคลิกลิงก์ โปรเจ็กต์ Google Cloud Platform ที่ลิงก์ไว้
  3. เลือกโปรเจ็กต์
  4. ในแถบด้านข้างทางซ้าย ให้เลือก API และ การตรวจสอบสิทธิ์ โปรดตรวจสอบว่า สถานะ API บริการเกมของ Google Play เป็นเปิดในรายการ 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 แล้วไปที่แอปของคุณ จากนั้นทำเครื่องหมายที่ช่องข้างชื่อเกม ที่มีการเผยแพร่ หากระบุว่าอยู่ในสถานะอื่น เช่น "พร้อมเผยแพร่" หรือ "พร้อมทดสอบ" ให้คลิกช่องแล้วเลือกเผยแพร่เกม
  • หากคุณเผยแพร่เกมไม่ได้ ให้ตรวจสอบว่ารหัสไคลเอ็นต์ใดมีแอปนี้ แนะนำให้ใช้ตัวเลือกการติดตั้งใหม่

ผู้ฟังที่ไม่ระบุชื่อ

อย่าใช้ Listener แบบไม่ระบุชื่อ ผู้ฟังที่ไม่ระบุชื่อมีการใช้งานอินเทอร์เฟซ Listener ที่กำหนดในบรรทัด ดังที่แสดงด้านล่าง

    ImageManager im = ...;

    // Anonymous listener -- dangerous:
    im.loadImage(new ImageManager.OnImageLoadedListener() {
        @Override
        public void onImageLoaded(Uri uri, Drawable drawable) {
            // ...code...
        }
    }

ผู้ฟังที่ไม่ระบุชื่อเชื่อถือไม่ได้เพราะ Play Games SDK จะรักษา URL เหล่านี้ว่าเป็นการอ้างอิงที่ไม่รัดกุม ซึ่งหมายความว่าพนักงานเก็บขยะอาจเรียกคืนสินค้าเหล่านั้นก่อนที่จะถูก เรียกใช้ คุณควรติดตั้งใช้งาน 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...
        }
    }