تحرّي الخلل في ألعاب Android وإصلاحه

توضّح هذه الصفحة كيفية تحديد المشاكل التي قد تواجهها أثناء تطوير ألعاب Android باستخدام حزمة تطوير البرامج (SDK) في "ألعاب Play" وحلّها.

تعذّر تسجيل الدخول

إذا لم تتمكّن من تسجيل دخول اللاعبين إلى لعبتك، تأكَّد أولاً من اتّباع التعليمات لإنشاء الأرقام التعريفية للعملاء وإعداد خدمات الألعاب. إذا كنت لا تزال تواجه أخطاء في تسجيل الدخول، فتحقق من العناصر التالية للتأكد من إعداد لعبتك بشكل صحيح.

التحقق من علامات البيانات الوصفية

يجب أن يحتوي 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، انتقل إلى Google Play Console وانقر على الإدخال المناسب للعبتك. انتقل إلى علامة التبويب التطبيقات المرتبطة وافحص قائمة الأرقام التعريفية للعملاء. يجب أن يكون هناك تطبيق مرتبط بنظام Android في هذه القائمة يطابق اسم الحزمة اسم الحزمة في AndroidManifest.xml.
  3. في حال عدم التطابق، يمكنك إنشاء معرِّف عميل جديد باستخدام اسم الحزمة الصحيح ومحاولة تسجيل الدخول مرة أخرى.

التحقق من الملف المرجعي للشهادة

يجب أن تتطابق الشهادة التي وقّعت عليها مع الملف المرجعي للشهادة المرتبطة بمعرِّف العميل. للتحقق من هذا، تحقق أولاً من الملف المرجعي لشهادة 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
    

    بدلاً من ذلك، يمكنك إنشاء المفتاح الخاص باستخدام ملف شهادة للإعلانات الديناميكية على شبكة البحث:

    keytool -printcert -file META-INF/CERT.DSA
    
  4. لاحظ تسلسل الأرقام السداسية العشرية في السطر المسمى SHA1:.

    يجب أن يتطابق تسلسل الأرقام هذا مع الملف المرجعي للشهادة من الخطوة السابقة. وفي حال عدم التطابق، لن يتم ضبط أداة الإصدار أو النظام لتوقيع تطبيقك باستخدام شهادتك. وفي هذه الحالة، يمكنك الرجوع إلى وثائق بيئة الإصدار لتحديد كيفية تهيئتها بشكل صحيح ومحاولة تسجيل الدخول مرة أخرى.

بعد ذلك، تحقق مما إذا كانت الملف المرجعي للشهادة يتطابق مع الملف المرجعي الذي تم إعداده في معرِّف العميل. ولإجراء ذلك:

  1. افتح Google Play Console وانتقِل إلى لعبتك.
  2. في صفحة تفاصيل اللعبة، مرّر إلى الأسفل وانقر على الرابط إلى مشروع Google Cloud Platform المرتبط.
  3. في Google Cloud Platform، اختَر مشروعك.
  4. في الشريط الجانبي على اليمين، حدد واجهات برمجة التطبيقات والمصادقة. تأكد من أن حالة واجهة برمجة التطبيقات لخدمات ألعاب Google Play على تشغيل في القائمة المعروضة لواجهات برمجة التطبيقات.
  5. في الشريط الجانبي على يمين الصفحة، اختَر التطبيقات المسجّلة.
  6. وسِّع القسم "معرّف عميل OAuth 2.0" ولاحظ بصمة إصبع الشهادة (SHA1).

إذا لم تتطابق هذه البصمة مع الخطوات السابقة، فيجب إنشاء معرِّف عميل جديد باستخدام بصمة الإصبع الصحيحة للشهادة. عليك إنشاء معرِّف عميل جديد في Google Play Console، وليس في Google Cloud Platform.

التحقق من تفعيل الحسابات الاختبارية

قبل نشر اللعبة، يجب أيضًا تفعيل الحساب الذي أنشأ اللعبة في Google Play Console كجهة اختبار. للتأكد من تهيئة ذلك بشكل صحيح:

  1. افتح Google Play Console وانتقِل إلى لعبتك.
  2. افتح علامة التبويب الاختبار.
  3. تحقق من أن الحساب الذي تحاول تسجيل الدخول باستخدامه موجود في قائمة المختبرين.

إذا لم يكن الحساب الذي تحاول تسجيل الدخول باستخدامه مدرجًا، فأضفه إلى القائمة، وانتظر بضع دقائق وحاوِل تسجيل الدخول مرة أخرى.

مشاكل الحماية

إذا كنت تستخدم Proguard وترى أخطاء في ملف APK الذي يتضمن تشويشًا، فتحقق من مستوى واجهة برمجة التطبيقات المستهدف على AndroidManifest.xml. تأكد من تعيينه على 17 أو أعلى.

الأسباب الأخرى لمشاكل الإعداد

تحقَّق من الأسباب الشائعة الأخرى للأخطاء:

  • إذا تم نشر لعبتك، تحقق من نشر إعدادات اللعبة أيضًا (من الممكن نشر التطبيق بدون نشر إعدادات الألعاب). ولإجراء ذلك، انتقل إلى Google Play Console وانتقل إلى تطبيقك وتحقق من أن المربع بجوار اسم اللعبة يشير إلى أنه تم نشرها. إذا كان يشير إلى أنّ الفيديو في حالة أخرى، مثل "جاهز للنشر" أو "جاهز للاختبار"، انقر على المربّع واختَر نشر اللعبة.
  • إذا لم تتمكّن من نشر اللعبة، تأكّد من تفعيل الخيار يُفضّل هذا التطبيق لعمليات التثبيت الجديدة لأحد معرّفات العملاء.

المستمعون المجهولون

لا تستخدم المستمعين المجهولين. المستمعون المجهولون هم عمليات تنفيذ لواجهة مستمع محدّدة بشكل مضمّن، كما هو موضّح أدناه.

    ImageManager im = ...;

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

لا يمكن الاعتماد على المستمعين المجهولين نظرًا لأن حِزمة تطوير البرامج (SDK) في "ألعاب Play" تحتفظ بهم كمراجع ضعيفة، ما يعني أنه قد يتم استردادهم من قِبل جامع القمامة قبل استدعاءهم. بدلاً من ذلك، يجب تنفيذ المستمع باستخدام كائن مستمر، مثل 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...
        }
    }