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的時候代碼進行混淆。方法很簡單,只須要三步:優化
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
上面紅色的單詞由false改爲true
-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包進行混淆 ,而後就發現它會混淆很久。。。至於對本身建立的包裏面那些類須要混淆哪些不混淆,讀者能夠本身百度這方面的語法規則,數不勝數。
混淆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日誌,定位到出錯的類,將該類混淆去掉。