天天看點

Android 如何防止代碼被反編譯

作為Android應用開發者,不得不面對一個尴尬的局面,就是自己辛辛苦苦開發的應用可以被别人很輕易的就反編譯出來。

Google似乎也發現了這個問題,從SDK2.3開始我們可以看到在Android-sdk-windows\tools\下面多了一個proguard檔案夾

proguard是一個java代碼混淆的工具,通過proguard,别人即使反編譯你的apk包,也隻會看到一些讓人很難看懂的代碼,進而達到保護代碼的作用。

在工程的"default.properties"中添加這樣一句話“proguard.config=proguard.cfg”

打包簽名後的.apk就是混淆的,其實我們隻要做一步就可以了就是在"default.properties"中添加這樣一句話“proguard.config=proguard.cfg”就可以了。

如果想要更加複雜地混淆代碼,可以詳細地對該檔案進行配置.

由于apk是Android虛拟機加載的,它有一定的規範,加密apk後Dalvik無法識别apk了。完全避免是不可能的,總有人能夠破解你的代碼。但是有幾種方式來提高被反編譯取代碼的難度:

1 關鍵代碼使用jni調用本地代碼,用c或者c++編寫,是以相對比較難于反編譯

2 混淆java代碼。混淆是不改變代碼邏輯的情況下,增加無用代碼,或者重命名,使反編譯後的源代碼難于看懂。

網上開源的java代碼混淆工具較多,一般是用ant的方式來編譯的

Android混淆檔案proguard.cfg詳解:

-injarsAndroidtest.jar【jar包所在位址】

-outjars out【輸出位址】

-libraryjars 'D:\Android-sdk-windows\platforms\android-9\android.jar' 【引用的庫的jar,用于解析injars所指定的jar類】

-optimizationpasses 5

-dontusemixedcaseclassnames 【混淆時不會産生形形色色的類名 】

-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的庫類。 】

-dontpreverify 【不預校驗】

-verbose

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【優化】

-keep public class * extendsAndroid.app.Activity  【不進行混淆保持原樣】

-keep public class * extendsAndroid.app.Application

-keep public class * extendsAndroid.app.Service

-keep public class * extendsAndroid.content.BroadcastReceiver

-keep public class * extendsAndroid.content.ContentProvider

-keep public class * extendsAndroid.app.backup.BackupAgentHelper

-keep public class * extendsAndroid.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); 【對該方法不進行混淆】

}

-keepclasseswithmembernames class * { 【保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)】

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 * extendsAndroid.app.Activity {【保護指定類的成員,如果此類受到保護他們會保護的更好 】

public void *(Android.view.View);

}

-keepclassmembers enum * {

public static **[] values();

public static ** valueOf(java.lang.String);

}

-keep class * implementsAndroid.os.Parcelable {【保護指定的類檔案和類的成員】

public static finalAndroid.os.Parcelable$Creator *;

}

轉自:http://www.linuxidc.com/Linux/2012-06/64053.htm

向部落客發送郵件