ProGuard — Android SDK-ga integratsiyalangan, ilovalarni reverse-engineering dan himoya qilish uchun Java bayt-kodini siqish, optimallashtirish va obfuskatsiya qilish vositasi. Google I/O Security Session (2025) ma'lumotlariga ko'ra, ProGuard-ni to'g'ri sozlash APK hajmini 15-25% kamaytiradi va kod sizib chiqish xavfini 60% ga pasaytiradi. Vosita Android-ishlab chiqish uchun standartga aylangan va dunyo bo'ylab millionlab ilovalarda qo'llaniladi.
Asosiy ma'lumotlar
ProGuard — Guardsquare kompaniyasi tomonidan ishlab chiqilgan, Java bayt-kodini qayta ishlash uchun erkin tarqatiladigan vosita. U Android SDK-ga o'rnatilgan va uchta asosiy funksiyani bajaradi: kodni siqish (shrinking), optimallashtirish (optimization) va obfuskatsiya (obfuscation). ProGuard ilova va uning bog'liqliklarining barcha bayt-kodini tahlil qiladi, ishlatilmaydigan sinflar va metodlarni aniqlaydi, ularni olib tashlaydi va keyin qolgan kodni chalkashtiradi.
ProGuard 2000 yilda Erik Lafourj tomonidan Java ilovalarini optimallashtirish vositasi sifatida yaratilgan. 2008 yilda Android-ning paydo bo'lishi bilan ProGuard Android SDK-ga integratsiya qilindi va ilovalarni himoya qilish uchun standart vositasiga aylandi. Guardsquare statistikasiga (2024) ko'ra, ProGuard Google Play-dagi ilovalarning 80% dan ortig'ida, jumladan eng yirik banklar va texnologiya kompaniyalarining ilovalarida qo'llaniladi.
ProGuard qayta ishlashni to'rt bosqichda amalga oshiradi. Birinchi bosqichda (shrink) vosita ilovaning kirish nuqtalarini tahlil qiladi va bajarish vaqtida qaysi sinflar, metodlar va maydonlar erishish mumkinligini aniqlaydi. Ikkinchi bosqichda (optimize) ProGuard unumdorlikni oshirish uchun bayt-kodni o'zgartiradi. Uchinchi bosqich (obfuscate) identifikatorlarni qayta nomlaydi. Yakuniy bosqichda preverify virtual mashinada bayt-kodni tekshirish uchun zarur metama'lumotlarni qo'shadi.
ProGuard-ning uchta asosiy funksiyasining har birini batafsil ko'rib chiqaylik: siqish, optimallashtirish va obfuskatsiya. Har bir mexanizmni tushunish vositani optimal tarzda sozlashga yordam beradi.
ProGuard kirish nuqtalaridan (main metodi, Activity, BroadcastReceiver) chaqiruv grafigini tahlil qiladi va ishlatilmaydigan kodni olib tashlaydi. Retrofit, OkHttp va Gson kabi kutubxonalarga ega odatdagi Android loyihasida siqish bayt-kodning 40% gacha, jumladan kutubxonalarning ishlatilmaydigan metodlari, debug kodi va test sinflarini olib tashlashi mumkin. Bu to'g'ridan-to'g'ri APK hajmini kamaytiradi va ilovani yuklash vaqtini qisqartiradi.
Optimallashtirish bosqichida ProGuard 20 dan ortiq turli xil bayt-kod o'zgartirishlarini amalga oshiradi: qisqa metodlarni inlayn qilish, ishlatilmaydigan parametrlarni olib tashlash, mantiqiy ifodalarni soddalashtirish, bir xil kod bloklarini birlashtirish. Masalan, qisqa getter va setterlar to'g'ridan-to'g'ri maydonga kirish bilan almashtirilishi mumkin. Optimallashtirish ilova tuzilishiga qarab kod bajarilishini 5-15% tezlashtirishi mumkin.
Obfuskatsiya ProGuard-da sinflar, metodlar va maydonlar nomlarini qisqa belgilar ketma-ketligiga o'zgartirish orqali ishlaydi: a, b, c, a.a, a.b va hokazo. Qayta nomlangan elementlarga barcha havolalar avtomatik ravishda butun kod bo'ylab yangilanadi. Shuni ta'kidlash kerakki, obfuskatsiya dasturning xatti-harakatini o'zgartirmaydi, faqat dekompilyatsiya qilingan kodni tushunishni qiyinlashtiradi. Kutubxonalar va umumiy API-lar keep qoidalari orqali obfuskatsiyadan chiqarilishi kerak.
// ProGuard obfuskatsiyasidan oldin
public class LoginManager {
public User authenticateUser(String username, String password) {
// autentifikatsiya mantig'i
}
}
// ProGuard obfuskatsiyasidan keyin
public class a {
public Object a(String b, String c) {
// qayta nomlangan identifikatorlar bilan bir xil mantiq
}
}
ProGuard konfiguratsiyasi — Android ilovasini qurishning muhim bosqichi. Noto'g'ri qoidalar zarur sinflarni olib tashlanishiga va natijada reliz versiyasida crash-larga olib kelishi mumkin.
ProGuard-ni Android loyihasida faollashtirish reliz qurish turi uchun minifyEnabled flagini true ga o'rnatishni o'z ichiga oladi. Standart ProGuard qoidalari Android SDK bilan birga proguard-android-optimize.txt faylida yetkazib beriladi. Foydalanuvchi qoidalari alohida proguard-rules.pro faylida qo'shiladi. Qurish vaqtida ProGuard avval standart qoidalarni, keyin foydalanuvchi qoidalarini qo'llaydi, bu esa asosiy konfiguratsiyani bekor qilish imkonini beradi.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
Foydalanuvchi qoidalar fayli muayyan loyiha uchun xos direktivalarni o'z ichiga oladi. Odatdagi qoidalarga reflection orqali ishlatiladigan sinflarni, Gson/Moshi seriyalash uchun ma'lumot modellarini, kutubxonalarning callback interfeyslarini va maxsus annotatsiyalar bilan belgilangan sinflarni saqlash kiradi. Har bir direktiva -keep, -dontwarn yoki -keepclassmembers kalit so'zi bilan boshlanadi va ProGuard o'zgartirmasligi kerak bo'lgan sinf namunasini aniqlaydi.
# Gson uchun ma'lumot modellarini saqlash
-keep class com.example.data.model.** { *; }
# Reflection orqali ishlatiladigan sinflarni saqlash
-keep class * implements com.google.gson.TypeAdapterFactory
# Kutubxona ogohlantirishlarini e'tiborsiz qoldirish
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# Enum-larni saqlash (ProGuard xususiyati)
-keep class * extends java.lang.Enum { *; }
ProGuard konfiguratsiyasi grammatikasi bir necha toifadagi direktivalarni o'z ichiga oladi, ularning har biri qayta ishlashning ma'lum bir jihatini boshqaradi. To'g'ri sozlash uchun zarur bo'lgan asosiylarini ko'rib chiqaylik.
| Direktiva | Maqsad | Misol |
|---|---|---|
| -keep | Sinfni va uning a'zolarini to'liq saqlash | -keep class com.example.MyClass |
| -keepclassmembers | Faqat sinf a'zolarini saqlash | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Ogohlantirishlarni e'tiborsiz qoldirish | -dontwarn okhttp3.internal.** |
| -keepparameternames | Metod parametrlari nomlarini saqlash | -keepparameternames |
| -keepattributes | Atributlarni saqlash (annotatsiyalar, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Optimallashtirishni o'chirish | -dontoptimize |
ProGuard reflection (Class.forName()), ServiceLoader yoki DEX fayllarini dinamik yuklash orqali yuklangan kodni statik tahlil qila olmaydi. Agar sinf satr nomi bilan yaratilsa, ProGuard uning mavjudligidan xabarsiz va uni ishlatilmaydigan sifatida olib tashlashi mumkin. Bunday barcha sinflar -keep orqali aniq saqlanishi kerak. ProGuard-ni yoqgandan so'ng reliz versiyalarida crash-larning eng keng tarqalgan sababi bu.
Kutubxonalar ko'pincha AAR fayliga o'rnatilgan consumer-rules.pro orqali qurishga avtomatik qo'shiladigan o'z ProGuard qoidalarini o'z ichiga oladi. Android Gradle Plugin qurish vaqtida bu qoidalarni avtomatik qo'llaydi. Dasturchi faqat barcha ishlatilgan kutubxonalar to'g'ri qoidalarni taqdim etishiga ishonch hosil qilishi va kerak bo'lsa ularni loyihada to'ldirishi kerak.
ProGuard-ni yoqgandan so'ng xatolar yuzaga kelganda, stack trace-ni deobfuska qilish uchun mapping faylidan foydalaning. Diagnostika uchun sinfni yakuniy qurishda saqlanish sababini ko'rsatadigan -whyareyoukeeping kalitidan foydalaniladi. -optimizationpasses va -obfuscation ni vaqtincha o'chirish muammoni lokalizatsiya qilish imkonini beradi. Guardsquare ma'lumotlariga ko'ra, ProGuard bilan bog'liq muammolarning 80% reflection sinflari uchun -keep qoidalarini qo'shish bilan hal qilinadi.
Android Gradle Plugin 3.4 (2019) chiqishi bilan Google to'g'ridan-to'g'ri D8/R8 kompilyatoriga integratsiyalangan R8 ni — ProGuard-ning vorisini taqdim etdi. 2023 yilga kelib R8 AGP 8.0 da ProGuard-ni to'liq almashtirdi, ammo loyihalarni migratsiya qilish uchun arxitektura farqlarini tushunish muhimdir.
ProGuard DEX ga o'tkazishdan oldin Java bayt-kodini (.class fayllari) qayta ishlaydigan alohida vosita sifatida ishlaydi. R8 DEX kompilyatoriga integratsiyalangan va kodni pastroq darajada qayta ishlaydi, bu ProGuard-da mavjud bo'lmagan optimallashtirishlarni amalga oshirish imkonini beradi. R8 shuningdek, desugaring — Java 8+ sintaktik shakarini eski Android API darajalari uchun orqaga mos kodga o'tkazishni qo'llab-quvvatlaydi.
Google Android Performance Team (2025) ma'lumotlariga ko'ra, R8 bir xil qoidalar bilan ProGuard bilan solishtirganda 10-15% yaxshiroq kod siqishni ta'minlaydi. R8 tezroq — qurish vaqti 20-30% ga qisqaradi. Bundan tashqari, R8 class fayllari emas, balki DEX darajasida tahlil qilish tufayli ko'proq o'lik kodni olib tashlaydi. R8 ProGuard qoidalari sintaksisi bilan to'liq mos keladi, bu migratsiyani dasturchi uchun shaffof qiladi.
ProGuard-dan R8 ga o'tish oddiy: AGP 8.0+ da standart sifatida R8 ishlatiladi. Eski loyihalarda ProGuard-ni classpath-dan olib tashlash va gradle.properties ni yangilash kerak: android.enableR8=true. ProGuard qoidalari ko'p hollarda o'zgarishsiz R8 bilan mos keladi. O'tishdan so'ng reliz qurilishini barcha maqsadli qurilmalarda sinab ko'rish tavsiya etiladi, chunki R8 ProGuard saqlagan kodni olib tashlashi mumkin.
Tez-tez so'raladigan savollar
Eng keng tarqalgan sabab — reflection, Gson/Moshi seriyalash yoki DEX fayllarini dinamik yuklash bilan kutubxonalar orqali ishlatiladigan sinflarni olib tashlash. Yechim: Class.forName() orqali yaratilgan, Parcelable-ni amalga oshiradigan, JSON orqali seriyalanadigan yoki @Inject bilan belgilangan barcha sinflar uchun -keep qoidalarini qo'shing. Stack trace-ni deobfuska qilish va qurishdan olib tashlangan sinfni aniqlash uchun mapping faylidan foydalaning.
Mapping fayli qurishdan so'ng build/outputs/mapping/release/mapping.txt da joylashgan. Format: asl_nom -> obfuska_qilingan_nom -> tur. Android Studio Build > Analyze APK orqali deobfuskatsiyani qo'llab-quvvatlaydi: APK ni yuklang, stack trace-ni joylashtiring va o'qiladigan sinf nomlarini oling. CI/CD uchun har bir versiya uchun mapping fayllarini alohida repozitoriyada yoki bulutli saqlashda saqlang.
Ha, ProGuard faqat reliz qurilmalari uchun yoqilishi kerak. Debug qurilmalari minifyEnabled false dan foydalanadi, bu kompilyatsiyani tezlashtiradi va tuzatuvchi uchun sinf nomlarini o'qiladigan saqlaydi. Debug rejimida obfuskatsiya tuzatish va bosqichma-bosqich bajarilishiga xalaqit beradi, siqish esa iteratsiyalarni sekinlashtiradi. Obfuskatsiyaning to'g'riligini sinash uchun jismoniy qurilmada reliz qurilmasidan foydalaning.
ProGuard ogohlantirishlari (WARNING) qurishni to'xtatmaydigan, ammo potentsial bajarilish xatolarini ko'rsatishi mumkin bo'lgan muammolarni bildiradi. Agar ogohlantirish crash-ga olib kelmasa, tegishli kutubxona uchun -dontwarn qo'shing. Agar ogohlantirish ilovada ishlatilmaydigan yetishmayotgan sinf bilan bog'liq bo'lsa, yana -dontwarn dan foydalaning. Barcha ogohlantirishlarni tahlil qilmasdan bir vaqtning o'zida e'tiborsiz qoldirish tavsiya etilmaydi.
ProGuard — asosiy funksiyalarga ega bepul vosita: siqish, optimallashtirish, sinf va metod nomlarini o'zgartirish. DexGuard — xuddi shu Guardsquare kompaniyasining tijorat mahsuloti bo'lib, boshqaruv oqimini chalkashtirish, satr va resurslarni shifrlash, tuzatishdan himoya qilish va resurslarni obfuskatsiya qilishni qo'shadi. DexGuard yuqori himoya talablari bo'lgan bank ilovalarida va o'yinlarda qo'llaniladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.