Showing posts with label proguard. Show all posts
Showing posts with label proguard. Show all posts

Tuesday, March 15, 2016

Konfigurasi Proguard untuk ButterKnife dan Otto

Apa itu ButterKnife??
Jika anda belum tahu apa itu ButterKnife, anda bisa membaca di sini , demikian juga dengan Otto , anda juga bisa membacanya di sini. Tulisan saya ini bermula ketika saya ingin meng-generate signed APK dimana aplikasi saya menggunakan ke dua library tersebut. Ketika saya saya mencoba untuk mem-build, saya mendapatkan warning sebagai berikut (klik pada gambar untuk memperbesar) :

dari baris pertama kita bisa melihat bahwa reference class annotation tidak ditemukan. Hal ini dikarenakan annotated methods dihapus oleh proguard. Untuk menghilangkan warning ini , anda bisa menambahkan beberapa konfigurasi pada proguard.
Berikut contoh konfigurasi yang bisa anda pasang pada proguard:
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keep class **$$ViewInjector { *; }

-keepclasseswithmembernames class * {
    @butterknife.* ;
}

-keepclasseswithmembernames class * {
    @butterknife.* ;
}
-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}


Demikian tips dari saya , semoga bermanfaat :D

Monday, December 14, 2015

Android Proguard

Pada sesi kali ini kita akan sharing tentang android proguard. Apa itu Proguard ?.
Proguard adalaha tool proteksi yang diperuntukkan untuk java class digunakan untuk shrink (memperkecil ukuran), optimasi dan obfuscate code (menyembunyikan class).
Biasanya digunakan untuk mencegah decompile java class (mengubah *.class kembali menjadi *.java). Dengan proguard class name, variable dan method name bisa disamarkan.
Pada kasus ini akan dicoba untuk aplikasi android. Jika suatu aplikasi sudah beredar ke public (sudah masuk di google play) maka orang akan dengan mudah mendapatkan file APK dari aplikasi itu.
File apk sebenarnya sama seperti file zip yang berisi file *.class dan file resourse android lain (image, xml layout). Karena itu file class akan mudah di decompile dan orang akan mudah melakukan reverse-engineering.
Sekarang akan kita coba di android. Buat satu android project dan jalankan sampai terbentuk file apk.
Kemudian coba kita decompile apk itu menggunakan online decompiler ini (http://www.decompileandroid.com). download hasil decompilernya (berupa zip file kemudian extact). Di folder src package akan muncul file-file class.


Kalau classnya dibuka pun isinya akan sama seperti yang kita coding.


Tentu hal ini akan berbahaya karena code kita bisa dicuri orang.
Untuk mengaktifkan proguard di android studio ->  di build.gradle minifyEnabled di set true.

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

Kemudian kita coba decompile lagi file apk nya.



Class name sudah berubah menjadi acak (termasuk nama method dan variable), untuk class activity yang merefer ke androidManifest name nya tidak diacak. tapi method name dan varible name di dalamnya sudah diacak.

 // Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.  
 // Jad home page: http://www.geocities.com/kpdus/jad.html  
 // Decompiler options: braces fieldsfirst space lnc   
 package characters.gameofcharacters;  
 import android.view.View;  
 import android.widget.EditText;  
 import android.widget.ImageView;  
 import android.widget.RadioButton;  
 import android.widget.RadioGroup;  
 // Referenced classes of package characters.gameofcharacters:  
 //      AddCharacterActivity  
 class b  
   implements android.view.View.OnClickListener  
 {  
   final AddCharacterActivity a;  
   b(AddCharacterActivity addcharacteractivity)  
   {  
     a = addcharacteractivity;  
     super();  
   }  
   public void onClick(View view)  
   {  
     view = (RadioButton)a.findViewById(a.m.getCheckedRadioButtonId());  
     if (a.i.getTag() == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060018));  
       return;  
     }  
     if (a.j.getText().toString().trim().isEmpty())  
     {  
       a.j.setError("Cannot be empty");  
       return;  
     }  
     if (view == null)  
     {  
       AddCharacterActivity.a(a, a.getString(0x7f060017));  
       return;  
     } else  
     {  
       a.a(view);  
       return;  
     }  
   }  
 }  

Kalau name nya sudah diacak tentu kan sedikit menyulitkan orang lain saat membacanya dan mentrace nya.
Kadang ada beberapa class yang tidak boleh di obfuscated, tinggal tambahkan konfigurasi di file proguard-rule.pro.
-keep <class> : class name
-keepclassmember <class> : varible dan method name
-keepclasseswithmember <class> : class beserta variable, method name

Contoh :

 -keep class * extends android.app.Application{  
   *;  
 }  
 -keep class characters.gameofcharacters.model.** {  
   *;  
 }  
 -keepclassmembers class characters.gameofcharacters.DBHelper {  
   *;  
 }  

Ulangi proses decompiler lagi. maka class yang didefinisikan di proguard-rule akan diskip

Kelemahan

Proguard ini hanya bisa menyamarkan name nya saja tidak bisa obfuscate isi code atau algoritma kita secara utuh. Dan juga tidak bisa obfuscate untuk file file resources seperti layout xml, values xml, image, dan file assets lainnya

Sebenarnya untuk melakukan full obfuscate (full protection) kita bisa menggunakan Dex-Guard. Tapi feature ini sayangnya tidak gratis alias berbayar. Biasanya dipakai untuk aplikasi yang enterprice kelasnya. Berikut ini perbandingan antara ProGuard dan Dex-Guard.

Alternatif yang lain adalah coding menggunakan android NDK (berbasis C++) untuk beberapa code logic yang dirasa rahasia. Code yang ditulis dengan C++ akan lebih sulit didecompiler dibandingkan java.



Selamat mencoba dan semoga bermanfaat.

Terima kasih

Referensi :
1. http://developer.android.com/tools/help/proguard.html
2. https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/usage.html