وقتی بهینهسازی برنامه را با تنظیمات پیشفرض فعال میکنید ، R8 بهینهسازیهای گستردهای را برای به حداکثر رساندن مزایای عملکرد شما انجام میدهد. R8 تغییرات قابل توجهی در کد ایجاد میکند، از جمله تغییر نام، جابجایی و حذف کلاسها، فیلدها و متدها. اگر مشاهده کردید که این تغییرات باعث ایجاد خطا میشوند، باید با اعلام بخشهایی از کد که R8 نباید تغییر دهد، آنها را در قوانین keep تعریف کنید.
سناریوهای رایجی که نیاز به قوانین Keep دارند
R8 تمام فراخوانیهای مستقیم در کد شما را شناسایی و ذخیره میکند. با این حال، R8 نمیتواند کاربردهای غیرمستقیم کد را ببیند، که میتواند باعث شود کدی را که برنامه شما به آن نیاز دارد حذف کند و باعث خرابی شود. از قوانین keep برای گفتن به R8 استفاده کنید تا چنین کدهای غیرمستقیمی را حفظ کند. چند موقعیت رایج که احتمالاً به قوانین keep نیاز دارید به شرح زیر است:
- کدی که توسط reflection قابل دسترسی است: R8 نمیتواند تشخیص دهد که چه زمانی به کلاسها، فیلدها یا متدها با reflection دسترسی پیدا میشود. برای مثال، R8 نمیتواند متدی را که با استفاده از
Class.getDeclaredMethod()با نامش جستجو میشود یا حاشیهنویسی که باClass.getAnnotation()بازیابی میشود، شناسایی کند. در این موارد، R8 ممکن است این متدها و حاشیهنویسیها را تغییر نام دهد یا آنها را به طور کامل حذف کند که منجر به خطایClassNotFoundExceptionیاNoSuchMethodExceptionدر زمان اجرا میشود. - کدی که از رابط بومی جاوا (JNI) فراخوانی میشود: وقتی کد بومی (C یا C++) یک متد جاوا یا کاتلین را فراخوانی میکند، یا کد جاوا یا کاتلین کد C++ را با JNI فراخوانی میکند، این فراخوانی بر اساس جستجوی رشتهای پویا از نام متد انجام میشود. R8 نمیتواند فراخوانی متد مبتنی بر رشته پویا را ببیند، بنابراین بهینهسازیهای آن ممکن است کد شما را خراب کند.
این لیست کاملی از سناریوهایی که نیاز به قوانین keep دارند نیست، اما این سناریوها اکثر مواردی را که ممکن است به قوانین keep نیاز داشته باشید، پوشش میدهند.
چگونه قوانین Keep را به برنامه خود اضافه کنیم
شما باید قوانین خود را به فایل proguard-rules.pro واقع در دایرکتوری ریشه ماژول app اضافه کنید - ممکن است این فایل از قبل وجود داشته باشد، اما اگر اینطور نیست، آن را ایجاد کنید. برای اعمال قوانین در فایل، باید فایل را در فایل 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 شده و محتوای آن را با آن به اشتراک میگذارد.
برنامههای بزرگتر معمولاً کدی در چندین ماژول کتابخانه دارند. در چنین مواردی، اغلب بهتر است قوانین keep را در کنار کدی که در ماژول کتابخانه خاص به آن اعمال میشوند، قرار دهید. تفاوت اساسی در حفظ قوانین keep برای کتابخانهها در نحوه اعلام این قوانین در فایل build.gradle.kts (یا build.gradle ) ماژول کتابخانه شما نهفته است. برای کسب اطلاعات بیشتر به بخش بهینهسازی برای نویسندگان کتابخانه مراجعه کنید.
اضافه کردن قانون نگه داشتن
وقتی قوانین Keep را اضافه میکنید، میتوانید گزینههای سراسری را اضافه کنید و همچنین قوانین Keep خودتان را تعریف کنید.
گزینههای سراسری : گزینههای سراسری، دستورالعملهای کلی هستند که بر نحوه عملکرد R8 در کل پایگاه کد شما تأثیر میگذارند. برای کسب اطلاعات بیشتر، به گزینههای سراسری مراجعه کنید.
قوانین Keep : قوانین Keep باید با دقت طراحی شوند تا از ایجاد تعادل مناسب بین بهینهسازی حداکثری کد بدون اختلال ناخواسته در برنامهتان اطمینان حاصل شود. برای یادگیری نحوه نوشتن قوانین Keep، به بخش افزودن قوانین Keep مراجعه کنید.
قوانین مربوط به نویسندگان کتابخانه را رعایت کنید
پس از آشنایی با گزینههای سراسری و سینتکس قوانین keep، برای جزئیات بیشتر به بخش بهینهسازی برای نویسندگان کتابخانه مراجعه کنید.