ProGuard یک ابزار رایگان و اوپن سورس است، که برای فشرده (Shrink)، بهینه (Optimize) و ناخوانا (Obfuscate) کردن کلاسهای جاوا مورد استفاده قرار میگیرد. اما همونطور که به عنوان یک توسعه دهنده اندروید، اطلاع دارید، به طور معمول تنظیمات مربوط به Ruleهای ProGuard، کار چندان سادهای نیست و احتمالا تا به حال برای شما نیر اتفاق افتاده که بعد از Build نسخه ریلیز به مشکلاتی در رابطه با تغییرات اعمال شده توسط آن برخورده باشید.
در ادامه قصد دارم کتابخانهای را به شما معرفی کنم که امکان استفاده از ProGuard را برای شما بسیار سادهتر خواهد کرد، این کتابخوانه با استفاده از دو انوتیشن @Keep و @KeepName این امکان را برای شما فراهم میکند که به سادگی از اعمال تغییرات توسط ProGuard مصون نگه دارید.
کتابخانهای که در بالا به آن اشاره شد Squad Leader نام دارد و در مخزن Maven Central در دسترس هست و به سادگی با اضافه کردن آن مطابق کد زیر به پیش نیازهای پروژه خود میتوانید آن را در دسترس داشته باشید.
dependencies {
compile 'nl.littlerobots.squadleader:squadleader:1.2'
}
بعد از اضافه کردن کد بالا در تنظیمات Gradle و دوباره سازی و Rebuild پروژه به سادگی و با استفاده از Annotation های فوق الذکر به شکلی که در ادامه مشاهده میکنید، قادر به جلوگیری از اعمال تغییرات توسط ProGuard خواهید بود.
import nl.littlerobots.squadleader.Keep;
import nl.littlerobots.squadleader.KeepName;
public class Example {
@KeepName
// this field will be stripped if it's unused in your code
public String stringTheory;
@Keep
// this field will be kept, even if it's unused
public boolean myBool;
}
همانطور که در کد بالا مشاهده میکنید تفاوت @Keep و @KeepName در این است که در هنگام استفاده از @Keep حتی اگر کلاس، پروپرتی یا متود مورد نظر در جایی استفاده نشده باشد، توسط ProGuard حذف نخواهد شد، در حالی که با ستفاده از @KeepName شما این اجازه را به ProGuard میدهید تا در صورت عدم استفاده، کلاس، پروپرتی یا متود مربوطه را خذف یا ناخوانا کند. همانطور که در مثال زیر میبینید شما قادر به استفاده از این انوتیشنها بر روی کل یک کلاس نیز خواهید بود.
@Keep
// this class is not stripped or obfuscated
public class Example {
public String stringTheory;
public boolean myBool;
}
منبع