安卓代碼混淆

Proguard是安卓提供的方便開發者對代碼和apk進行保護和精簡的工具,可在SDK/tools文件夾下找到。linux

 

proguard的做用 :android

1,代碼混淆apache

2,精簡代碼,刪掉沒有用到的代碼,減少apk的體積。json

 

使用場景:服務器

1,對sighed APK進行代碼混淆和精簡,從而使得發佈的代碼能夠防止被別人反編譯解析。(注意,直接build生成的APK是不進行混淆的,必須是signed的apk纔會混淆)app

2,對jar包進行混淆,方便將本身的代碼(jar包)給別人使用並保證關鍵代碼的不可見性。ide

 

下面分別針對以上兩種狀況進行說明:工具

混淆APK:gradle

所謂混淆APK,就是讓反編譯APK後獲得的代碼是混淆的。在Android Studio中,能夠自動在打包APK的時候代碼進行混淆。方法很簡單,只須要三步:優化

  • 在app下的build.gradle中配置:

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

}

上面紅色的單詞由false改爲true

  • 在proguard-rules.pro中進行配置,即按照proguard的語法規則對本身工程中的代碼進行選擇性的混淆。這裏給出一個典型的配置以下:

 

-optimizationpasses 5                                             #指定代碼壓縮級別

-dontusemixedcaseclassnames                                 #混淆時不會產生形形色色的類名

-dontskipnonpubliclibraryclasses                            #指定不忽略非公共類庫

-dontpreverify                                              #不預校驗,若是須要預校驗,是-dontoptimize

-ignorewarnings                                             #屏蔽警告

-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.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keep class android.support.v7.** { *; }    #過濾android.support.v7  注意這裏v4仍是v7要看gradle裏面compile了那個擴展包

-keep interface android.support.constraint.** { *; }

-keep class com.alibaba.fastjson.** {*;}    #保持第三方包fastjson不被混淆,不然會報錯

 

以上代碼中,藍色基本能夠固定不變,綠色部分是爲了讓引入的第三方包不混淆,若是不添加會報錯。好比不添加v7支持包則會致使Studio對整個V7包進行混淆 ,而後就發現它會混淆很久。。。至於對本身建立的包裏面那些類須要混淆哪些不混淆,讀者能夠本身百度這方面的語法規則,數不勝數。

  • 利用Studio中的build-signedAPK發佈簽名APK,完了之後在app下就會生成app-release.apk,這個就是咱們獲得的混淆代碼後的apk。下圖就是反編譯APK之後獲得的 jar包中的代碼,已經被混淆。

 

 

混淆JAR包:

 

jar包的混淆方法我以前試過在Studio中進行,結果愣是沒搞定,而後我就採用的proguard自帶的GUI界面實現了jar包混淆,方法爲:

 

在安卓SDK下找到\tools\proguard\bin文件夾,打開proguardgui.bat(linux下爲.sh),出現一個界面,這裏其實挺簡單,首先按照上面說的proguard-rules.pro裏面的規則寫一個配置文件,後綴是.txt,而後加載,直接跳到最後一步process便可,這裏須要注意的是,配置文件裏面跟以前不太同樣,主要有兩點區別:

 

1,由於是對jar包混淆,因此須要寫上injar和outjar的名字,好比我寫的:

 

-injars android.jar

-outjars 'confuseDemo.jar'

 

其中android.jar是須要混淆的jar包(放到proguardgui.bat同個目錄下),後者爲混淆後的 jar包,會自動在該目錄下生成。

 

2,被混淆的jar包不包含裏面引用到的第三方庫,須要在配置文件裏面聲明它用到的第三方jar包,好比我寫的:

 

-libraryjars C:\Users\Machenike-Pc\Desktop\fastjson.jar

-libraryjars C:\Users\Machenike-Pc\Desktop\org.apache.http.legacy.jar

-libraryjars  E:\softneed\Andriod\AndroidSDK\platforms\android-21\android.jar

 

須要注意最後一行,由於安卓工程確定要用安卓SDK,所以要加上對應版本的sdk中的jar包

其餘的寫法跟以前的proguard-rules.pro相同。

 

 

最後總結一下:在混淆過程當中,若是工程比較大,一次混淆極可能會出現各類問題,這裏就須要有耐心逐個排除。在較大的工程中引用的jar包可能會有數十個,各個jar包在官網或使用說明裏可能會有說明如何在混淆中使用。若是沒有,最好是將整個jar包都不要混淆,即加上規則: -keep class xx.xxx.xxxx.** {*;} ,該方法能夠將jar包裏面的全部類和子包裏面的類都排除不混淆,就不會出現問題。 此外即便全部的包都不混淆,也有報錯的可能,主要有兩個緣由:

1.沒有按照規則把系統組件,資源類,枚舉等排除,好比我在項目中就忘記了將實現Parcelable接口的類排除,結果致使服務器傳來的數據沒法獲取,app運行時沒有正常顯示數據。

2.有的jar包中使用了反射技術,此時在調用時就會出現及時jar包沒有混淆,可是若是調用的類混淆了,也會產生錯誤。這種狀況下須要經過看log日誌,定位到出錯的類,將該類混淆去掉。

相關文章
相關標籤/搜索