作為Android應用開發者,不得不面對一個尷尬的局面,就是自己辛辛苦苦開發的應用可以被別人很輕易的就反編譯出來。
Google似乎也發現了這個問題,從SDK2.3開始我們可以看到在android-sdk-windows\tools\下面多了一個proguard資料夾
proguard是一個java程式碼混淆的工具,通過proguard,別人即使反編譯你的apk包,也只會看到一些讓人很難看懂的程式碼,從而達到保護程式碼的作用。
在工程的”default.properties”中新增這樣一句話「proguard.config=proguard.cfg」
如果想要更加複雜地混淆程式碼,可以詳細地對該檔案進行配置.
由於apk是Android虛擬機器載入的,它有一定的規範,加密apk後Dalvik無法識別apk了。完全避免是不可能的,總有人能夠破解你的程式碼。但是有幾種
方式來提高被反編譯取程式碼的難度:
1 關鍵程式碼使用jni呼叫原生代碼,用c或者c++編寫,因此相對比較難於反編譯
2 混淆java程式碼。混淆是不改變程式碼邏輯的情況下,增加無用程式碼,或者重新命名,使反編譯後的原始碼難於看懂。
-injars
-outjars
-libraryjars
-optimizationpasses 5
-dontusemixedcaseclassnam
-dontskipnonpubliclibrary
-dontpreverify 【不預校驗】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優化】
-keep public class * extends android.app.Activity 【不進行混淆保持原樣】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected <methods>;
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【對該方法不進行混淆】
}
-keepclasseswithmembernam
native <methods>;
}
-keepclasseswithmembers class * { 【保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保護指定的類檔案和類的成員】
public static final android.os.Parcelable$Creator *;
}
本文來自新浪部落格