ProGuard — Android SDK-ya inteqrasiya edilmiş, proqramları reverse-engineering-dən qorumaq üçün Java bayt-kodunun sıxışdırılması, optimallaşdırılması və obfuskasiyası alətidir. Google I/O Security Session (2025) məlumatına görə, ProGuard-ın düzgün konfiqurasiyası APK ölçüsünü 15-25% azaldır və kod sızması riskini 60% aşağı salır. Alət Android inkişafı üçün standarta çevrilib və dünyada milyonlarla proqramda istifadə olunur.
Əsas məqamlar
ProGuard — Guardsquare şirkəti tərəfindən hazırlanmış, Java bayt-kodunun emalı üçün sərbəst yayılan alət. Android SDK-ya daxildir və üç əsas funksiyanı yerinə yetirir: kodun sıxışdırılması (shrinking), optimallaşdırılması (optimization) və obfuskasiyası (obfuscation). ProGuard proqramın və onun asılılıqlarının bütün bayt-kodunu təhlil edir, istifadə olunmayan sinif və metodları müəyyənləşdirir, onları silir və sonra qalan kodu gizlədir.
ProGuard 2000-ci ildə Erik Lafourge tərəfindən Java proqramlarının optimallaşdırılması aləti kimi yaradılmışdır. 2008-ci ildə Android-in meydana çıxması ilə ProGuard Android SDK-ya inteqrasiya edildi və proqramların qorunması üçün standart alətə çevrildi. Guardsquare statistikasına (2024) görə, ProGuard Google Play-dəki proqramların 80%-dən çoxunda, o cümlədən ən böyük bankların və texnologiya şirkətlərinin proqramlarında istifadə olunur.
ProGuard emalı dörd mərhələdə həyata keçirir. Birinci mərhələdə (shrink) alət proqramın giriş nöqtələrini təhlil edir və icra zamanı hansı siniflərin, metodların və sahələrin əldə edilə biləcəyini müəyyənləşdirir. İkinci mərhələdə (optimize) ProGuard məhsuldarlığı artırmaq üçün bayt-kodu çevirir. Üçüncü mərhələ (obfuscate) identifikatorların adlarını dəyişdirir. Son mərhələdə preverify virtual maşında bayt-kodun yoxlanılması üçün zəruri metadata əlavə edir.
ProGuard-ın üç əsas funksiyasının hər birini ətraflı nəzərdən keçirək: sıxışdırma, optimallaşdırma və obfuskasiya. Hər bir mexanizmi başa düşmək aləti optimal şəkildə konfiqurasiya etməyə kömək edəcək.
ProGuard giriş nöqtələrindən (main metodu, Activity, BroadcastReceiver) çağırış qrafikini təhlil edir və istifadə olunmayan kodu silir. Retrofit, OkHttp və Gson kimi kitabxanaları olan tipik bir Android layihəsində sıxışdırma bayt-kodun 40%-ə qədərini, o cümlədən kitabxanaların istifadə olunmayan metodlarını, debug kodunu və test siniflərini silə bilər. Bu, birbaşa APK ölçüsünü azaldır və proqramın yüklənmə müddətini qısaldır.
Optimallaşdırma mərhələsində ProGuard 20-dən çox müxtəlif bayt-kod çevrilməsi həyata keçirir: qısa metodların inlayninqi, istifadə olunmayan parametrlərin silinməsi, məntiqi ifadələrin sadələşdirilməsi, eyni kod bloklarının birləşdirilməsi. Məsələn, qısa getter və setterlər birbaşa sahəyə girişlə əvəz edilə bilər. Optimallaşdırma proqramın strukturundan asılı olaraq kodun icrasını 5-15% sürətləndirə bilər.
Obfuskasiya ProGuard-da siniflərin, metodların və sahələrin adlarının qısa simvol ardıcıllıqlarına dəyişdirilməsi ilə işləyir: a, b, c, a.a, a.b və s. Adı dəyişdirilmiş elementlərə bütün istinadlar avtomatik olaraq bütün kodda yenilənir. Qeyd etmək vacibdir ki, obfuskasiya proqramın davranışını dəyişmir, yalnız dekompilə edilmiş kodu anlamağı çətinləşdirir. Kitabxanalar və ictimai API-lər keep qaydaları ilə obfuskasiyadan xaric edilməlidir.
// ProGuard obfuskasiyasından əvvəl
public class LoginManager {
public User authenticateUser(String username, String password) {
// autentifikasiya məntiqi
}
}
// ProGuard obfuskasiyasından sonra
public class a {
public Object a(String b, String c) {
// adı dəyişdirilmiş identifikatorlarla eyni məntiq
}
}
ProGuard konfiqurasiyası — Android proqramının qurulmasının kritik mərhələsidir. Yanlış qaydalar zəruri siniflərin silinməsinə və nəticədə release versiyasında crash-lara səbəb ola bilər.
ProGuard-ın Android layihəsində aktivləşdirilməsi release qurma növü üçün minifyEnabled bayrağının true olaraq təyin edilməsini əhatə edir. Standart ProGuard qaydaları Android SDK ilə birlikdə proguard-android-optimize.txt faylında gəlir. İstifadəçi qaydaları ayrıca proguard-rules.pro faylına əlavə edilir. Qurma zamanı ProGuard əvvəlcə standart qaydaları, sonra istifadəçi qaydalarını tətbiq edir ki, bu da əsas konfiqurasiyanı ləğv etməyə imkan verir.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
İstifadəçi qaydalar faylı konkret layihə üçün xüsusi direktivləri ehtiva edir. Tipik qaydalara reflection vasitəsilə istifadə olunan siniflərin, Gson/Moshi serializasiyası üçün məlumat modellərinin, kitabxanaların callback interfeyslərinin və spesifik annotasiyalarla işarələnmiş siniflərin saxlanılması daxildir. Hər bir direktiv -keep, -dontwarn və ya -keepclassmembers açar sözü ilə başlayır və ProGuard-ın dəyişdirməməli olduğu sinif nümunəsini müəyyənləşdirir.
# Gson üçün məlumat modellərini saxla
-keep class com.example.data.model.** { *; }
# Reflection vasitəsilə istifadə olunan sinifləri saxla
-keep class * implements com.google.gson.TypeAdapterFactory
# Kitabxana xəbərdarlıqlarına məhəl qoyma
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# Enum-ları saxla (ProGuard xüsusiyyəti)
-keep class * extends java.lang.Enum { *; }
ProGuard konfiqurasiyasının qrammatikası bir neçə kateqoriya direktivləri əhatə edir, hər biri emalın müəyyən aspektini idarə edir. Düzgün konfiqurasiya üçün zəruri olan əsasları nəzərdən keçirək.
| Direktiv | Məqsəd | Nümunə |
|---|---|---|
| -keep | Sinifi və onun üzvlərini tam saxlamaq | -keep class com.example.MyClass |
| -keepclassmembers | Yalnız sinif üzvlərini saxlamaq | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Xəbərdarlıqları görməməzlikdən gəlmək | -dontwarn okhttp3.internal.** |
| -keepparameternames | Metod parametrlərinin adlarını saxlamaq | -keepparameternames |
| -keepattributes | Atributları saxlamaq (annotasiyalar, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Optimallaşdırmanı söndürmək | -dontoptimize |
ProGuard reflection (Class.forName()), ServiceLoader və ya DEX fayllarının dinamik yüklənməsi ilə yüklənən kodu statik təhlil edə bilməz. Əgər sinif sətir adı ilə yaradılırsa, ProGuard onun mövcudluğundan xəbərsizdir və onu istifadə olunmayan kimi silə bilər. Bütün belə siniflər -keep vasitəsilə açıq şəkildə saxlanmalıdır. ProGuard-ı işə saldıqdan sonra release versiyalarında crash-ların ən çox yayılmış səbəbi budur.
Kitabxanalar çox vaxt AAR faylına daxil edilmiş consumer-rules.pro vasitəsilə qurmaya avtomatik əlavə olunan öz ProGuard qaydalarını ehtiva edir. Android Gradle Plugin qurma zamanı bu qaydaları avtomatik tətbiq edir. Tərtibatçı yalnız bütün istifadə olunan kitabxanaların düzgün qaydalar təqdim etdiyinə əmin olmalı və zəruri hallarda onları layihədə tamamlamalıdır.
ProGuard-ı işə saldıqdan sonra səhvlər yarandıqda, stack trace-in deobfuskasiyası üçün mapping faylından istifadə edin. Diaqnostika üçün sinfin son qurmada saxlanma səbəbini göstərən -whyareyoukeeping açarından istifadə olunur. -optimizationpasses və -obfuscation-ın müvəqqəti söndürülməsi problemi lokallaşdırmağa imkan verir. Guardsquare məlumatına görə, ProGuard ilə bağlı problemlərin 80%-i reflection sinifləri üçün -keep qaydalarının əlavə edilməsi ilə həll olunur.
Android Gradle Plugin 3.4-ün (2019) buraxılması ilə Google, birbaşa D8/R8 kompilyatoruna inteqrasiya edilmiş R8-i — ProGuard-ın varisini təqdim etdi. 2023-cü ilə qədər R8 AGP 8.0-da ProGuard-ı tamamilə əvəz etdi, lakin layihələrin miqrasiyası üçün memarlıq fərqlərini başa düşmək vacibdir.
ProGuard DEX-ə çevrilmədən əvvəl Java bayt-kodunu (.class faylları) emal edən ayrıca alət kimi işləyir. R8 DEX kompilyatoruna inteqrasiya olunub və kodu daha aşağı səviyyədə emal edir ki, bu da ProGuard-da mövcud olmayan optimallaşdırmaları həyata keçirməyə imkan verir. R8 həmçinin desuqarinqi — Java 8+ sintaktik şəkərinin köhnə Android API səviyyələri üçün geriyə uyğun koda çevrilməsini dəstəkləyir.
Google Android Performance Team (2025) məlumatına görə, R8 eyni qaydalarla ProGuard ilə müqayisədə 10-15% daha yaxşı kod sıxışdırması təmin edir. R8 daha sürətlidir — qurma müddəti 20-30% azalır. Bundan əlavə, R8 class faylları deyil, DEX səviyyəsində analiz sayəsində daha çox ölü kodu silir. R8 ProGuard qaydalarının sintaksisi ilə tam uyğundur, bu da miqrasiyanı tərtibatçı üçün şəffaf edir.
ProGuard-dan R8-ə keçid sadədir: AGP 8.0+ standart olaraq R8 istifadə edir. Köhnə layihələrdə ProGuard-ı classpath-dən silmək və gradle.properties-i yeniləmək lazımdır: android.enableR8=true. ProGuard qaydaları əksər hallarda dəyişiklik olmadan R8 ilə uyğundur. Keçid etdikdən sonra release qurmasını bütün hədəf cihazlarda sınamaq tövsiyə olunur, çünki R8 ProGuard-ın saxladığı kodu silə bilər.
Tez-tez verilən suallar
Ən çox yayılmış səbəb — reflection, Gson/Moshi serializasiyası və ya DEX fayllarının dinamik yüklənməsi ilə kitabxanalar vasitəsilə istifadə olunan siniflərin silinməsi. Həlli: Class.forName() vasitəsilə yaradılan, Parcelable-ı tətbiq edən, JSON vasitəsilə serializasiya olunan və ya @Inject ilə annotasiya edilmiş bütün siniflər üçün -keep qaydaları əlavə edin. Stack trace-in deobfuskasiyası və qurmadan silinmiş sinfi müəyyən etmək üçün mapping faylından istifadə edin.
Mapping faylı qurmadan sonra build/outputs/mapping/release/mapping.txt ünvanında yerləşir. Format: orijinal_ad -> obfuska_olunmuş_ad -> növ. Android Studio Build > Analyze APK vasitəsilə deobfuskasiyanı dəstəkləyir: APK-nı yükləyin, stack trace-i yapışdırın və oxuna bilən sinif adlarını əldə edin. CI/CD üçün hər versiya üçün mapping fayllarını ayrıca depoda və ya bulud anbarında saxlayın.
Bəli, ProGuard yalnız release qurmaları üçün aktivləşdirilməlidir. Debug qurmaları minifyEnabled false istifadə edir ki, bu da kompilyasiyanı sürətləndirir və debugger üçün sinif adlarını oxuna bilən saxlayır. Debug rejimində obfuskasiya debug prosesinə və addım-addım icraya mane olur, sıxışdırma isə iterasiyaları yavaşladır. Obfuskasiyanın düzgünlüyünü sınamaq üçün fiziki cihazda release qurmasından istifadə edin.
ProGuard xəbərdarlıqları (WARNING) qurmanı dayandırmayan, lakin potensial icra səhvlərini göstərə bilən problemləri bildirir. Xəbərdarlıq crash-a səbəb olmursa, müvafiq kitabxana üçün -dontwarn əlavə edin. Xəbərdarlıq proqramda istifadə olunmayan çatışmayan siniflə bağlıdırsa, yenə -dontwarn istifadə edin. Bütün xəbərdarlıqları təhlil etmədən bir anda görməməzlikdən gəlmək tövsiyə edilmir.
ProGuard — əsas funksiyaları olan pulsuz alət: sıxışdırma, optimallaşdırma, sinif və metod adlarının dəyişdirilməsi. DexGuard — eyni Guardsquare şirkətinin kommersiya məhsuludur, idarəetmə axınının gizlədilməsi, sətir və resursların şifrələnməsi, debugdan qorunma və resursların obfuskasiyasını əlavə edir. DexGuard yüksək qoruma tələbləri olan bank proqramlarında və oyunlarda istifadə olunur.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun