ProGuard — bu nədir, imkanları və obfuskasiya konfiqurasiyası

Müəllif: IT Sectr Dərc olunub: 2026-04-03 Oxuma vaxtı: 8 dəq

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 — Android proqramlarında Java bayt-kodunun sıxışdırılması, optimallaşdırılması və obfuskasiyası üçün alət.
  • Sıxışdırma istifadə olunmayan sinifləri, metodları və sahələri silir, APK ölçüsünü azaldır.
  • Obfuskasiya identifikatorları qısa mənasız adlara dəyişdirərək dekompilasiyadan qoruyur.
  • Optimallaşdırma metodların inlayninqini və bayt-kod səviyyəsində kodun sadələşdirilməsini həyata keçirir.
  • Mapping faylı crash hesabatlarını deobfuska etməyə imkan verir və release versiyalarının dəstəyi üçün vacibdir.

ProGuard nədir?

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.

Tarix və mövqe

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 kodu necə emal edir

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 imkanları

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.

Kodun sıxışdırılması (Shrinking)

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 (Optimization)

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 (Obfuscation)

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.

java
// 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
    }
}

Android layihəsində ProGuard-ın konfiqurasiyası

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.

build.gradle-də əsas konfiqurasiya

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.

groovy
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(
                'proguard-android-optimize.txt'
            ), 'proguard-rules.pro'
        }
    }
}

proguard-rules.pro faylı

İ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.

properties
# 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 qaydaları: keep, dontwarn və digərləri

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.

DirektivMəqsədNümunə
-keepSinifi və onun üzvlərini tam saxlamaq-keep class com.example.MyClass
-keepclassmembersYalnız sinif üzvlərini saxlamaq-keepclassmembers class * { @Inject *; }
-dontwarnXəbərdarlıqları görməməzlikdən gəlmək-dontwarn okhttp3.internal.**
-keepparameternamesMetod parametrlərinin adlarını saxlamaq-keepparameternames
-keepattributesAtributları saxlamaq (annotasiyalar, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeOptimallaşdırmanı söndürmək-dontoptimize

Reflection və dinamik yükləmə

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 və AAR asılılıqları

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 problemlərinin debug edilməsi

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.

ProGuard və R8: müqayisə və miqrasiya

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.

Memarlıq fərqləri

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.

R8-in üstünlükləri

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.

Miqrasiya prosesi

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

Niyə ProGuard-ı işə saldıqdan sonra proqram cihazda crash edir?

Ə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.

ProGuard mapping faylını necə düzgün oxumaq olar?

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.

Debug qurmalarında ProGuard-ı söndürmək lazımdırmı?

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ı və səhvləri ilə nə etməli?

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 Android üçün DexGuard-dan nə ilə fərqlənir?

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ə

  • ProGuard — Android proqramları üçün standart sıxışdırma, optimallaşdırma və obfuskasiya alətidir.
  • Sıxışdırma istifadə olunmayan bayt-kodun 40%-ə qədərini silir, son APK ölçüsünü əhəmiyyətli dərəcədə azaldır.
  • Obfuskasiya sinif və metodların adlarını dəyişdirərək dekompilasiyadan qoruyur.
  • Keep qaydaları reflection və serializasiya vasitəsilə istifadə olunan siniflər üçün məcburidir.
  • Mapping faylı proqramın release versiyalarında crash hesabatlarının deobfuskasiyası üçün zəruridir.
  • R8 AGP 8.0-da ProGuard-ı əvəz etdi, daha yaxşı kod sıxışdırması və layihənin daha yüksək qurma sürətini təmin edir.
  • Sınaq — ProGuard ilə release qurmasının fiziki cihazlarda sınanması mağazada dərc etməzdən əvvəl məcburidir.

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.

Layihəni müzakirə et

Həm də oxuyun