هنگامی که بهینه سازی برنامه را با تنظیمات پیش فرض فعال می کنید ، R8 بهینه سازی های گسترده ای را انجام می دهد تا مزایای عملکرد شما را به حداکثر برساند. R8 تغییرات قابل توجهی در کد از جمله تغییر نام، جابجایی و حذف کلاسها، فیلدها و متدها ایجاد میکند. اگر مشاهده کردید که این تغییرات باعث خطا میشوند، باید مشخص کنید که کدام قسمتهای کد R8 نباید با اعلام آنهایی که در قوانین حفظ هستند، اصلاح شوند.
سناریوهای رایجی که نیازمند حفظ قوانین هستند
R8 تمام تماس های مستقیم را در کد شما شناسایی و حفظ می کند. با این حال، R8 نمیتواند استفاده از کد غیرمستقیم را ببیند، که میتواند باعث حذف کد مورد نیاز برنامه شما شود و باعث خرابی شود. از قوانین حفظ استفاده کنید تا به R8 بگویید این کدهای غیرمستقیم را حفظ کند. چند موقعیت متداول که احتمالاً به حفظ قوانین نیاز دارید به شرح زیر است:
- کد قابل دسترسی با انعکاس: R8 نمیتواند تشخیص دهد که چه زمانی کلاسها، فیلدها یا متدها با بازتاب قابل دسترسی هستند. برای مثال، R8 نمیتواند متدی را که با استفاده از
Class.getDeclaredMethod()
یا حاشیهنویسی بازیابی شده باClass.getAnnotation()
جستجو شده است، شناسایی کند. در این موارد، R8 ممکن است نام این متدها و حاشیه نویسی ها را تغییر دهد یا آنها را به طور کامل حذف کند، که منجر به یکClassNotFoundException
یا یکNoSuchMethodException
در زمان اجرا شود. - کد فراخوانی شده از رابط بومی جاوا (JNI): هنگامی که کد بومی (C یا C++) یک متد جاوا یا کاتلین را فراخوانی میکند، یا کد جاوا یا کاتلین کد C++ را با JNI فراخوانی میکند، فراخوانی بر اساس جستجوی رشتهای پویا از نام روش انجام میشود. R8 نمی تواند فراخوانی متد مبتنی بر رشته پویا را ببیند، بنابراین بهینه سازی های آن ممکن است کد شما را خراب کند.
این فهرست جامعی از سناریوهایی نیست که به حفظ قوانین نیاز دارند، اما این سناریوها بیشتر مواردی را که ممکن است به حفظ قوانین نیاز داشته باشید، پوشش میدهند.
چگونه قوانین حفظ را به برنامه خود اضافه کنید
شما باید قوانین خود را به یک فایل proguard-rules.pro
که در دایرکتوری اصلی ماژول برنامه قرار دارد اضافه کنید - ممکن است فایل قبلاً آنجا باشد، اما اگر نیست، آن را ایجاد کنید. برای اعمال قوانین موجود در فایل، باید فایل را در فایل build.gradle.kts
(یا build.gradle
) سطح ماژول خود، همانطور که در کد زیر نشان داده شده است، اعلام کنید:
کاتلین
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules "proguard-rules.pro" ) // ... } } // ... }
شیار
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // File with default rules provided by the Android Gradle Plugin getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) // ... } } // ... }
به طور پیش فرض، فایل ساخت شما شامل فایل proguard-android-optimize.txt
نیز می شود. این فایل شامل قوانینی است که برای اکثر پروژه های اندروید مورد نیاز است، بنابراین باید اجازه دهید در فایل ساخت باقی بماند. این فایل بر اساس فایل proguard-common.txt
است و محتوا را با آن به اشتراک می گذارد.
برنامه های بزرگتر معمولاً دارای کد در چندین ماژول کتابخانه هستند. در چنین مواردی، اغلب بهتر است قوانین حفظ را در کنار کدی که در ماژول کتابخانه خاص اعمال میشود، قرار دهید. تفاوت اساسی در حفظ قوانین حفظ برای کتابخانه ها در نحوه بیان این قوانین در فایل build.gradle.kts
(یا build.gradle
) ماژول کتابخانه شما نهفته است. برای کسب اطلاعات بیشتر به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید.
یک قانون نگه داشتن اضافه کنید
وقتی قوانین حفظ را اضافه میکنید، میتوانید گزینههای سراسری را اضافه کنید و همچنین قوانین حفظ خود را تعریف کنید.
- گزینه های جهانی : گزینه های جهانی دستورالعمل های کلی هستند که بر نحوه عملکرد R8 در کل پایگاه کد شما تأثیر می گذارد. برای کسب اطلاعات بیشتر، گزینه های جهانی را ببینید.
- قوانین Keep : قوانین Keep باید با دقت طراحی شوند تا مطمئن شوید که تعادل مناسبی بین بهینهسازی کد به حداکثر میرسانید بدون اینکه برنامه شما ناخواسته شکسته شود. برای یادگیری نحو برای قوانین حفظ خود، به نحو قوانین Keep مراجعه کنید.
قوانین را برای نویسندگان کتابخانه حفظ کنید
پس از یادگیری در مورد گزینه های جهانی و نحو برای قوانین حفظ، برای جزئیات بیشتر به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید.