Android ProGuard Kullanımı

Muhammet ÇAĞATAY
Android Türkiye
Published in
4 min readMar 31, 2018

Merhabalar, önceki yazımda Android kaynak kodlarını görüntülemenin sırlarını paylaşmıştım. Bu yazımda ise kodlarımızı nasıl koruyacağımızı Verisun teknoloji A.Ş. bünyesinde geliştirdiğimiz Mobiett android uygulaması üzerinden anlatacağım anlatacağım.

Kod Gizleme ( Code Obsufucation ) Nedir?

Sözlük anlamı olarak Obfuscation sözcüğü şaşırtmaca demek. Yazılım dünyasında ise programların kaynak kodlarının işlevini hiçbir şekilde değiştirmeden anlaşılamayacak derecede karıştırılması anlamına geliyor.

Neden Kod Karıştırmaya İhtiyaç Duyuyoruz?

Geliştirdiğimiz ticari programların fikri haklarını (intellectual property) koruma altına almak, ters mühendislik (reverse engineering) denemeleri yapılsa bile programlarımıza gömülü durumda olan bize ait özel algoritma, teknoloji vb. know-how türü bilgilerin ortaya çıkartılmasını engellemek zorundayız. Kod karıştırmanın diğer bir kullanım alanı da kodun daha iyi ve efektif hale getirilmesidir. Kod karıştırma için kullanılan araçlar kodu analiz ederek gereksiz/yararsız kodları ve metadata bölümlerini kırpabiliyor ve bu sayede kod boyutunda azalmayla birlikte performans artışı sağlanabiliyor.

Android Uygulamalarda Kaynak Kodları Nasıl Karıştırılır?

Androidde en bilindik yöntem ProGuard kullanımıdır ama tercihe bağlı olarak PreEmptive de kullanılabilir. Ayrıca Proguardın geliştiricisi GuardSquare firmasının ücretli ürünü DexGuard bu konudaki en başarılı üründür fakat oldukça pahalıdır.

ProGuard Nedir?

Geliştirilen uygulamaların kaynak kodlarını karıştırmaya ve sıkıştırmaya (uygulama boyutunu düşürmeye) yarayan ücretsiz 3. parti bir kütüphanedir.

ProGuard kütüphanesi her ne kadar 3. parti bir yazılım olsa da Android Developer Sayfası üzerinde bize Shrink Your Code and Resources başlığında anlatılmaktadır.

ProGuard Kullanımı

Android Studio ile birlikte gelen Gradle build sistemi ile projemizde ProGuard’ı çok kolay bir şekilde aktif edebiliriz.

Android Studio üzerinde bir projeye başladığınızda varsayılan olarak ProGuard kapalı halde bulunur. Bu da uygulamanızın kaynak kodlarına rahatça çevrilebileceği anlamına gelir.

ProGuard’ı aktif hale getirmek için önce App dizini içerisinde bulunan build.gradle dosyasını açıyoruz.

andoid >> defaultConfig >> buildTypes altında bulunan relase , debug, beta, prod vb. etiketlerde konfigürasyonumuzu gerçekleştiriyoruz.

apply plugin: 'com.android.application'android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.verisun.mobiett"
minSdkVersion 15
targetSdkVersion 24
versionCode 79
versionName "4.2.0"
}
buildTypes {
release {
//konfigürasyon alanı
}
debug {
//konfigürasyon alanı
}
}

ProGuard Kullanarak Kaynakları Sıkıştırmak

minifyEnabled :

ProGuard kullanarak kullanılmayan kaynak kodları sıkıştırır fakat kodları karıştırmaz (obsufucation gerçekleştirmez).

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

Ama unutmamamız gereken birşey var; minifyEnabled özelliği Instant Run sırasında çalışmaz.

shrinkResources:

Kullanılmayan alternatif kaynakları (resim, xml vb. ) kaldırıp ve yinelenen kaynakları birleştirerek uygulama boyutunu küçültür.

Eğer uygulama boyutunun düşürülmesi ( sıkıştırma ) sizin için önemli ise Gradle’nin içinde varolan deneysel kod sıkıştırma özelliğini aktif edebilirsiniz. Bu özellik ProGuard’ın aksine Instant Run’ı da destekler.

Bu özelliği aktif etmek için yine buildTypes içinde shrinkResources true yazmanız yeterli olacaktır.

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

Sıkıştırma Sırasında Korunacak Kaynakları Belirlemek

Sıkıştırmayı aktif ettiğinizde kaynaklarınızın buna dahil edilip edilmeyeceğini bir xml kaynak dosyasında <resources> niteliği içerisinde belirleyebilirsiniz.

tools:keep: Kaynak dosyalarınızı korur.

tools:discard : Kullanılmayan kaynak dosyalarını belirtebilirsiniz.

Örnek bir xml resource dosyası:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"

tools:keep="@layout/layout_main"
tools:discard="@layout/kullanilmayan_ekran" />

Kaynakları tek tek belirtebileceğiniz gibi, * karakteri ile aşağıdaki gibi çoklu olarak da belirtebilirsiniz.

Örneğin: aşağıdaki örnekte “@layout/activity_mobiett_*” tagı ile layout klasöründeki actvity_mobiett_ ismi ile başlayan tüm dosyalar belirtilmek istenmiştir.

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"

tools:keep="@layout/activity_mobiett_*,@layout/layout_main,@layout/fragment_mobiett_*"
tools:discard="@layout/kullanilmayan_ekran" />

ProGuard Kullanarak Kaynak Kodlarını Karıştırmak

useProguard

Yukarıda anlattıklarımız sadece uygulama boyutunu düşürmek içindi. Eğer kaynak kodlarımızı korumak istiyorsak useProguard true kodunu ekleyerek karıştırma özelliğini aktif etmeliyiz.

Bu sayede kodlar geri dönüştürüldüğünde anlamsız class, metod ve değişken isimleri ile adlandırılarak kodun okunaklığı zorlaştırılmış olur.

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

ProGuard kullanılmayan projeler geri dönüştürüldüğünde (Decompile Edildiğinde) kaynak kodları aşağıdaki gibi açık bir şekilde görüntülenir.

ProGuard kullanılan projelerde ise decompile yapıldığında kaynak ulaşılan kaynak kodlar aşağıdaki gibi anlamsız olacaktır.

ProGuardFiles Konfigürasyonunun Yapılması

Projenizde ProGuard’ı aktif ettiğinizde konfigürasyonu yapmazsanız crash edebilir. Bunun için proguardFiles özelliğini aşağıdaki örnekte kullanıldığı gibi gradle konfigürasyonunda belirtmeniz gerekmektedir.

apply plugin: 'com.android.application'android {
compileSdkVersion 27
buildToolsVersion "27.0.3"
defaultConfig {
applicationId "com.verisun.mobiett"
minSdkVersion 15
targetSdkVersion 24
versionCode 79
versionName "4.2.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

yukarıdaki örnek kodda projemizin app dizininde bulunan proguard-rules.pro dosyasından ProGuard konfigürasyonunun yapılacağını belirttik.

Konfigürasyonu tek dosya yerine aşağıdaki gibi çoklu dosya ile de yapmamız mümkündür.

buildTypes 
{
release
{
minifyEnabled true
proguardFiles 'proguard-mobiett.txt','proguard-kutuphaneler.txt'
}
}

yada aşağıdaki gibi de kullanabilirsiniz.

buildTypes 
{
relase
{
minifyEnabled true
proguardFile 'proguard-retrofit.pro'
proguardFile 'proguard-mobiett.pro'
proguardFile 'proguard-square.pro'
proguardFile 'proguard-eventbus.pro'
proguardFile 'proguard-google-play-services.pro'
proguardFile 'proguard-gson.pro'
proguardFile 'proguard-project-app.pro'
proguardFile getDefaultProguardFile('proguard-mobiett.txt')
testProguardFile 'proguard-project-test.pro'

}

Gelelim Konfigürasyon Dosyalarının İçeriğine:

Bir projeye ProGuard entegrasyonu yapmak çok basit bir iş iken, bunun konfigürasyonunu tamamlamak ne yazık ki dışarıdan göründüğü kadar kolay değildir. Proje sağlıklı çalışıncaya dek, alınan exception’lara göre ProGuard’a vermeniz gereken kodun araştırıp projenize dahil etmeniz gerekmektedir.

Aşağıdaki linklerden birçok kütüphane için yapılmış ProGuard ayarlarına kolayca ulaşabilirsiniz.

Yararlı olması dileğiyle.

Kaynaklar:

--

--