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, 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.
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 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 üç 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.
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 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 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.
// 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
}
}
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.
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.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
Ö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.
# 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 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önerge | Amaç | Örnek |
|---|---|---|
| -keep | Sınıfı ve üyelerini tamamen koru | -keep class com.example.MyClass |
| -keepclassmembers | Yalnızca sınıf üyelerini koru | -keepclassmembers class * { @Inject *; } |
| -dontwarn | Uyarıları yoksay | -dontwarn okhttp3.internal.** |
| -keepparameternames | Yöntem parametre adlarını koru | -keepparameternames |
| -keepattributes | Öznitelikleri koru (ek açıklamalar, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | Optimizasyonu devre dışı bırak | -dontoptimize |
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 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 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.
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.
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.
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.
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
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.
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.
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ı (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, 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
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.
Ayrıca okuyun