چندروش برای حل مشکل گردل یونیتی
حل مشکل gradle در unity برای اولین بار
✍️ نویسنده: سجاد احمدی نیت
یونیتی برای خروجی اندروید نیازمند خط فرمانی به نام gradle است که همین موضوع باعث شده است بسیاری از اوقات مشکلاتی برای build و خروجی اندروید پیش بیاید. حتما با ارورهایی نظیر مشکلات زیر مواجه شده اید و در کنسول یونیتی برخی log ها مبنی بر مشکلات عدم اجرای گردل و یا عدم ارتباط یونیتی با آن چاپ شده است:
گردل در یونیتی حداقل 12 نوع ارور گوناگون دارد که در بالا، 5 نوع آنرا مشاهده میکنید. اما ما قصد نداریم در این پست به حل همه آنها بپردازیم. چون ما فرض میگیریم که تمامی اصول را به درستی رعایت کرده و تنها مشکل ما همان ارور ساده گردل است که بخاطر عدم تناسب گردل با یونیتی پیش آمده است.
بنده این مطلب رو دوسال پیش نوشته بودم و بعلت مشکلاتی که در سایت پیش اومد، مجبور به بازنویسی شدم. اما باز هم تعجب میکنم چرا مطلب جدیدی درمورد حل مشکل gradle به میان نیامده است!
در ابتدا، قصد داریم با gradle کمی آشنا شویم تا بتوانیم مشکل آنرا در یونیتی حل کنیم.
گردل gradle چیست؟
گردل gradle چیست؟
گردل که با نام گرِیدِل هم معروف است، یک ابزار معروف build automation است که برای کنترل فرآیند تولید نرم افزار استفاده میشود. این فرآیند شامل از شروع کدنویسی نرم افزاری تا ایجاد یک خروجی ساده از نرم افزار میشود.
در متُدولوژی(روشهای) توسعه نرم افزاری گذشته، برنامه نویس پس از ایجاد تغییرات در برنامه اندرویدی، مجبور به compile دوباره تمامی برنامه میشد و زمان بسیار زیادی صرف بسته بندی و اعمال تغییرات میشد که حتی ممکن بود تغییرات نهایی مطابق خواسته برنامه نویس هم نباشد!
این پیچیدگی ها و استهلاکهای زمانی، باعث شد تا برنامه نویسها به ساخت “سیستم های تولید” برای این عملیات فکر کنند. قاعدتا یک برنامه نویس همیشه لازم دارد تا برنامه ای که نوشته run کند و تغییرات را به چشم ببیند تا قادر به تصمیم گیری باشد و درصورت نیاز آنرا debug کند.
اینگونه شد که یک build system توسط Hans Dockter بنیانگذار شرکت gradle توسعه داده شد و در فرآیندهای نرم افزاری استفاده شد.
کاری که Gradle برای ما انجام میده:
1. افزایش سرعت build با روش code generation. کدهای ما توسط gradle پردازش شده و کدهای دیگری درکنار آن اجرا میشه. همچنین درصورت تغییر، همان بخشی که اضافه شده است پردازش مجدد میشه.
2. مدیریت وابستگی ها یا dependency manager که یعنی مدیریت فایلهای third-party که همان کتابخانه های با پسوند jar هستند که در پروژه ما اضافه میشه.
3. مدیریت منابع(resources) و مرتب سازی آنها
4. جلوگیری از تداخل وابستگی یا dependency conflict که باعث جلوگیری از وجود دو کتابخانه(library) با یکدیگر یمشود.
جالبه بدونید که گردل یک ابزار خط فرمان(Command Line System) یا CLI ست که علاوه بر دسترسی شما از طریق نرم افزارهایی مثل اندرویداستودیو قادر به دسترسی از CMD سیستم هم هستید.
یک نکته جالب دیگه: گردل فقط برای اندرویداستودیو و زبانهای اندرویدی نیست. ولی استفاده اصلی در زبانهای اندرویدی میشه. در یونیتی هم کاربردی رو داره که بیان شد. با گردل نیازی نیست پروژه شما دوباره کامپایل بشه. اگر دقت کرده باشید، در دفعات بعدی سریعتر پروژه خروجی گرفته میشه. چون، گردل با مدیریت کدها و منابع، از هدررفت وقت شما جلوگیری میکنه! پس اگر به مشکل گردل خوردی، سعی کن با صبر و حوصله حلش کنی. چون اتفاقا دلسوزته!
راه حل های مشکل gradle در unity
در این مقاله چندین راه حل مناسب برای شما معرفی میکنم. دقت کنید که مطالب رو با جزئیات و دقت بخونید تا به مشکل نخورید! لطفا در انتشار مطالب با ذکر منبع ، در انتشار علم سهیم باشید.
راه حل اول: استفاده از فیلترشکن
اگر اشتراک دارید، میتونید از فیلترشکن(vpn) یا اصطلاحا قندشکن استفاده کنید. البته استفاده از کانفیگ های mitsuri و v2ray هم عیبی نداره.
حالا چطور این کار رو انجام بدیم؟ وقتی که قصد دارید خروجی android رو در build settings انجام بدید، اینترنت خودتون رو روشن کنید و به فیلترشکن متصل بشید. بعد از اطمینان اتصال و سرعت، میتونید خروجی رو بگیرید و روی دکمه build کلیک کنید.
با اینکار، خود یونیتی به وبسایت gradle متصل میشه و متناسب ترین نسخه گردل رو برای شما میگیره. چون معمولا ارورهای گردل بخاطر عدم تناسب نسخه های یونیتی و نسخه های گردل به وجود میاد. بقیه ارورها یکسری سوتی هایی هست که شاید در مقاله ای دیگه بهش پرداختیم.
راه حل دوم: استفاده از DNS های تحریم شکن
این راه رو بیشتر بهتون پیشنهاد میکنم. البته بخاطر اینکه راه قانونی و کم هزینه تر و کم دردسر تری هست!
این راه دقیقا مشابه راه قبلی هست. اما با این تفاوت که به جای استفاده از نرم افزارهای تغییر ip و tunel کننده و proxy سیستم، از dns استفاده میکنیم. همانطور که میدونید، dns اختصار Domain Name System هست و آدرسی ست که توسط کامپیوتر به دامنه تبدیل میشود و شما میتونید به یک سرور از راه دور متصل بشید.
در این روش قبل از اینکه خروجی اندروید رو با فشار دادن روی دکمه build انجام بدید، از اتصال اینترنت مطمئن میشید و یکی از dns های تحریم شکن یا هر dns دیگه ای که مطمئنید کار میکنه رو تنظیم میکنید، و بعد خروجی اندروید رو میگیرید. دقت کنید که گاهی اوقات ممکنه برای اعمال شدن، از unity خارج بشید یا اینترنت رو خاموش و روشن کنید.
حالا چطور dns رو ست کنیم؟
کاری نداره! توی کامپیوترت سرچ کن control panel و برو بخش network and sharing center و بعد در منوی سمت چپ بالا، گزینه change adaptor settings رو انتخاب کن و سپس، روی شبکه ای که الان بهش متصلی و ازش داری اینترنت میگیری کلیک راست کن و properties رو بزن. توی منویی که برات میاد، روی Internet Protocol Version 4 دبل کلیک کن.
در تصویر بخیش که قرمز هست رو میبینی؟ اون رو از روی obtain بردار بذار روی Use the following DNS Server adresses و بعد دو dns که داری رو کپی کن در همون نقطه. اگر بعدا میخوای غیرفعالش کنی باز بذار روی Obtain DNS Server. بعد که کارت رو انجام دادی ok رو بزن. اینجا بهتر توضیح داده.
بعد از اینکارهایی که گفتم خروجی ت رو بگیر. اینکار هم مثل روشن کردن vpn، باعث میشه تا دانلود از سایت گردل رو بصورت خودکار انجام بده.
چه dns ای استفاده کنم؟
اگر واقعا dns خاصی سراغ نداری، اتفاقا برو سراغ سرویسهایی مثل شکن(shecan) و 403 و بگذر(begzar) و الکترو(electro). البته سرویسهای dns زیادن ولی این چهارتا گل سرسبد باغ تحریم شکن ها هستند. من 403 رو بیشتر بهت پیشنهاد میکنم که حتی یک نرم افزار داره که اگر دانلود کنی، بصورت خودکار اینکار رو برات انجام میده. حتی برای دانلود و لاگین کردن و … هم سرعت زیادی داره و توسط وزارت ارتباطات ایجاد شده و کاملا رسمیه!
dns ها و آموزشهاش رو داخل سایت زده اما دو dns ش اینه: 10.202.10.202 بعنوان ip اول و 10.202.10.102 بعنوان ip دوم. آموزشش هم داده.
راه حل سوم: تکمیل دو راه قبلی، با پاک کردن پوشه gradle.
گاهی اوقات، ممکنه گردل دانلود بشه، اما به درستی نه! مثلا مسیر گردل اجازه جایگذاری گردل جدید رو نده!
برای اینکار، یکی از راه هایی که میتونید انجام بدید این هست که پوشه gradle. رو در مسیر Users درایو C پیدا کنید، پاکش کنید، به vpn یا dns متصل بشید و دوباره خروجی رو بگیرید. باز هم تاکید میکنم که اتصال اینترنت مهمه! اگر سرعت پایینه، اُپراتور رو عوض کنید.
نمونه مسیر پوشه gradle. :
C:\Users\USERNAME\.gradle مثلا نام ویندوز من Ice Rose هست : C:\Users\Ice Rose\.gradle
راه حل چهارم: نصب Unity از طریق Unity Hub
این بعنوان یک راه حل تلقی نمیشه چون استاندارد همینه که ما از لانچر خود یونیتی، به نصب یونیتی بپردازیم.
اما بسیاری از افرادیکه unity رو از طریق unityhub نصب میکنند، به ارورهای گردل کمتر دچار میشن یا ارور گردلی که مشاهده میکنند، بخاطر عدم تطابق نسخه ها نیست. میتونید از لانچرتون در تب installs و با فشردن گزینه install editor به نصب یونیتی جدیدی بپردازید. فقط حواستون باشه که تیک android build support رو به همراه زیرمجموعه های Open JDK و Android SDK و NDK بزنید.
راه حل پنجم: دانلود و جایگذاری دستی گردل
جدول زیر را یک نگاهی بیندازید:
جدول زیر یک نگاه مناسب برای استفاده از نسخه های gradle برای یونیتی میده. اگر تا به اینجا مشکل شما حل نشده، پس مجبورید اینکار رو بصورت دستی انجام بدید. باز هم تاکید میکنم که این مقاله برای حل دو مورد: عدم تطابق نسخه و برخی مشکلات رایج هست. اینکه ممکنه گاهی شما لایبرری معیوب در پروژه استفاده کنی و … ممکنه با این روشها حل نشه! ولی اگر باز هم نمیدونی چه مشکلی داری، پس تا آخر مقاله همراه باش.
قبل از مطالعه این بخش از اینجا هم استفاده کن، اگر مشکلت حل نشد ادامه مطلب رو بخون.
برای دانلود گردل بصورت دستی، میتونی به وبسایت خود گردل مراجعه کنی. در این بخش از وبسایت انواع نسخه های مختلف gradle وجود داره که میتونی دانلودش کنی و در مسیر گردل ویندوزت(پوشه gradle.) بریزی. قبلا هم این مسیر رو گفتم: C:\Users\USERNAME\.gradle
اگر دقت کنی، از هر نسخه سه نوع وجود داره. یکی all که همه فایلها رو داره، یکی bin که گزیده رو داره، یکی هم src که سورس کدهای اونها رو داره. باتوجه به جدول بالا، اونی که به نسخه میخوره یا از نسخه گفته شده کمی بالاتره (باید تست کنی، وقت میبره ولی خب گاهاً انسان مجبوره) رو فایل zip ش رو دانلود کن. برای دانلود سریعتر از نرم افزار internet download manager استفاده کن.
از هر نسخه ای که برگزیدید، نسخه all رو دانلود کنید و محتواش رو داخل همون پوشه بریزید (مراحل رو صحیح انجام بدید) و درصورتیکه نسخه all کار نکرد نسخه bin رو تست بفرمایید.
راه حل ششم: دانلود SDK و JDK مناسب
گاهی اوقات error ها و مشکلات گردل بخاطر ناقص بودن sdk و jdk ، یا عدم ارتباط این دو با یکدیگر هست که با نصب صحیح این دو میتوان از این ارور جلوگیری کرد. البته باید درنظر داشت که گاهی اوقات چندین مشکل با یکدیگر وجود داره که ذره ذره باید اشکالزدایی کرد.
نکته: گاهی اوقات مسیر این دو در environment variables ثبت نشده و یونیتی آنرا نمیشناسد. در ابتدا باید ویندوز آنرا بشناسد، سپس آنرا در external tools به یونیتی بشناسانید. برای اضافه کردن در environment variables از اینجا هم میتوانید کمک بگیرید.
اگر sdk و jdk و ndk از یونیتی هاب دانلود بشه، چنین مشکلی خیلی نادر هست که پیش بیاد.
راه حل هفتم: دانلود گردل از Android Studio
نرم افزار Android Studio یک محیط یکپارچه برای توسعه نرم افزار به زبانهای java و kotlin است. گردل در این نرم افزار کاربرد بیشتری با دست بازتری دارد. شما میتوانید در ابتدا نرم افزار Android Studio را دانلود کرده و نصب کنید، پیش از اجرای آن به یکی از روشهای dns یا vpn (که گفته شد) متصل شده، سپس در اندرویداستودیو یک پروژه ایجاد کنید.
سپس منتظر بمانید تا فایلهای مربوط به پروژه شامل sdk سالم ، jdk سالم و ndk سالم و همچنین gradle مناسب را دانلود کند. دقت کنید که اگر sdk را هم دانلود کند قطعا نیازمند حجم نسبتا زیاد اینترنت خواهید بود.
اگر اندرویداستودیو قادر به دانلود گردل نبود، میتوانید مثل چندروش گذشته، پوشه gradle. را پاک کرده و دوباره تست نمایید.
اگر قصد دارید بدون گردل و بصورت مستقیم از اندروید استودیو خروجی بگیرید، این آموزش به درد شما خواهد خورد.
راه حل هشتم: استفاده از پلاگین و package در یونیتی
تمامی پلاگین های موجود برای unity را میتوانید از اینجا دانلود کنید. این پلاگین ها به پروژه اضافه میشوند و میتوان بدون نیاز به دستکاری گردل، آنها را در پروژه استفاده کرد.
پلاگین Android jar Resolver
این پلاگین تمامی کتابخانه های داخل یونیتی را بررسی میکند. با گزینه fore resolve در Android Resolver در زیرمجموعه External dependency در سربرگ Edit، قادر هستید تا درصورت تنظیم بودن jdk، مشکل گردل را رفع کنید (به اینترنت و تحریم شکن متصل باشید)
پلاگین Unity Atlas
این پلاگین هم برای گردل ایجاد شده است.
راه حل نهم: استفاده از گزینه های مربوط به gradle
در Project Settings بخش Player و تنظیمات Publishing Settings اندروید، گزینه هایی زیرمجموعه Build مشاهده میشود که شش تای آخر مربوط به gradle است. مثلا Custom Main Gradle Template یا Custom Launcher Gradle Template و … که با فعالسازی آن، میتوانید خطوط فرمان را برای این پروژه تغییر دهید. حالا بماند که مبحث گسترده ای هست که چطور میتوان آنرا تغییر داد تا مشکل حل شود، ولی گاهی با فعالسازی این گزینه ها، میتوان مشکل را حل نمود.
حواستان باشد گاهی اوقات مشکل گردل بخاطر رمز اشتباهی ست که برای keystore وارد میکنید. بسیار حواستان باشد! گاهی اوقات حس میکنید کاری را درست انجام داده اید و این مقاله برای شما بی فایده ست، درحالیکه روش را به درستی انجام نداده اید.
روشهای دیگر که میتواند در رفع مشکل به شما کمک کند
وجود دوکتابخانه در پروژه
دقت کنید که ممکن است دو فایل jar یا فایل dll کاملا مشابه در پروژه شما وجود داشته باشد. اگر چنین چیزی وجود داشت، آنرا حتما پاک نمایید.
وجود کتابخانه معیوب
گاهی اوقات وجود یک فایل dll یا jar ناقص در پروژه (که ناقص دانلود شده یا ویروسی شده است) میتواند به خروجی شما با ارور گردل ضربه بزند.
وجود کتابخانه های بی کاربرد و زیاد
هر فایل jar و dll که دیدید داخل پروژه نریزید! اگر با این فایلها کار دارید، حتما ازشون استفاده کنید و بدون استفاده در پروژه نباشند. چون گردل چک میکند که کدام کتابخانه در پروژه اضافی ست.
مشکل در API ها
با دستکاری Minimum API Level و Target API ممکن است گاهی مشکل حل شود که اگر میخواهید این مشکل ریشه ای حل شود، باید API Level ها به درستی نصب شوند.
امیدوارم که این مطلب برای شما موثر باشد. در نشر با ذکر منبع این مطلب، در نشر علم سهیم باشید. اگر نکته جدیدی هم میدونی، بهم بگو تا اینجا به همراه نام ات ذکر کنم.