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