什麼是代碼混淆呢?混淆就是對釋出出去的程式進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即使反編譯成功也很難得出程式的真正語義
為什麼要進行Android代碼混淆?Android是基于Java的,Java源代碼編譯成中間“位元組碼”存儲于class檔案中,很容易被反編譯成Java源代碼。為了防止辛辛苦苦開發的東西輕易流失,就需要對将要釋出出去的程式進行混淆。接下來切入今天的正題,Android代碼混淆,可以參考上篇android應用的反編譯(點選打開連結),加深對代碼混淆要性的了解
Android混淆用到的工具:ProGuard,還具有代碼優化的作用,工作方式:去除無效的代碼,将代碼中的類名、函數名替換為晦澀難懂的名字。隻能混淆java代碼,對其它的如資源檔案等無影響,相關聯的檔案主要有proguard、proguard-project.txt、project.properties,如下圖所示:
Android代碼混淆常見問題解決方案總結
為什麼要配置proguard-project.txt檔案,如果不配置,啟用混淆功能時會把所有的java代碼混淆,而Android工程中有些代碼是不能被混淆的,是以該檔案配置的是哪些檔案不能混淆。不能被混淆的檔案主要有以下幾類:a 引用的第三方jar,已經被第三方公司混淆,再次混淆的話,執行程式就會報找不到該jar中的類;b 用到泛型的類;c 用到反射的類; d 用到java和js互動的類
基本的配置有以下三種:1 不混淆該包中的所有類 -keep class com.alipay.android.app.** {*; }
2 忽略混淆引起的包中所有類産生的警告 -dontwarn com.alipay.android.app.**
3 表明目前是一個jar(需要對jar包中的所有包下的類進行1和2處理) -libraryjarslibs/pinyi n4j-2.5.0.jar
衍生配置如下:a 不混淆某個類的構造函數 - keepclassmembers class com.ticktick.example.Test {
public void setTestString(java.lang.String);
} b 不混淆某個包中的特定類 -keep class com.ticktick.example.Test { * ; }
c 不混淆某個類的特定的函數 -keepclassmembers class com.ticktick.example.Test {
public void setTestString(java.lang.String); }
d 不混淆某個類的子類 -keep public class * extends com.ticktick.example.Test
e 不混淆某個接口的實作 -keep class * implementscom.ticktick.example.TestInterface {
public static final com.ticktick.example.TestInterface$Creator *; }
其它配置:-optimizationpasses 3
-dontusemixedcaseclassnames #混淆時不會産生形形色色的類名
-dontskipnonpubliclibraryclasses#指定不去忽略非公共的類庫
-dontpreverify#不預校驗
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#優化
注意:根據以上并不能保證所有不該混淆的都有配置,可以通過運作程式,通過程式給出的錯誤log資訊,在proguard-project.txt檔案中補 充不需要混淆的配置,這樣既能達到保護代碼不洩露,又能優化程式并同時保證程式應有的功能運作正常
常見問題歸類:1 用到afinal和gson jar包做,且已經做過jar防混淆處理,還需要對用到的實體進行防混淆配置
-keep class cn.gyyx.android.qibao.model.** {*; }
-dontwarn cn.gyyx.android.qibao.model.**
2 解決missing a type錯誤
#過濾泛型
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
#Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
3 過濾Javascript webview.addJavascriptInterface(this, "install");
this就是需要過濾的類
-keepclassmembers class cn.gyyx.android.qibao.context.fragment.servantchild.AppRecommendF ragment{
public *;
}
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
附上配置截圖:供參考
Android代碼混淆常見問題解決方案總結
以上所有配置完善後,簽名打包一個apk,試着反編譯檢視程式源碼,對照一下原工程的代碼,就可以知道代碼混淆的強大威力,經過混淆之後再也不用擔心辛辛苦苦的代碼被拿走了