Android ProGuard Kullanımı (Apk Güvenliği ve Apk Küçültme)

Merhaba Arkadaşlar,
Android uygulama Geliştirme dersleri anlattığımız/yayınladığımız mobilhanem.com sitemiz üzerinden bu dersimizde Android ProGuard kullanımı ile devam edeceğiz. Bu aralar hem sorucevap.mobilhanem.com sitemizden, hemde kişisel olarak Apk’mızı nasıl koruruz ,android kod güvenliği nasıl sağlarız soruları almaktayım. Bende bu dersimde bu konuyla ilgili olarak Android SDK ile bize sunulan ProGuard kullanımından bahsedeceğim.

Öncelikle ProGuard nedir ve ne işe yarar onlardan bahsedeceğim. ProGuard’ın 2 ana işlemi vardır.
1- Kod Sıkıştırma (Apk boyutu küçültme)
2- Kod karıştırma

Genel olarak uygulama yazdıktan sonra uygulamamızın gereksiz yere APK boyutunun büyük olduğunu farkederiz. APK boyutunun küçük olması her zaman bir avantajdır. APK boyutu yüksek olan uygulamalar Google Play kullanıcılarının uygulamanızı indirmesine engel olabilmektedir( Sınırlı internet paketleri). İşte burda ProGuard kullanmamız boyutu küçültebilir. Peki bunu nasıl yapıyor derseniz, ProGuard Run Time anında uygulamanın kaynak kodunda olan ama kullanılmayan method,class ve değişkenleri analiz edip otomatik olarak silmektedir. Özellikle uygulamamıza dahil ettiğimiz 3. parti kütüphanelerde kullanmadığımız çok fazla method ve class olabilmektedir. Proguard bunları silmekte ve oluşturduğumuz APK’ya bunları dahil etmemektedir.

Özellikle büyük projelerde çok fazla kullanılmayan method ve class olabilmektedir. Bunları tek tek bulup silmek yerine (ki genel olarak bu ilerde lazım olabilir mantığıyla silinmemektedir) ProGuard kullanıp otomatik silmesini, dolayısıyla Apk boyutunu küçültmesini sağlayabiliriz.

ProGuard Apk boyutunun küçültmesinin yanında Apk decompilerlar ile decompile edilen kodun direk açığa çıkmasına engel olmaktadır. Apk decompile işlemini yapan onlarca site bulunmaktadır. Eğer proguard kullanmıyorsak decompile işlemi ile direk yazdığımız kod açığa çıkmakta ve açığa çıkan kod tekrar compile edilip başkası tarafından farklı bir uygulama adı ile piyasaya sürülebilmektedir.

Örneğin bir uygulama yazdınız ve günlerinizi , hatta aylarınızı verdiniz. Google Play Store’a bu uygulamayı yüklediniz. Uygulamanızı indiren biri Apk’yı export edip herhangi bir decompile uygulaması veya sitesi ile decompile işlemini gerçekleştirip yazmış olduğunuz kodu elde edebilir ve tekrardan sanki kendisi yazmış gibi compile edip farklı bir paket adıyla store’a koyabilir. İşte bunun önüne geçebilmek için ProGuard kullanmamızı Android biz developer’lara önermektedir.

Gelelim ProGuard’ı projemizde nasıl kullanacağımıza.

build.gradle ‘ı açıyoruz ve aşağıdaki kodu ekliyoruz.

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

Android SDK ile birlikte default bir ProGuard dosyası gelmektedir. Bu dosyayı projemize getDefaultProguardFile methodu ile dahil etmekteyiz. Bu dosya Android SDK tools/proguard/ altında bulunmaktadır. Açıp inceleyebilirsiniz. minifyEnabled true ile sıkıştırmayı ve kod karıştırmayı aktif hale getirdik.

Bu işlemleri sadece release APK yani imzalı Apk alırken aktif hale getirdik. Çünkü debug Apk’da bu işlemleri yapmanın bir mantığı yoktur. Kod karıştırarak uygulamamızı test etmek daha zor olacağı için bu işlemi sadece release Apk alırken yapıyoruz. Ama diyelim ki bir sebepten dolayı debug Apk’da bu işlemi yapmak isterseniz kodu aşağıdaki şekilde revize etmeniz gerekecektir.

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

Artık hem debug Apk’da hemde release Apk’da kod sıkıştırma ve karıştırma aktif haldedir.

Peki biz kendi proguard ayarlarımızı yapmak istersek ne yapacağız. Çünkü bazı istisnai durumlarda ProGuard yanlış methodları silebilmektedir. Ayrıca bazı library’leri kullanırken o library’de kod karıştırma ve sıkıştırma yapmamamız gerekebilir. Aynı şekilde kullandığımız bazı Class’larda da ProGuard kullanmak istemeyebiliriz. İşte bu gibi durumlarda kendi ayarlarımızı yapacağımız ‘proguard-rules.pro’ dosyamızı açıyoruz.  (build.gradle ile aynı dizine, yoksa kendiniz oluşturabilirsiniz) .
Zaten yukarıdaki kodumuza bakarsak,

        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

bu satırda o dosyayı çağırıyoruz. Bu dosyayı çağırdık ve oluşturduğumuz bir class’ın ProGuard dışında kalmasını istiyoruz.

-keep public class MyClass

proguard-rules.pro dosyamızı açıyoruz ve yukarıdaki kodu ekliyoruz. Böylelikle MyClass class’ı ProGuard dışı kalacaktır.

proguard-rules.pro’yu daha etkili kullanım örneği için bu linki ziyaret edebilirsiniz.

Not: ProGuard Android Studio’nun Instant Run özelliği ile birlikte çalışmamaktadır.

Uyarı:
————————————————————————————————
ProGuard kullanarak kod karıştırma işlemi yaptığımızda otomatik olarak method , class isimlerimiz değişecektir. Dolayısıyla Google Play developer hesabı üzerinden inceleyeceğimiz crash loglarında anlamsız methodlar , class’lar göreceğiz ve bu loglar anlaşılır halde olmayacaktır.Bunun önüne geçmek için şu adımları izleyeceğiz.

1-/build/outputs/mapping/release/ altında oluşan mapping.txt dosyasını alacağız.
2-Google Play Geliştirici Konsolunuzda oturum açın.
3-Uygulamanızı seçin
4-Soldaki menüde, Kilitlenmeler ve ANR’ler > Gizleme Kaldırma Dosyaları’nı tıklayın.
5-Uygulamanızın ilgili sürümünün yanındaki Yükle’yi tıklayın.
6-Uygulamanızın sürümüne ilişkin ProGuard eşleme dosyasını(mapping.txt) yükleyin.

Bu işlemleri her yeni Apk sürümü için yapmanız gerekmektedir. mapping.txt’ i içinde yapılan method ve class isim değişikliklerinin map’i tutulmaktadır.
Örneğin: methodumuz public void kitapekle(), ProGuard bunun adını a() olarak değiştirir ve bunun bilgisini mapping.txt ‘i içine yazar. Biz bu mapping.txt ‘yi Google Play’e ProGuard’ın yaptığı değişiklikleri söylüyoruz. Böylelikle oluşan crash raporları anlamlı hale geliyor.

————————————————————————————————

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitesmizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

10

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

15 Yorum

  • Merhabalar Hocam,

    bu satiri anlamadim:

    “Artık hem debug Apk’da hemde release Apk’da kod sıkıştırma ve karıştırma aktif haldedir.”

    demissiniz fakat örnekdeki Release kisminda “minifyEnabled false” hemde Debug kisminda “minifyEnabled true” demissiniz…

    Sanki bir celiski var gibi. Tekrar kontrol edebilir misiniz?

    Tesekkürler
    Erkan Kaplan

  • Hocam merhaba ,
    Küçük bir sorum olacaktı.İstediğimiz bir classı yukarıdaki kod ile proquardın dısında bırakabiliyoruz peki projemizde kullandığımız kütüphaneyi komple proquardın dısında bırakmak istiyorum.Aşağıdaki kodu yazdığımda debug modda sıkıntısız çalıştı.Ancak apksını alıp test edince çalıştırmadı.

    -keeppackagenames tcking.github.com.giraffeplayer
    -keeppackagenames tv.danmaku.ijk.media.player

    Teşekkürler

  • Çok faydalı bir yazı olmuş. Proguard ile ilgili Türkçe kaynaklar yok denecek kadar az. Bu boşluğu doldurmuş oldunuz. Özellikle developer console’dan aldığımız kilitlenme raporlarında yazan “unknown source” olayını da sayenizde çözdüm. Teşekkürler

  • Merhabalar, varsayalım programın ilk sürümünü Proguard ile şifreledim ama ikinci sürümde bunu yapmadım 3 tek tekrar yaptım gibi gibi kullanım olurmu ?

  • […] Uygulamamızı yazarken çok fazla class ve method oluştururuz ve proje büyüdükçe bunlardan bir kısmını kullanmayız. Ama uygulamayı paketlediğimiz zaman kullanmadığımız bu class ve methodlarda uygulamamıza dahil olur ve APK Boyutunu yükseltir. İşte burda Proguard yardımımıza koşuyor ve hem kullanılmayan kodları kaldırıyor hemde kodlarımızı karıştırma yaparak decompile işlemlerinde kodun okunmasını zorlaştırıyor. Proguard kullanımını bu dersimizde anlatmayacağım . Proguard dersimiz için tıklayınız. […]

  • […] Uygulamamızı yazarken çok fazla class ve method oluştururuz ve proje büyüdükçe bunlardan bir kısmını kullanmayız. Ama uygulamayı paketlediğimiz zaman kullanmadığımız bu class ve methodlarda uygulamamıza dahil olur ve APK Boyutunu yükseltir. İşte burda Proguard yardımımıza koşuyor ve hem kullanılmayan kodları kaldırıyor hemde kodlarımızı karıştırma yaparak decompile işlemlerinde kodun okunmasını zorlaştırıyor. Proguard kullanımını bu dersimizde anlatmayacağım . Proguard dersimiz için tıklayınız. […]

  • Apk şifrelemek için ne gerekiyor peki? ProGuard harici yöntemler var mıdır acaba?
    Teşekkürler

    • Apk şifrelemek diye birşey yok. Her apk decompile edilebilinir. Bunun önüne geçemezsin. sen sadece kodunun okunurluğunu azaltıcak proguard benzeri toollar kullanabilirsin. Ben proguard dışında kullanmadım. proguard’ı piyasaya süren firma guardsquare adında bir firmadır. Onların başka bir ürünü daha bulunuyor adı dexguard. Ücretli olduğunu hatırlıyorum. İnceleyebilirsin.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?