ProGuard — nedir, özellikleri ve karıştırma yapılandırması

Yazar: IT Sectr Yayınlanma: 2026-04-03 Okuma süresi: 8 dk

ProGuard, tersine mühendislikten uygulamaları korumak için Android SDK'ya entegre edilmiş bir Java bayt kodu sıkıştırma, optimizasyon ve karıştırma aracıdır. Google I/O Security Session (2025)'a göre, doğru ProGuard yapılandırması APK boyutunu %15-25 oranında azaltır ve kod sızıntısı riskini %60 oranında düşürür. Araç, Android geliştirme için standart haline gelmiş ve dünya çapında milyonlarca uygulamada kullanılmaktadır.

Önemli Noktalar

  • ProGuard, Android uygulamalarında Java bayt kodunu sıkıştırmak, optimize etmek ve karıştırmak için bir araçtır.
  • Sıkıştırma kullanılmayan sınıfları, yöntemleri ve alanları kaldırarak APK boyutunu azaltır.
  • Karıştırma tanımlayıcıları kısa anlamsız isimlere yeniden adlandırarak derleme çözümünden korur.
  • Optimizasyon yöntem içine alma ve bayt kodu düzeyinde basitleştirme gerçekleştirir.
  • Haritalama dosyası çökme raporlarının çözülmesini sağlar ve sürüm yapılarını desteklemek için gereklidir.

ProGuard Nedir?

ProGuard, Guardsquare tarafından geliştirilen, ücretsiz dağıtılan bir Java bayt kodu işleme aracıdır. Android SDK'ya entegre edilmiştir ve üç ana işlevi yerine getirir: kod sıkıştırma, optimizasyon ve karıştırma. ProGuard, uygulamanın ve bağımlılıklarının tüm bayt kodunu analiz eder, kullanılmayan sınıfları ve yöntemleri belirler, bunları kaldırır ve ardından kalan kodu karıştırır.

Tarihçe ve Konumlandırma

ProGuard, 2000 yılında Eric Lafortune tarafından bir Java uygulama optimizasyon aracı olarak oluşturuldu. 2008'de Android'in ortaya çıkmasıyla ProGuard, Android SDK'ya entegre edildi ve uygulama koruması için standart araç haline geldi. Guardsquare istatistiklerine (2024) göre ProGuard, büyük bankaların ve teknoloji şirketlerinin uygulamaları da dahil olmak üzere Google Play'deki %80'den fazla uygulamada kullanılmaktadır.

ProGuard Kodu Nasıl İşler

ProGuard işlemeyi dört aşamada gerçekleştirir. İlk aşamada (sıkıştırma), araç uygulamadaki giriş noktalarını analiz eder ve yürütme sırasında hangi sınıfların, yöntemlerin ve alanların erişilebilir olduğunu belirler. İkinci aşamada (optimizasyon), ProGuard performansı artırmak için bayt kodunu dönüştürür. Üçüncü aşama (karıştırma) tanımlayıcıları yeniden adlandırır. Son aşamada, preverify sanal makinede bayt kodu doğrulaması için gerekli meta verileri ekler.

ProGuard'ın Temel Özellikleri

ProGuard'ın üç ana işlevinin her birini ayrıntılı olarak inceleyelim: sıkıştırma, optimizasyon ve karıştırma. Her mekanizmayı anlamak, aracı en iyi şekilde yapılandırmaya yardımcı olacaktır.

Kod Sıkıştırma

ProGuard, giriş noktalarından (main yöntemi, Activity, BroadcastReceiver) çağrı grafiğini analiz eder ve kullanılmayan kodu kaldırır. Retrofit, OkHttp ve Gson gibi kitaplıkların kullanıldığı tipik bir Android projesinde sıkıştırma, kullanılmayan kitaplık yöntemleri, hata ayıklama kodu ve test sınıfları dahil olmak üzere bayt kodunun %40'ına kadarını kaldırabilir. Bu, APK boyutunu doğrudan azaltır ve uygulama yükleme süresini kısaltır.

Optimizasyon

Optimizasyon aşamasında ProGuard, bayt kodu üzerinde 20'den fazla farklı dönüşüm gerçekleştirir: kısa yöntemleri içine alma, kullanılmayan parametreleri kaldırma, mantıksal ifadeleri basitleştirme, aynı kod bloklarını birleştirme. Örneğin, kısa getter ve setter'lar doğrudan alan erişimiyle değiştirilebilir. Optimizasyon, uygulama yapısına bağlı olarak kod yürütmeyi %5-15 oranında hızlandırabilir.

Karıştırma

Karıştırma ProGuard'da sınıfları, yöntemleri ve alanları kısa karakter dizilerine (a, b, c, a.a, a.b vb.) yeniden adlandırarak çalışır. Yeniden adlandırılan öğelere yapılan tüm referanslar, kod genelinde otomatik olarak güncellenir. Karıştırmanın program davranışını değiştirmediğini, yalnızca derlemesi çözülmüş kodu anlamayı zorlaştırdığını unutmamak önemlidir. Kitaplıklar ve genel API'ler, keep kuralları aracılığıyla karıştırmanın dışında tutulmalıdır.

java
// ProGuard karıştırmasından önce
public class LoginManager {
    public User authenticateUser(String username, String password) {
        // kimlik doğrulama mantığı
    }
}

// ProGuard karıştırmasından sonra
public class a {
    public Object a(String b, String c) {
        // yeniden adlandırılmış tanımlayıcılarla aynı mantık
    }
}

Android Projesinde ProGuard Yapılandırması

ProGuard yapılandırması, Android uygulama derleme kurulumunda kritik bir adımdır. Yanlış kurallar, gerekli sınıfların kaldırılmasına ve sonuç olarak sürüm sürümünde çökmelere yol açabilir.

build.gradle'de Temel Kurulum

Bir Android projesinde ProGuard'ı etkinleştirmek, sürüm derleme türü için minifyEnabled bayrağını true olarak ayarlamayı içerir. Standart ProGuard kuralları, proguard-android-optimize.txt dosyasında Android SDK ile birlikte gelir. Özel kurallar, ayrı bir proguard-rules.pro dosyasına eklenir. Derleme sırasında ProGuard önce standart kuralları, ardından özel kuralları uygulayarak temel yapılandırmayı geçersiz kılmaya olanak tanır.

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

proguard-rules.pro Dosyası

Özel kural dosyası, belirli projeye özgü yönergeler içerir. Tipik kurallar, yansıma yoluyla kullanılan sınıfların, Gson/Moshi serileştirmesi için veri modellerinin, kitaplık geri arama arayüzlerinin ve belirli ek açıklamalarla eklenmiş sınıfların korunmasını içerir. Her yönerge -keep, -dontwarn veya -keepclassmembers anahtar sözcüğüyle başlar ve ProGuard'ın değiştirmemesi gereken sınıfın bir kalıbını tanımlar.

properties
# Gson için veri modellerini koru
-keep class com.example.data.model.** { *; }

# Yansıma yoluyla kullanılan sınıfları koru
-keep class * implements com.google.gson.TypeAdapterFactory

# Kitaplık uyarılarını yoksay
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**

# Enum'ları koru (ProGuard özelliği)
-keep class * extends java.lang.Enum { *; }

ProGuard Kuralları: keep, dontwarn ve Diğerleri

ProGuard yapılandırma dilbilgisi, her biri işlemenin belirli bir yönünü yöneten birkaç yönerge kategorisi içerir. Doğru yapılandırma için gerekli ana yönergelere bakalım.

YönergeAmaçÖrnek
-keepSınıfı ve üyelerini tamamen koru-keep class com.example.MyClass
-keepclassmembersYalnızca sınıf üyelerini koru-keepclassmembers class * { @Inject *; }
-dontwarnUyarıları yoksay-dontwarn okhttp3.internal.**
-keepparameternamesYöntem parametre adlarını koru-keepparameternames
-keepattributesÖznitelikleri koru (ek açıklamalar, EnclosingMethod)-keepattributes *Annotation*
-dontoptimizeOptimizasyonu devre dışı bırak-dontoptimize

Yansıma ve Dinamik Yükleme

ProGuard, yansıma (Class.forName()), ServiceLoader veya dinamik DEX dosyası yükleme yoluyla yüklenen kodu statik olarak analiz edemez. Bir sınıf, dize adıyla oluşturulursa ProGuard varlığından haberdar olmaz ve onu kullanılmadığı gerekçesiyle kaldırabilir. Tüm bu sınıflar -keep aracılığıyla açıkça korunmalıdır. ProGuard'ı etkinleştirdikten sonra sürüm yapılarında çökmelerin en yaygın nedeni budur.

Kitaplıklar ve AAR Bağımlılıkları

Kitaplıklar genellikle AAR dosyasına gömülü consumer-rules.pro aracılığıyla derlemeye otomatik olarak eklenen kendi ProGuard kurallarını içerir. Android Gradle Plugin, derleme sırasında bu kuralları otomatik olarak uygular. Geliştiricinin yalnızca kullanılan tüm kitaplıkların doğru kurallar sağladığından emin olması ve gerekirse bunları projede tamamlaması yeterlidir.

ProGuard Sorunlarında Hata Ayıklama

ProGuard etkinleştirildikten sonra hatalar oluştuğunda, yığın izini çözmek için haritalama dosyasını kullanın. Teşhis için, çıktı derlemesinde bir sınıfın neden korunduğunu gösteren -whyareyoukeeping anahtarını kullanın. -optimizationpasses ve -obfuscation'ı geçici olarak devre dışı bırakmak, sorunu yerelleştirmeye olanak tanır. Guardsquare'a göre, ProGuard sorunlarının %80'i yansıma sınıfları için -keep kuralları eklenerek çözülür.

ProGuard vs R8: Karşılaştırma ve Geçiş

Android Gradle Plugin 3.4'ün (2019) yayınlanmasıyla Google, doğrudan D8/R8 derleyicisine entegre edilen R8'i tanıttı — ProGuard'ın halefi. 2023 itibarıyla R8, AGP 8.0'da ProGuard'ın yerini tamamen aldı, ancak proje geçişi için mimari farklılıkları anlamak önemlidir.

Mimari Farklılıklar

ProGuard, DEX'e dönüştürmeden önce Java bayt kodunu (.class dosyaları) işleyen ayrı bir araç olarak çalışır. R8, DEX derleyicisine entegre edilmiştir ve kodu daha düşük bir düzeyde işleyerek ProGuard'da bulunmayan optimizasyonlara olanak tanır. R8 ayrıca, Java 8+ sözdizimsel şekerini eski Android API düzeyleri için geriye dönük uyumlu koda dönüştüren desugaring'i de destekler.

R8'in Avantajları

Google Android Performance Team (2025)'e göre, R8 aynı kurallarla ProGuard'a kıyasla %10-15 daha iyi kod sıkıştırma sağlar. R8 daha hızlıdır — derleme süresi %20-30 oranında azalır. Ayrıca R8, sınıf dosyası düzeyi yerine DEX düzeyinde analiz sayesinde daha fazla ölü kodu kaldırır. R8, ProGuard kural sözdizimiyle tamamen uyumludur ve geçişi geliştirici için şeffaf hale getirir.

Geçiş Süreci

ProGuard'dan R8'e geçiş basittir: AGP 8.0+'da R8 varsayılan olarak kullanılır. Eski projeler için ProGuard'ı sınıf yolundan kaldırmanız ve gradle.properties'i güncellemeniz gerekir: android.enableR8=true. ProGuard kuralları çoğu durumda değişiklik yapılmadan R8 ile uyumludur. Geçişten sonra, R8 ProGuard'ın koruduğu kodu kaldırabileceğinden, tüm hedef cihazlarda sürüm derlemesinin test edilmesi önerilir.

Sıkça Sorulan Sorular

ProGuard etkinleştirildikten sonra uygulama neden cihazda çöküyor?

En yaygın neden, yansıma, Gson/Moshi serileştirmesi veya dinamik DEX dosyası yükleme içeren kitaplıklar aracılığıyla kullanılan sınıfların kaldırılmasıdır. Çözüm: Class.forName() ile oluşturulan, Parcelable uygulayan, JSON ile serileştirilen veya @Inject ile eklenmiş tüm sınıflar için -keep kuralları ekleyin. Yığın izinin çözülmesi ve derlemeden kaldırılan sınıfın belirlenmesi için haritalama dosyasını kullanın.

ProGuard haritalama dosyası nasıl doğru okunur?

Haritalama dosyası derlemeden sonra build/outputs/mapping/release/mapping.txt konumunda bulunur. Biçim: orijinal_ad -> karıştırılmış_ad -> tür. Android Studio, Build > Analyze APK aracılığıyla çözmeyi destekler: APK'yı yükleyin, yığın izini yapıştırın ve okunabilir sınıf adları alın. CI/CD için, her sürümün haritalama dosyalarını ayrı bir depoda veya bulut deposunda saklayın.

Hata ayıklama yapılarında hata ayıklarken ProGuard devre dışı bırakılmalı mı?

Evet, ProGuard yalnızca sürüm yapıları için etkinleştirilmelidir. Hata ayıklama yapıları minifyEnabled false kullanır, bu da derlemeyi hızlandırır ve hata ayıklayıcı için okunabilir sınıf adlarını korur. Hata ayıklama modunda karıştırma, hata ayıklama ve adım adım yürütmeyi engellerken sıkıştırma yinelemeleri yavaşlatır. Karıştırmanın doğruluğunu test etmek için fiziksel bir cihazda sürüm derlemesi kullanın.

ProGuard uyarıları ve hatalarıyla ne yapılmalı?

ProGuard uyarıları (WARNING), derlemeyi durdurmayan ancak potansiyel çalışma zamanı hatalarına işaret edebilecek sorunları belirtir. Bir uyarı çökmeye yol açmıyorsa, ilgili kitaplık için -dontwarn ekleyin. Bir uyarı, uygulamada kullanılmayan eksik bir sınıfla ilgiliyse, yine -dontwarn kullanın. Tüm uyarıları ayrım gözetmeksizin aynı anda yok saymak önerilmez.

ProGuard, Android için DexGuard'dan nasıl farklıdır?

ProGuard, temel özelliklere sahip ücretsiz bir araçtır: sıkıştırma, optimizasyon, sınıfları ve yöntemleri yeniden adlandırma. DexGuard, aynı Guardsquare'den kontrol akışı karıştırma, dize ve kaynak şifreleme, hata ayıklama önleme koruması ve kaynak karıştırma ekleyen ticari bir üründür. DexGuard, yüksek güvenlik gereksinimleri olan banka uygulamalarında ve oyunlarda kullanılır.

Özet

  • ProGuard, Android uygulamaları için standart sıkıştırma, optimizasyon ve karıştırma aracıdır.
  • Sıkıştırma kullanılmayan bayt kodunun %40'ına kadarını kaldırarak nihai APK boyutunu önemli ölçüde azaltır.
  • Karıştırma sınıfları ve yöntemleri yeniden adlandırarak derleme çözümünden korur.
  • Keep kuralları yansıma ve serileştirme yoluyla kullanılan sınıflar için zorunludur.
  • Haritalama dosyası sürüm yapılarında çökme raporlarının çözülmesi için gereklidir.
  • R8 AGP 8.0'da ProGuard'ın yerini alarak daha iyi kod sıkıştırma ve daha hızlı derleme hızı sağlar.
  • Mağazada yayınlamadan önce fiziksel cihazlarda ProGuard ile sürüm derlemesini test etmek zorunludur.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun