R8 گزینههای سراسری ارائه میدهد که یا بهینهسازیهای R8 را در سراسر برنامه تغییر میدهند یا بر هر قانون keep تأثیر میگذارند. این گزینهها در فایل proguard-rules.pro به همراه قوانین keep نگهداری میشوند. تعدادی از این گزینههای سراسری، بهینهسازی اضافی را پیکربندی میکنند، در حالی که برخی دیگر جنبههای خاصی از بهینهسازی را غیرفعال میکنند.
گزینههای سراسری برای بهینهسازی بیشتر
گزینههای سراسری زیر بهینهسازیهای بیشتری را امکانپذیر میکنند:
-
-repackageclasses [<optional-package-name>]: کلاسها را در یک بسته واحد بستهبندی میکند تا حجم برنامه کاهش یابد. اگر نام بسته اختیاری را وارد نکنید، کلاسها به بسته پیشفرض بدون نام منتقل میشوند. این تنظیم برای برنامهها توصیه میشود زیرا با حذف پیشوند بسته از نام کلاسها، فایلهای DEX کوچکتری ایجاد میکند. -
-allowaccessmodification: به R8 اجازه میدهد تا قابلیت مشاهده کلاسها، فیلدها و متدها را تغییر دهد (معمولاً گسترش دهد) تا بهینهسازیهای گستردهتری انجام دهد. هنگام استفاده ازproguard-android-optimize.txtفعال میشود. از نسخه ۸.۲ افزونه Gradle اندروید (AGP)، اگر بهینهسازی کامل را با R8 فعال کنید، این پیکربندی پیشفرض است.
در زیر مثالی از پیکربندی با بهینهسازی اضافی فعال شده است:
-repackageclasses
-allowaccessmodification
گزینههای سراسری برای محدود کردن بهینهسازی
گزینههای سراسری زیر به شما امکان میدهند جنبههای خاصی از بهینهسازی برنامه را غیرفعال کنید و هنگام اصلاح قوانین نگهداری یا روشن کردن R8 برای اولین بار مفید هستند.
-
-dontoptimize: از بهینهسازی کد، مثلاً inline کردن متد، جلوگیری میکند. این گزینه میتواند در طول توسعه استفاده شود اما نباید در نسخههای نهایی استفاده شود. -
-dontshrink: از حذف کدهای بدون مرجع و بهینهسازی کد جلوگیری میکند. این گزینه میتواند در طول توسعه استفاده شود اما نباید در نسخههای نهایی استفاده شود. -
-dontobfuscate: از کوتاه کردن نام کلاسها و متدها جلوگیری میکند. غیرفعال کردن مبهمسازی در حین اشکالزدایی میتواند مفید باشد تا خواندن ردپاهای پشته آسانتر شود. این گزینه میتواند در طول توسعه استفاده شود اما نباید در نسخههای نهایی استفاده شود. -
-keepattributes <attributes>: فهرستی از ویژگیهایی که باید حفظ شوند و با کاما از هم جدا شدهاند را میپذیرد. اگر از فایل پیشفرضproguard-android-optimize.txtاستفاده نمیکنید ، R8 تمام ویژگیها از جملهRuntimeVisibleAnnotationsوSignatureرا حذف میکند، با این حال، اگر در مواردی مانند reflection به این ویژگیها نیاز باشد، حفظ آنها میتواند مفید باشد. برای فهرستی از ویژگیهایی که میتوانید مشخص کنید، به Keep attributes مراجعه کنید.
ویژگیها را نگه دارید
ویژگیها (Attributes) قطعات اطلاعاتی اضافی هستند که به بخشهای مختلف کد شما متصل میشوند. ویژگیها اطلاعاتی مانند حاشیهنویسیها و امضاهای عمومی را از کد شما ذخیره میکنند.
برخی از عملیات انعکاسی برای اجرای موفقیتآمیز نیاز به ویژگیهای خاصی دارند. برای مثال:
- هنگام دسترسی به ساختار کلاس داخلی یا خارجی با استفاده از
getEnclosingMethod()یاgetDeclaredClasses()، به ویژگیهایEnclosingMethodوInnerClassesنیاز است. - هنگام دسترسی به امضاهای عمومی با استفاده از
getTypeParameters()، ویژگیSignatureمورد نیاز است. هنگام دسترسی به حاشیهنویسیها با استفاده از
getAnnotation()، ویژگیRuntimeVisibleAnnotationsمورد نیاز است.
ویژگیهای مورد نیاز رایج
هنگام استفاده از فایل پیشفرض Proguard ( proguard-android-optimize.txt یا proguard-android.txt )، افزونه Android Gradle (AGP) ویژگیهای زیر را حفظ میکند. توجه داشته باشید که برخی از این ویژگیها به نسخههای جدیدتر AGP نیاز دارند:
| ویژگی | توضیحات |
|---|---|
AnnotationDefault | این ویژگی در خود انواع حاشیهنویسی یافت میشود و مقدار پیشفرض را برای یک عنصر حاشیهنویسی ذخیره میکند. توجه: این ویژگی از زمان AGP 7.1 به طور پیشفرض حفظ شده است و فقط باید به طور صریح در برنامههایی که از نسخههای قبلی AGP استفاده میکنند، حفظ شود. |
EnclosingMethod | این ویژگی در کلاسهای داخلی که کلاسهای محلی یا ناشناس نیستند، وجود دارد. این ویژگی، متد یا مقداردهی اولیهای را که بلافاصله شامل کلاس میشود، مشخص میکند. |
InnerClasses | این ویژگی اطلاعات مربوط به کلاسهای تودرتو (کلاسهای داخلی، کلاسهای تودرتوی ایستا، کلاسهای محلی و کلاسهای ناشناس) را که درون کلاس دیگری تعریف شدهاند، ثبت میکند. |
LineNumberTable | این ویژگی، دستورالعملهای بایتکد را به شماره خطوط متناظرشان در فایل منبع اصلی نگاشت میکند. نکته: این ویژگی از نسخه ۸.۶ افزونه اندروید گریدل (AGP) به صورت پیشفرض حفظ شده است و فقط باید در برنامههایی که از نسخههای قبلی AGP استفاده میکنند، به صورت صریح نگهداری شود. |
RuntimeVisibleAnnotations | این ویژگی حاشیهنویسیهایی را ذخیره میکند که در زمان اجرا توسط reflection قابل مشاهده هستند. معمولاً، اگر از حاشیهنویسیها در زمان اجرا استفاده شود، این تنها حاشیهنویسی از ویژگیهای *Annotation است که توسط برنامهها و در قوانین مصرفکننده کتابخانه مورد نیاز است. |
RuntimeVisibleParameterAnnotations | این ویژگی، حاشیهنویسیهایی را ذخیره میکند که در زمان اجرا با انعکاس پارامترهای یک متد قابل مشاهده هستند. |
RuntimeVisibleTypeAnnotations | این ویژگی حاشیهنویسیهایی را ذخیره میکند که به جای اعلانها، برای کاربردهای نوع اعمال میشوند. این ویژگی در زمان اجرا قابل مشاهده است. |
Signature | این ویژگی، امضای نوع عمومیتری را برای کلاسها، متدها و فیلدها ذخیره میکند، بهویژه زمانی که از ژنریکها (مانند List<String> ) استفاده میکنند. |
SourceFile | این ویژگی نام فایل منبع (فایل .kt یا .java ) را که یک کلاس از آن کامپایل شده است، ذخیره میکند. این ویژگی در درجه اول توسط اشکالزداها برای نمایش خطوط کد منبع اصلی هنگام بررسی کد کامپایل شده جاوا استفاده میشود. این ویژگی به توسعهدهندگان کمک میکند تا اجرا را تا کد نوشته شده خود ردیابی کنند.توجه: این ویژگی از زمان AGP 8.2 به طور پیشفرض حفظ شده است و فقط باید در برنامههایی که از نسخههای قبلی AGP استفاده میکنند، به صراحت حفظ شود. |
برای برنامههایی که از proguard-android-optimize.txt استفاده میکنند، قوانین keep تعریفشده توسط AGP در اکثر سناریوها کافی هستند. با این حال، اگر در حال نوشتن کد برای یک کتابخانه هستید، باید تمام ویژگیهای مورد نیاز کتابخانه خود را در قوانین keep مصرفکننده آن مشخص کنید، حتی اگر در این لیست تعریف شده باشند. این کار تضمین میکند که اگر توسعهدهندگان تصمیم بگیرند proguard-android-optimize.txt را لحاظ نکنند، کتابخانه شما قوی خواهد بود.
ویژگیهای اضافی برای نگهداری
شما میتوانید ویژگیهای اضافی را برای نگهداشتن مشخص کنید، با این حال، آنها برای اکثریت قریب به اتفاق سناریوهای دسترسی بازتابی یا JNI مورد نیاز نیستند. با این حال، برخی از این موارد ممکن است هنوز هم هنگام بهینهسازی کتابخانهها مورد استفاده قرار گیرند.
| ویژگی | توضیحات |
|---|---|
MethodParameters | این ویژگی اطلاعاتی در مورد پارامترهای یک متد، به ویژه نامها و پرچمهای دسترسی آنها، ارائه میدهد. |
Exceptions | این ویژگی، استثنائات بررسیشدهای را که یک متد برای بروز آنها تعریف شده است، فهرست میکند. این ویژگی معمولاً برای برنامهها استفاده نمیشود. برای نویسندگان کتابخانه، معمولاً در قوانین نگهداری مصرفکننده استفاده نمیشود، اما اغلب هنگام ساخت کتابخانهها مورد استفاده قرار میگیرد. برای جزئیات بیشتر در مورد بهینهسازی کتابخانهها، به بهینهسازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleAnnotations | این ویژگی، حاشیهنویسیهایی را ذخیره میکند که در زمان اجرا روی یک کلاس، فیلد یا متد با reflection قابل مشاهده نیستند. توسعهدهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرفکننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانهها استفاده میشود. برای جزئیات بیشتر در مورد بهینهسازی کتابخانهها، به بهینهسازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleParameterAnnotations | این ویژگی، حاشیهنویسیهایی را ذخیره میکند که در زمان اجرا با reflection روی پارامترهای یک متد قابل مشاهده نیستند. توسعهدهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرفکننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانهها استفاده میشود. برای جزئیات بیشتر در مورد بهینهسازی کتابخانهها، به بهینهسازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleTypeAnnotations | این ویژگی حاشیهنویسیهایی را ذخیره میکند که به جای اعلانها، برای کاربردهای نوع اعمال میشوند. این ویژگی در زمان اجرا قابل مشاهده نیست. توسعهدهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرفکننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانهها استفاده میشود. برای جزئیات بیشتر در مورد بهینهسازی کتابخانهها، به بهینهسازی برای نویسندگان کتابخانه مراجعه کنید. |