什麼是代碼混淆javascript
Java 是一種跨平臺的、解釋型語言,Java 源代碼編譯成中間」字節碼」存儲於 class 文件中。因爲跨平臺的須要,Java 字節碼中包括了不少源代碼信息,如變量名、方法名,而且經過這些名稱來訪問變量和方法,這些符號帶有許多語義信息,很容易被反編譯成 Java 源代碼。爲了防止這種現象,咱們可使用 Java 混淆器對 Java 字節碼進行混淆。html
混 淆就是對發佈出去的程序進行從新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即便反編譯成功也很可貴出程序的 真正語義。被混淆過的程序代碼,仍然遵守原來的檔案格式和指令集,執行結果也與混淆前同樣,只是混淆器將代碼中的全部變量、函數、類的名稱變爲簡短的英文 字母代號,在缺少相應的函數名和程序註釋的況下,即便被反編譯,也將難以閱讀。同時混淆是不可逆的,在混淆的過程當中一些不影響正常運行的信息將永久丟失, 這些信息的丟失使程序變得更加難以理解。java
混淆器的做用不單單是保護代碼,它也有精簡編譯後程序大小的做用。因爲以上介紹的縮短變量和函數名以及丟失部分信息的緣由, 編譯後 jar 文件體積大約能減小25% ,這對當前費用較貴的無線網絡傳輸是有必定意義的。android
混淆文件 proguard.cfg 參數詳解web
-optimizationpasses 5 # 指定代碼的壓縮級別 -dontusemixedcaseclassnames # 是否使用大小寫混合 -dontskipnonpubliclibraryclasses # 是否混淆第三方jar -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 # 保持哪些類不被混淆 -keepclasseswithmembernames class * { # 保持 native 方法不被混淆 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 * { # 保持枚舉 enum 類不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; } -keep class MyClass; # 保持本身定義的類不被混淆
代碼混淆的方法算法
根據 SDK 的版本不一樣有 2 中不一樣的代碼混淆方式,以上的 proguard.cfg 參數詳解中所涉及到的信息是在較低版本 SDK 下的混淆腳本,事實上在高版本的 SDK 下混淆的原理和參數也與低版本的相差無幾,只是在不一樣 SDK 版本的環境下引入混淆腳本的方式有所不一樣。具體方法以下:網絡
低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 便可。app
高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時須要在 proguard-project.txt 文件中進行以下信息的配置,而後再將項目 Export 便可。下面以真實的文件進行演示說明。ide
# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt# Project target. target=android-16
以上的配置信息便是 project.properties 文件中內容,藍色文字爲咱們在代碼混淆過程當中須要添加的配置信息,其中:sdk.dir 爲你在當前機器上 SDK 的安裝路徑。若是想保留某個包下的文件不被混淆,能夠在 proguard-project.txt 文件中加入保留對應包名的語句便可。函數
# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here:-dontwarn com.cnki.android.cnkireader.** -keep class com.cnki.android.cnkireader.** { *; }# If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #}
當代碼中設計gson解析
如:
Type type = new TypeToken<List<ResultMyInvest>>() {}.getType();
myInvestList = gson.fromJson(getResponseContent().optString("result"), type);
會出現錯誤,因此此時要加上
-dontobfuscate -dontoptimize
便可