R8 گزینههای جهانی را ارائه میکند که یا بهینهسازیهای R8 را در سراسر برنامه تغییر میدهند یا بر هر قانون حفظ تأثیر میگذارند. این گزینه ها در فایل proguard-rules.pro
همراه با قوانین حفظ نگهداری می شوند. تعدادی از این گزینههای کلی بهینهسازی اضافی را پیکربندی میکنند، در حالی که برخی دیگر جنبههای خاصی از بهینهسازی را خاموش میکنند.
گزینه های جهانی برای بهینه سازی اضافی
گزینه های جهانی زیر بهینه سازی اضافی را فعال می کنند:
-
-repackageclasses [<optional-package-name>]
: برای کاهش بیشتر اندازه برنامه، کلاسها را در یک بسته مشخص شده مجدداً بستهبندی میکند. اگر نام بسته اختیاری را وارد نکنید، کلاس ها به بسته خالی و پیش فرض منتقل می شوند. این یک تنظیم توصیه شده برای برنامه ها است. -
-allowaccessmodification
: به R8 اجازه میدهد تا دید کلاسها، فیلدها و روشها را تغییر دهد (معمولاً گستردهتر شود) تا بهینهسازیهای گستردهتری انجام دهد. وقتیproguard-android-optimize.txt
استفاده می شود فعال می شود. از آنجایی که Android Gradle Plugin (AGP) 8.2 است، اگر از R8 در حالت کامل استفاده می کنید، این پیکربندی پیش فرض است.
در زیر نمونه ای از پیکربندی با بهینه سازی اضافی فعال شده است:
-repackageclasses
-allowaccessmodification
گزینه های جهانی برای محدود کردن بهینه سازی
گزینههای کلی زیر به شما امکان میدهند جنبههای خاصی از بهینهسازی برنامه را خاموش کنید، و زمانی که قوانین حفظ خود را اصلاح میکنید یا برای اولین بار R8 را روشن میکنید، مفید هستند.
-
-dontoptimize
: از بهینهسازی کد جلوگیری میکند، بهعنوان مثال درونسازی روش. این گزینه را می توان در طول توسعه استفاده کرد اما نباید در ساخت های تولیدی استفاده شود. -
-dontshrink
: از حذف کدهای ارجاع نشده و بهینه سازی کد جلوگیری می کند. این گزینه را می توان در طول توسعه استفاده کرد اما نباید در ساخت های تولیدی استفاده شود. -
-dontobfuscate
: از کوتاه شدن نام کلاس ها و متدها جلوگیری می کند. خاموش کردن مبهمسازی در حین اشکالزدایی میتواند مفید باشد تا ردپای پشتهها راحتتر خوانده شوند. این گزینه را می توان در طول توسعه استفاده کرد اما نباید در ساخت های تولیدی استفاده شود. -
-keepattributes <attributes>
: فهرستی از ویژگیهای جدا شده با کاما را میپذیرد که باید حفظ شوند. اگر از پیشفرضproguard-android-optimize.txt
استفاده نمیکنید ، R8 تمام ویژگیها از جملهRuntimeVisibleAnnotations
وSignature
را حذف میکند، اما حفظ این ویژگیها در صورت نیاز در مواردی مانند بازتاب میتواند مفید باشد. برای فهرستی از ویژگیهایی که میتوانید مشخص کنید، ویژگیهای Keep را ببینید.
صفات را حفظ کنید
ویژگی ها قطعات اضافی اطلاعاتی هستند که به قسمت های مختلف کد شما متصل می شوند. ویژگی ها اطلاعاتی مانند حاشیه نویسی و امضاهای عمومی را از کد شما ذخیره می کنند.
برخی از عملیات بازتابی برای اجرای موفقیت آمیز نیاز به ویژگی های خاصی دارند. به عنوان مثال:
- هنگام دسترسی به ساختار کلاس داخلی یا خارجی با استفاده از
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 | این ویژگی دستورالعمل های بایت کد را به شماره خطوط مربوطه آنها در فایل منبع اصلی نگاشت می کند. توجه: این ویژگی بهطور پیشفرض از پلاگین Gradle Android (AGP) 8.6 حفظ میشود و فقط باید صریحاً در برنامههایی که از نسخههای قبلی AGP استفاده میکنند نگهداری شود. |
RuntimeVisibleAnnotations | این ویژگی یادداشت هایی را ذخیره می کند که در زمان اجرا با بازتاب قابل مشاهده هستند. به طور معمول، اگر حاشیه نویسی در زمان اجرا استفاده می شود، این تنها حاشیه نویسی از ویژگی های *Annotation است که توسط برنامه ها و قوانین مصرف کننده کتابخانه مورد نیاز است. |
RuntimeVisibleParameterAnnotations | این ویژگی حاشیه نویسی هایی را ذخیره می کند که در زمان اجرا با بازتاب پارامترهای یک متد قابل مشاهده هستند. |
RuntimeVisibleTypeAnnotations | این ویژگی حاشیه نویسی هایی را ذخیره می کند که به جای اعلان ها، برای استفاده های نوع اعمال می شود. این ویژگی در زمان اجرا قابل مشاهده است. |
Signature | این ویژگی یک نوع امضای عمومیتر را برای کلاسها، متدها و فیلدها ذخیره میکند، بهویژه زمانی که از ژنریک استفاده میکنند (مانند List<String> ). |
SourceFile | این ویژگی نام فایل منبع (فایل .kt یا .java ) را که یک کلاس از آن کامپایل شده است را ذخیره می کند. در درجه اول توسط دیباگرها برای نمایش خطوط کد منبع اصلی هنگام عبور از کد جاوا کامپایل شده استفاده می شود. این به توسعه دهندگان کمک می کند تا اجرا را به کد نوشته شده خود ردیابی کنند.توجه: این ویژگی بهطور پیشفرض از AGP 8.2 حفظ میشود و فقط باید صریحاً در برنامههایی که از نسخههای قبلی AGP استفاده میکنند نگهداری شود. |
برای برنامه هایی که از proguard-android-optimize.txt
استفاده می کنند، قوانین حفظ تعریف شده توسط AGP در اکثر سناریوها کافی است. با این حال، اگر در حال نوشتن کد برای یک کتابخانه هستید، باید تمام ویژگی های مورد نیاز کتابخانه خود را در قوانین نگهداری مصرف کننده آن مشخص کنید، حتی اگر در این لیست تعریف شده باشند. اگر توسعهدهندگان تصمیم بگیرند که proguard-android-optimize.txt
را اضافه نکنند، این اطمینان حاصل میکند که کتابخانه شما قوی است.
ویژگی های اضافی نگهداری
میتوانید ویژگیهای اضافی را برای نگهداری مشخص کنید، اما برای اکثریت قریب به اتفاق سناریوهای دسترسی بازتابی یا JNI مورد نیاز نیستند. با این حال، برخی از این موارد ممکن است اغلب در حین بهینه سازی کتابخانه ها استفاده شوند.
صفت | توضیحات |
---|---|
MethodParameters | این ویژگی اطلاعاتی در مورد پارامترهای یک متد، به ویژه نام و پرچم دسترسی آنها را ارائه می دهد. |
Exceptions | این ویژگی استثناهای علامتگذاری شدهای را که یک متد برای پرتاب کردن آنها اعلام شده است فهرست میکند. این ویژگی معمولاً برای برنامه ها استفاده نمی شود. برای نویسندگان کتابخانه، معمولاً در قوانین نگهداری مصرف کننده استفاده نمی شود، اما اغلب هنگام ساخت کتابخانه ها استفاده می شود. برای جزئیات در مورد بهینه سازی کتابخانه ها، به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleAnnotations | این ویژگی حاشیه نویسی هایی را ذخیره می کند که با بازتاب در زمان اجرا روی یک کلاس، فیلد یا متد قابل مشاهده نیستند. توسعه دهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرف کننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانه استفاده می شود. برای جزئیات در مورد بهینه سازی کتابخانه ها، به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleParameterAnnotations | این ویژگی حاشیه نویسی هایی را ذخیره می کند که با بازتاب در زمان اجرا روی پارامترهای یک متد قابل مشاهده نیستند. توسعه دهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرف کننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانه استفاده می شود. برای جزئیات در مورد بهینه سازی کتابخانه ها، به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید. |
RuntimeInvisibleTypeAnnotations | این ویژگی حاشیه نویسی هایی را ذخیره می کند که به جای اعلان ها، برای استفاده های نوع اعمال می شود. این ویژگی در زمان اجرا قابل مشاهده نیست. توسعه دهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرف کننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانه استفاده می شود. برای جزئیات در مورد بهینه سازی کتابخانه ها، به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید. |