R8 گزینههای جهانی را ارائه میکند که یا بهینهسازیهای R8 را در سراسر برنامه تغییر میدهند یا بر هر قانون حفظ تأثیر میگذارند. این گزینه ها در فایل proguard-rules.pro
همراه با قوانین حفظ نگهداری می شوند. تعدادی از این گزینههای کلی بهینهسازی اضافی را پیکربندی میکنند، در حالی که برخی دیگر جنبههای خاصی از بهینهسازی را خاموش میکنند.
گزینه های جهانی برای بهینه سازی اضافی
گزینه های جهانی زیر بهینه سازی اضافی را فعال می کنند:
-
-repackageclasses [<optional-package-name>]
: کلاسها را در یک بسته واحد مجدداً بستهبندی میکند تا اندازه برنامه کاهش یابد. اگر نام بسته اختیاری را ارائه نکنید، کلاس ها به بسته پیش فرض بدون نام منتقل می شوند. این تنظیم توصیهشده برای برنامهها است، زیرا با حذف پیشوند بسته از نام کلاسها منجر به ایجاد فایلهای DEX کوچکتر میشود. -
-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 | این ویژگی حاشیه نویسی هایی را ذخیره می کند که به جای اعلان ها، برای استفاده های نوع اعمال می شود. این ویژگی در زمان اجرا قابل مشاهده نیست. توسعه دهندگان برنامه نباید این ویژگی را حفظ کنند. برای نویسندگان کتابخانه، این ویژگی در قوانین نگهداری مصرف کننده مرتبط نیست، اما اغلب هنگام ساخت کتابخانه استفاده می شود. برای جزئیات در مورد بهینه سازی کتابخانه ها، به بهینه سازی برای نویسندگان کتابخانه مراجعه کنید. |