وقتی بهینهسازی برنامه را با تنظیمات پیشفرض فعال میکنید ، 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 را به برنامه خود اضافه کنیم
پیکربندی قوانین Keep شما به نسخه AGP مورد استفاده شما بستگی دارد.
برنامههای بزرگتر معمولاً کدی در چندین ماژول کتابخانه دارند. در چنین مواردی، اغلب بهتر است قوانین keep را در کنار کدی که در ماژول کتابخانه خاص به آن اعمال میشوند، قرار دهید. تفاوت اساسی در حفظ قوانین keep برای کتابخانهها در نحوه اعلام این قوانین در فایل build.gradle.kts (یا build.gradle ) ماژول کتابخانه شما نهفته است. برای کسب اطلاعات بیشتر به بخش بهینهسازی برای نویسندگان کتابخانه مراجعه کنید.
برای نسخههای AGP 9.3 و بالاتر
قوانین خود را به فایلی با پسوند .keep در دایرکتوری src/<variant>/keepRules اضافه کنید. برای مثال، src/main/keepRules/custom-rules.keep . توجه داشته باشید که استفاده از DSL بهروزرسانیشده برای AGP 9.3 و بالاتر، بهینهسازی کد و منابع را فعال میکند و نیازی نیست که شما صریحاً فایل پیشفرض قوانین Keep اندروید ( proguard-android-optimize.txt ) را تعریف کنید، زیرا به طور پیشفرض گنجانده شده است، مگر اینکه صریحاً حذف شود.
کاتلین
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
گرووی
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
}
}
}
}
حذف قوانین پیشفرض پلتفرم اندروید (پیشرفته)
AGP مجموعهای از قوانین پیشفرض پلتفرم اندروید را ارائه میدهد. برای حذف این قوانین از پیکربندی پروژه و مدیریت تمام قوانین keep توسط خودتان، optimization.keepRules.includeDefault را روی false تنظیم کنید.
کاتلین
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
گرووی
android {
buildTypes {
release {
optimization {
enable = true // Enables code and resource optimizations.
keepRules {
includeDefault = false // The file with optimization
// rules for the Android platform is included by
// default. To omit this file, set this option to false.
}
}
}
}
}
DSL قدیمی برای نسخههای AGP پایینتر از ۹.۳
قوانین خود را به فایل proguard-rules.pro واقع در دایرکتوری ریشه ماژول app اضافه کنید - ممکن است این فایل از قبل وجود داشته باشد، اما اگر اینطور نیست، آن را ایجاد کنید. برای اعمال قوانین در فایل، باید فایل را در فایل build.gradle.kts (یا build.gradle ) در سطح ماژول خود تعریف کنید.
به طور پیشفرض، فایل ساخت شما شامل فایل proguard-android-optimize.txt نیز میشود. این فایل شامل قوانینی است که برای اکثر پروژههای اندروید مورد نیاز است، بنابراین باید اجازه دهید در فایل ساخت باقی بماند. این فایل بر اساس فایل proguard-common.txt شده و محتوای آن را با آن به اشتراک میگذارد.
DSL قدیمی (کاتلین)
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
// Default file with default optimization rules.
getDefaultProguardFile("proguard-android-optimize.txt"),
...
)
}
}
}
DSL قدیمی (Groovy)
android {
buildTypes {
release {
minifyEnabled = true
shrinkResources = true
// Default file with default optimization rules.
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt')
...
}
}
}
اضافه کردن قانون نگه داشتن
وقتی قوانین Keep را اضافه میکنید، میتوانید گزینههای سراسری را اضافه کنید و همچنین قوانین Keep خودتان را تعریف کنید.
گزینههای سراسری : گزینههای سراسری، دستورالعملهای کلی هستند که بر نحوه عملکرد R8 در کل پایگاه کد شما تأثیر میگذارند. برای کسب اطلاعات بیشتر، به گزینههای سراسری مراجعه کنید.
قوانین Keep : قوانین Keep باید با دقت طراحی شوند تا از ایجاد تعادل مناسب بین بهینهسازی حداکثری کد بدون اختلال ناخواسته در برنامهتان اطمینان حاصل شود. برای یادگیری نحوه نوشتن قوانین Keep، به بخش افزودن قوانین Keep مراجعه کنید.
قوانین مربوط به نویسندگان کتابخانه را رعایت کنید
پس از آشنایی با گزینههای سراسری و سینتکس قوانین keep، برای جزئیات بیشتر به بخش بهینهسازی برای نویسندگان کتابخانه مراجعه کنید.