การแก้ปัญหาบริการเกมของ 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. ยืนยันชื่อแพ็กเกจที่คุณระบุเมื่อสร้าง Client ID หากต้องการยืนยัน ชื่อแพ็กเกจใน 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...
        }
    }