این صفحه نحوه عیبیابی مشکلاتی را که ممکن است هنگام توسعه بازیهای اندروید با سرویسهای بازیهای گوگل پلی با آنها مواجه شوید، شرح میدهد.
ثبت وقایع
برای عیبیابی مشکلات بازی خود، میتوانید با استفاده از دستور adb shell قابلیت Verbose logging را در دستگاه خود فعال کنید. سپس میتوانید با استفاده از logcat پیامهای لاگ سرویسهای بازیهای گوگل پلی را مشاهده کنید.
فعال کردن ورود به سیستم
برای فعال کردن ورود به سیستم در دستگاه آزمایشی خود:
دستگاه را به دستگاهی که Android SDK روی آن نصب شده است وصل کنید.
یک ترمینال باز کنید و این دستور را اجرا کنید:
adb shell setprop log.tag.Games VERBOSE
بازی خود را روی دستگاه اجرا کنید و مشکلی را که میخواهید اشکالزدایی کنید، دوباره ایجاد کنید.
مشاهده لاگها:
adb logcat
غیرفعال کردن ثبت وقایع
برای غیرفعال کردن ثبت وقایع طولانی (verbose logging) برای سرویسهای بازیهای Play در دستگاه خود و بازگشت به رفتار ثبت وقایع اولیه، دستور زیر را اجرا کنید:
adb shell setprop log.tag.Games INFO
احراز هویت امکانپذیر نیست
اگر نمیتوانید بازیکنان را در بازی خود احراز هویت کنید، ابتدا مطمئن شوید که دستورالعملهای ایجاد شناسههای کلاینت و پیکربندی سرویسهای بازی را دنبال کردهاید. اگر هنوز با خطاهای احراز هویت مواجه هستید، موارد زیر را بررسی کنید تا مطمئن شوید بازی شما به درستی تنظیم شده است.
برچسبهای فراداده خود را بررسی کنید
AndroidManifest.xml شما باید حاوی تگ فراداده games باشد. برای تأیید صحت تنظیم تگهای فراداده، مراحل زیر را انجام دهید:
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است.نام بستهای که هنگام ایجاد شناسه کلاینت خود ارائه دادهاید را تأیید کنید. برای تأیید نام بسته در کنسول گوگل پلی، به کنسول پلی بروید و روی ورودی مربوط به بازی خود کلیک کنید.
به برگه برنامههای مرتبط بروید و لیست شناسههای کلاینت را بررسی کنید. باید یک برنامه مرتبط با اندروید در این لیست وجود داشته باشد که نام بسته آن با نام بسته در
AndroidManifest.xmlشما مطابقت داشته باشد. در صورت عدم تطابق، یک شناسه کلاینت جدید با نام بسته صحیح ایجاد کنید و دوباره احراز هویت را امتحان کنید.
اثر انگشت گواهینامه را بررسی کنید
گواهینامهای که با آن بازی خود را تأیید میکنید باید با اثر انگشت گواهینامه مرتبط با شناسه کلاینت شما مطابقت داشته باشد. برای تأیید این موضوع، ابتدا اثر انگشت SHA1 گواهینامه خود را به شرح زیر بررسی کنید:
فایل گواهی خود را پیدا کنید و اثر انگشت SHA1 آن را به دست آورید. برای به دست آوردن اثر انگشت SHA1، این دستور را اجرا کنید:
keytool -exportcert -alias your-key-name -keystore /path/to/your/keystore/file -list -vبه دنباله ارقام هگزادسیمال با برچسب
SHA1:در خروجی توجه کنید. این اثر انگشت گواهی شماست.
سپس، بررسی کنید که ابزار ساخت شما از این گواهی استفاده میکند:
- فایل APK بازی خود را از ابزار ساخت خود ایجاد کنید و آن را با گواهی مورد نظر امضا کنید. APK تولید شده را در یک پوشه موقت کپی کنید.
در دایرکتوری موقت، دستور زیر را برای از حالت فشرده خارج کردن فایل APK خود اجرا کنید.
unzip YourGame.apkبا استفاده از یک فایل گواهی RSA، یک کلید خصوصی ایجاد کنید:
keytool -printcert -file META-INF/CERT.RSAروش دیگر، تولید کلید خصوصی با استفاده از فایل گواهی DSA است:
keytool -printcert -file META-INF/CERT.DSAبه ترتیب ارقام هگزادسیمال روی خطی که با
SHA1:این توالی ارقام باید با اثر انگشت گواهی شما از مرحله قبل مطابقت داشته باشد. اگر عدم تطابق وجود داشته باشد، ابزار یا سیستم ساخت شما برای امضای برنامه با گواهی شما پیکربندی نشده است. در این صورت، برای تعیین نحوه پیکربندی صحیح آن، به مستندات محیط ساخت خود مراجعه کنید و دوباره سعی کنید احراز هویت کنید.
در مرحله بعد، بررسی کنید که آیا اثر انگشت گواهی با اثر انگشت پیکربندی شده در شناسه کلاینت شما مطابقت دارد یا خیر. برای انجام این کار:
- کنسول Play را باز کنید و به بازی خود بروید.
- در صفحه جزئیات بازی ، به پایین صفحه بروید و روی لینک پروژه مرتبط با پلتفرم ابری گوگل کلیک کنید.
- پروژه خود را انتخاب کنید.
- در نوار کناری سمت چپ، APIs & auth را انتخاب کنید. مطمئن شوید که وضعیت API مربوط به سرویسهای بازیهای گوگل پلی در لیست APIهای نمایش داده شده روشن (ON) است.
- در نوار کناری سمت چپ، برنامههای ثبتشده (Registered apps) را انتخاب کنید.
- بخش OAuth 2.0 Client ID را باز کنید و اثر انگشت گواهی (SHA1) را یادداشت کنید.
اگر این اثر انگشت با اثر انگشت گواهی شما از مراحل قبلی مطابقت ندارد، باید یک شناسه کلاینت جدید با اثر انگشت گواهی صحیح ایجاد کنید. شما باید شناسه کلاینت جدید را در کنسول Play ایجاد کنید، نه در پروژه Google Cloud Platform.
بررسی کنید که حسابهای آزمایشی فعال باشند
قبل از انتشار یک بازی، حسابی که بازی را در کنسول Play ایجاد کرده است نیز باید به عنوان آزمایشکننده فعال شود. برای بررسی اینکه این مورد به درستی پیکربندی شده است:
- کنسول Play را باز کنید و به بازی خود بروید.
- برگه «آزمایش» را باز کنید.
- بررسی کنید که حسابی که میخواهید با آن احراز هویت کنید در فهرست آزمایشکنندگان باشد.
اگر حسابی که میخواهید با آن احراز هویت کنید در فهرست نیست، آن را به فهرست اضافه کنید، چند دقیقه صبر کنید و دوباره برای احراز هویت تلاش کنید.
مشکلات پروگارد
اگر از Proguard استفاده میکنید و در APK مبهمسازیشده خطاهایی مشاهده میکنید، سطح API هدف را در AndroidManifest.xml خود بررسی کنید. حتماً آن را روی ۱۷ یا بالاتر تنظیم کنید.
سایر علل مشکلات راهاندازی
سایر علل رایج خطاها را بررسی کنید:
- اگر بازی شما منتشر شده است، بررسی کنید که تنظیمات بازی نیز منتشر شده باشد (انتشار برنامه بدون انتشار تنظیمات بازی امکانپذیر است). برای انجام این کار، به کنسول گوگل پلی بروید و به برنامه خود بروید و بررسی کنید که کادر کنار نام بازی نشان دهنده انتشار آن باشد. اگر نشان دهنده وضعیت دیگری مانند "آماده انتشار" یا "آماده آزمایش" باشد، روی کادر کلیک کنید و انتشار بازی را انتخاب کنید.
- اگر نمیتوانید بازی خود را منتشر کنید، بررسی کنید که دقیقاً یکی از شناسههای کلاینت، گزینه «این برنامه برای نصبهای جدید ترجیح داده میشود» را فعال کرده باشد.
شنوندگان ناشناس
از شنوندههای ناشناس استفاده نکنید. شنوندههای ناشناس، پیادهسازیهایی از یک رابط شنونده هستند که به صورت درونخطی تعریف میشوند، همانطور که در زیر نشان داده شده است.
ImageManager im = ...;
// Anonymous listener -- dangerous:
im.loadImage(new ImageManager.OnImageLoadedListener() {
@Override
public void onImageLoaded(Uri uri, Drawable drawable) {
// ...code...
}
}
شنوندههای ناشناس غیرقابل اعتماد هستند زیرا Play Games SDK آنها را به عنوان ارجاعات ضعیف نگه میدارد، به این معنی که ممکن است قبل از فراخوانی توسط garbage collector بازیابی شوند. در عوض، شما باید شنونده را با استفاده از یک شیء پایدار مانند 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...
}
}