امید فتح الله زاده
امید فتح الله زاده
خواندن ۵ دقیقه·۳ سال پیش

باگ‌آفرین نمونه، یونیتی و دوستان

باگ گیری، تا بینهایت و فراتر از آن
باگ گیری، تا بینهایت و فراتر از آن


گوگل تهدید میکند

قضیه از اونجایی شروع شد که ایمیلی از سمت گوگل به ما ارسال شد. چیزی که توی ایمیل نوشته شده بود این بود که اگر پلاگین شرکت Tapjoy رو آپدیت نکنید تا 2 ماه دیگه بازیتون از گوگل پلی حذف می‌شه.

حالا جریان چی بود؟

پلاگینی که ما استفاده کرده بودیم دیگه از قوانین حریم خصوصی جدیدی که گوگل منتشر کرده تبعیت نمی‌کرد و با آپدیت جدیدی که برای این پلاگین داده بودن قضیه حل و فصل می‌شد.

سیاه چاله

باری، ما هم کار رو شروع کردیم و برای اینکه در آینده مشکلی نخوریم تمامی پلاگین‌ها و ... که تو پروژه استفاده شده بود رو به آخرین نسخه آپدیت کردیم و نسخه جدید بازی رو در گوگل پلی قرار دادیم.

فردای اون روز بازی منتشر شد و با کمال تعجب متوجه شدیم بازی بعد از نصب کرش میکنه. این اتفاق در صورتی افتاده بود که نسخه APK ای که در خروجی گرفته بودیم روی گوشی به راحتی اجرا می‌شد و کرشی در کار نبود.

همونطور که میدونید گوگل پلی چند وقتی هست که دیگه فقط فایل‌های با فرمت AAB برای پابلیش قبول می‌کنه و دیگه از نسخه های APK پشتیبانی نمی‌کنه.

قبل از اینکه بگم چطور مشکل رو حل کردیم باید بگم که ما بازیمون رو با استفاده از موتور بازیسازی یونیتی ساختیم. اون سالی که بازی رو پابلیش کرده بودیم (اسفند 1396) از یونیتی 5 برای ساخت بازی استفاده کردیم و دو بار به یونیتی های بالاتر یعنی 2017 و 2018 هم مایگریت کرده بودیم و آخرین آپدیت بازی هم با استفاده از یونیتی 2020.3 پابلیش کرده بودیم.

داستان رفع مشکل از اونجایی شروع شد که متوجه شدیم خیلی از دولوپرهای دیگه هم به مشکل ما خوردن و این مسئله با کامنت کردن برخی از کدهای mainTemplate.gradle که با استفاده از Resolver گوگل ساخته می‌شد، حل می‌شه. بعد از کامنت کردن کدها متوجه شدیم 20 مگابایت به حجم خروجی اضافه شد و بعد از پابلیش آپدیت در گوگل پلی هم کاربرها مشکلی با اجرا شدن بازی نداشتن.

اندروید باورنکردنی

چند روزی از آخرین آپدیتی که داده بودیم گذشت و متوجه شدیم بعضی از کاربران بازی، باگ عجیب و غریبی رو گزارش می‌کنن. باگی که این کاربرها دچارش شده بودن این بود که بخشی از یوآی بازی در قسمت گیم پلی بازی دچار اختلال شده بود و نمایش داده نمی‌شد.

در این لحظه بزرگترین مشکل تیم ما این بود که در تمامی دیوایس‌هایی که داشیتم بازی به درستی اجرا می‌شد و همچین مشکلی اتفاق نمی‌افتاد. این مسئله می‌تونست باعث حل نشدن مشکل بشه، چون وقتی هیچ دیوایس مشابهی همچین باگی نداره، پیدا کردنش کار به مراتب سخت و زمانبریه.

روزگار به همین منوال گذشت تا اینکه فرشته نجات از راه رسید. بعد از نصب بازی روی گوشی یکی از دوستان (فرشته نجات) متوجه باگ شدیم و درجا سیم اتصال به کامپیوتر را وصل و عملیات دیباگ کردن را شروع کردیم. بینگ!!!

مشکل حل شده بود!!!

دیگه از این بدتر نمیشد. با اتصال گوشی به کامپیوتر مشکل حذف بخشی از یوآی بازی به طور کامل رفع شده بود.

برای رفع این مشکل فکر کردیم و فکر کردیم و فکر کردیم تا اینکه فهمیدیم قبل از وصل کردن گوشی به کامپیوتر زبان دستگاه رو به انگلیسی تغییر داده بودیم.

بله!

فرشته نجات زبان گوشی خودش رو روی فارسی گذاشته بود و برای اینکه من حالت دیباگ مود رو فعال کنم، زبان گوشی رو روی انگلیسی گذاشتم (چون واقعا نمی‌شد پیداش کرد کجاست) و بعد به کامپیوتر وصل کردم.

دوباره این فرآیند رو تکرار کردم و زبان گوشی رو به فارسی تغییر دادم و متوجه این شدم مشکل برگشته.

این عملیات رو روی دستگاه‌های دیگه هم انجام دادیم و مشکل مشابه اتفاق افتاد.

مشکل از زبان دستگاه اندرویدی بود. اگر و فقط اگر زبان دستگاه فارسی بود، این مشکل اتفاق می‌افتاد. جالبیش اینجا بود که با هیچ زبان دیگری مشکل نداشت و فقط با فارسی مشکل داشت، به طور مثال زبان گوشی رو روی عربی گذاشتیم و بازی به طور کامل اجرا شد.

کار دیباگ کردن شروع شد و در کمال ناباوری هیچ اروری دریافت نشد!

در این مرحله تحقیقات در مورد چرایی قضیه شروع شد و متوجه شدم ساپورت زبان فارسی در دیوایس‌های مختلف از یونیتی 2019.3 حذف شده. علت اینکه در یونیتی های قدیمی‌تر که برای بیلد گرفتن از بازی استفاده شده بود، این مشکل وجود نداشت هم همین بود.

خم رنگرزی

تحقیقات در حال انجام بود که متوجه مورد غیر طبیعی در Parse شدن دیتاها در هنگام استفاده از دیوایس‌های فارسی شدم.

در نسخه های اولیه بازی جنگ کاغذی، کاربران امکان تغییر رنگ‌های متعددی داشتن، یعنی می‌تونستن رنگ‌های دلخواه خودشون رو در تنظیمات بازی انتخاب کنن و برای سیو کردن این دیتا، رنگ انتخاب شده به یک رشته تبدیل و در Playerprefs ذخیره می‌شد. (این دیتا رو سمت سرور نگه نمی‌داشتیم و فقط روی گوشی ذخیره می‌شد)

این دیتا به طور مثال به این شکل بود.

RGB (0.000, 0.000, 1.000, 1.000)

یک رشته از اعداد RGBA ذخیره میشد و برای Parse کردن این string به Color هم یک پارسر کاستوم نوشته بودم.

در نسخه‌های جدید جنگ کاغذی این قسمت از بازی تغییراتی کرد و بازیکنان فقط میتونستن دو رنگ قرمز یا آبی انتخاب کنن و از اونجایی که چیزی که کار می‌کنه رو نباید دست بزنیم، من هم کد مربوط به تغییر رنگ رو تغییر ندادم و به همین صورت دیتا در گوشی ذخیره می‌شد.

اتفاقی که می‌افتاد این بود که دیتای اشتباهی در هنگام دریافت از Playerprefs به پارسر کاستوم می‌رسید و عملیات پارس کردن دیتا به مشکل می‌خورد و رنگ با آلفای 0 به بیرون برگردانده می‌شد. چون اعداد ورودی از انگلیسی به فارسی در هنگام دریافت دیتا تغییر می‌کرد از LTR به RTL تبدیل میشد و پارسر کار خودش رو به درستی انجام نمیداد و آلفای بخشی از یوآی صفر شده بود.

خوب حل کردن این بخش کار ساده‌ای بود ولی رسیدن به نقطه‌ی بوجود آورنده باگ کار دشوار و طاقت فرسایی بود. به هر حال اگر شما هم به مشکلات مشابه خوردید بهتره که تمامی جزئیات کار رو بررسی کنید تا مشکلتون حل بشه.

امیدوارم از خوندن این مقاله لذت برده باشید و تونسته باشم کمکی به شما کرده باشم.

یونیتیاندرویدبازیبازیسازیبرنامه‌نویسی
شاید از این پست‌ها خوشتان بیاید