R8 ابزاری است که برای shrink ، ایمن سازی و بهینه سازی برنامه های اندروید استفاده می شود که از قوانین پروگارد برای تغییر رفتار برنامه استفاده می کند.
توسعه دهندگان تمایل دارند R8 را با proguard چون شبیه هم هستند اشتباه بگیرند اما تفاوت های جزئی با هم دارند که در ادامه این آموزش تفاوت این دو را با یکدیگر خواهیم دید.
داشتن یک اپلیکیشن کوچک هم برای شما و هم برای کاربران یک مزیت است، این بدان معنی است که نصب های بیشتری وجود خواهد داشت پس برای این کارR8 به کمک ما می آید.
R8 یک ابزار کوچک کردن برنامه است که برای کاهش اندازه برنامه شما استفاده می شود. این ابزار موجود در اندروید استودیو با قوانین Proguard کار می کند. R8 کد برنامه شما را به کد Dalvik بهینه تبدیل می کند.
در طی این فرآیند تبدیل، R8 کلاسها و متدهایی را که در برنامه ما استفاده نمیشوند حذف میکند. در کنار این برنامههای اندرویدی فایلهای استفادهنشده زیادی دارند که ما نیازی به داخل برنامه خود نداریم، بنابراین R8 آن فایلها را حذف میکند و به کاهش اندازه برنامه کمک میکند. مزیت استفاده از R8 این است که برنامه شما را ایمن تر می کند و مهندسی معکوس آن را دشوار می کند. بنابراین این به ما کمک می کند تا امنیت برنامه خود را افزایش دهیم.
در تصویر زیر می توانید نمایی از نحوه کار R8 را مشاهده می کنید:
R8 با پروگارد در موارد زیر متفاوت است:
به طور پیش فرض، R8 در اندروید استودیو وجود دارد. تنها چیزی که نیاز داریم این است که آن را فعال کنیم. برای فعال کردن R8، فایل برنامه ماژول build.gradle را باز کنید و این قطعه کد را داخل buildTypes اضافه کنید.
کد داخل بلوک {}release به این معنی است که این کد در نسخه ساخت نسخه برنامه شما اعمال خواهد شد. اگر برنامه را در شبیه ساز راه اندازی کنید، این کد اجرا نمی شود.
minifyEnabled روی true تنظیم شده است تا بتواند عملکردهای R8 را انجام دهد.
shrinkResources نیز روی true تنظیم شده است. با این کار تمام منابع استفاده نشده ای که در برنامه خود ایجادیا اضافه کرده اید حذف می شود.
در مواردی که می خواهید کد خود را به شدت بهینه کنید و آن را به حداقل برسانید، مورد زیر را در gradle.properties اضافه کنید:
همانطور که اشاره کردیم، R8 برای کوچک کردن برنامهها قبل از انتشار در پلی استور برای دسترسی کاربران استفاده میشود. فعال کردن آن در پروژه شما، تمام کلاس ها، توابع و متغیرهای استفاده نشده را حذف می کند. همچنین، تمام منابعی که به پروژه خود اضافه کرده اید اما هرگز استفاده نشده اند را حذف می کند.
وقتی برنامه خود را کوچک نمیکنید، همه کتابخانههای شخص ثالثی که در برنامه خود قرار دادهاید مقداری فضا در آن اشغال میکنند. این شامل متدها و توابع استفاده نشده در آن کتابخانه می شود.
به عنوان مثال، هنگامی که یک برنامه کاربردی در Kotlin ایجاد می کنید، برنامه شما کل Kotlin-stdlib را حمل می کند. این بدیهی است که برنامه شما را بسیار بزرگ می کند. به خاطر داشته باشید که ممکن است از برخی کتابخانه های دیگر مانند کتابخانه های Androidx، کتابخانه Jetpack و خدمات Google Play نیز استفاده کرده باشید. چنین برنامه ای قبل از کوچک شدن بسیار بزرگ خواهد بود.
وقتی برنامه خود را کوچک می کنید، کد خود را بهینه می کنید. R8 کد شما را بررسی، بازنویسی و تنظیم مجدد می کند تا کارایی کد را بهبود بخشد. همچنین کدهای مرده ای را که ممکن است وجود داشته باشد، دفع می کند.
برای تامین امنیت، R8 کد مبهم را فراهم می کند. این بدان معنی است که همه نامهای کلاس، متغیرها و توابع موجود در برنامه شما را میگیرد و قبل از ساختن نسخه انتشاری برنامه، به نامهای کوتاه ناخوانا تغییر نام میدهد به عنوان مثال، شما یک کلاس جدید به نام”Constant” برای ذخیره برخی از ثابت هایی که در بخش های مختلف برنامه ما استفاده می شوند، ایجاد کرده اید. R8 نام آن کلاس را به هر نام کوچکتری مثلا "" a یا در هر قالب دیگری تغییر می دهد.
این کار از مهندسی معکوس برنامه شما توسط کاربران مخرب جلوگیری می کند و تمام کارهای فوق در زمان کامپایل توسط کامپایلر R8 انجام می شود.
R8 چندین تکنیک کوچک کردن دارد که شامل موارد زیر است:
این تکنیک عمدتاً بر موارد زیر تمرکز دارد:
1. حذف کد مرده
2. خط کشی انتخابی (Selective inlining)
3. حذف آرگومان استفاده نشده
4. ادغام کلاس ها (Class merging)
این کار نام کلاس ها و بسته ها را کوتاه می کند.
R8 از قوانین proguard برای بهینه سازی کد شما استفاده می کند. تغییر نام همه کلاس ها به دلایل مختلف همیشه توصیه نمی شود. اما R8 ممکن است کدی را که برنامه شما واقعاً به آن نیاز دارد حذف کند. این ممکن است به این دلیل باشد که R8 کد شما را به درستی بررسی نکرده است.
توجه: همیشه برنامه خود را آزمایش کنید تا ببینید آیا مطابق انتظار کار می کند یا خیر. ممکن است یک برنامه در نسخه اشکال زدایی خود از کار نرود، اما ممکن است در نسخه منتشر شده از کار بیفتد. همیشه می توانید گزارشی در مورد کد حذف شده ایجاد کنید تا ببینید کدام کد توسط R8 حذف شده است . به عنوان مثال زمانی که از retrofit در اپلیکیشن خود استفاده می کنید اگر R8 فعال باشد ولی کد Proguard را برای اینکه نام کلاس های retrofit تغییر نکند اضافه نکرده باشید اپلیکیشن شما در نسخه release به درستی کار نمی کند.
برای رفع مشکل خلاص شدن R8 از شر کد مورد نیاز، ما خط کد keep- را به قوانین proguard اضافه می کنیم.
یک مثال به شرح زیر است:
این به R8 می گوید که کلاس با نام ClassName نباید مبهم باشد. همچنین، می توانید برخی از توابع را در داخل کلاس اضافه کنید که به R8 می گوید آن توابع را حفظ کند. یک مثال به شرح زیر است:
در مثال بالا، تابع ()myFunction مبهم نخواهد شد. بقیه توابع داخل آن کلاس مبهم خواهند شد.
همچنین می توانید از حاشیه نویسی keep@ در کلاس به جای -keep در فایل proguard استفاده کنید. افزودن حاشیهنویسی keep@ به R8 میگوید که کاری به آن کلاس انجام ندهد. هنگامی که آن را به یک تابع یا فیلد اضافه می کنید، همین مورد صدق می کند.
در این آموزش دیدیم که R8 ابزاری برای کوچک کردن، بهینهسازی، ایمنسازی و مبهم کردن کد در اندروید است. R8 با وجود استفاده از قوانین ProGuard برای انجام وظایف خود کمی با proguard متفاوت است. هنگام مقایسه این دو، R8 برجسته است و بهترین برای بهینه سازی و کوچک کردن اندازه برنامه شما است.
بقیه آموزش های mister developer را می توانید در تلگرام و اینستاگرام دنبال کنید!!
کانال تلگرام: mister_developerr
اینستاگرام: mister_developerr
امیدوارم این آموزش برای شما مفید بوده باشد.
موفق و پیروز باشید