版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html
爲何須要代碼混淆呢?緣由很簡單,你的apk很容易被反編譯出來,你寫的代碼都會被看到,所以咱們須要在編譯過程當中對代碼進行必定程度的混淆,使得別人不能反編譯不出你的代碼。android
新建一個項目,Android Studio默認關閉代碼混淆開關,在build.gradle文件中,minifyEnabled 開關默認爲false,所以若是須要混淆代碼,需將false改成true,而後在文件proguard-rules.pro添加具體混淆規則。算法
經常使用的混淆規則json
#==================================API================================================= #API裏邊的類,最好都要避免混淆 -keep public class * extends android.app.Fragment -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 * extends android.support.v4.** -keep public class com.android.vending.licensing.ILicensingService -dontwarn android.annotation -keepattributes *Annotation* #=====================保留了全部的Native變量名及類名===================== -keepclasseswithmembernames class * { native <methods>; } #某些構造方法不能去混淆 -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } #枚舉類不能去混淆 -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #aidl文件不能去混淆. -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclassmembers class * { public <init>(org.json.JSONObject); } #=====================不混淆資源類===================== -keepclassmembers class **.R$* { public static <fields>; } #過濾R文件的混淆: -keep class **.R$* { *; } #=================================當前項目================================================== #通常model最好避免混淆(model可有可無,不混淆也沒多大關係)如: #-keep class com.why.project.helloworld.bean.**{*;} #===================================其餘常規================================================ #加上這句話,否則會在控制檯中報warning警告【不添加的話比較好,能夠用來驗證簽名是否成功】 #-ignorewarnings #設置混淆的壓縮比率 0 ~ 7 -optimizationpasses 5 #Aa aA -dontusemixedcaseclassnames #混淆後生產映射文件 map 類名->轉化後類名的映射 -verbose #混淆採用的算法. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
解決方法以下:app
打開 proguard-rules.cfg文件ide
在全部的-libraryjars 前插入 # 變成 #-libraryjars xxxx.jarpost
緣由是build.gradle文件配置了gradle
舊版本:ui
新版本:url
裏面已經添加過jar包,經過 proguard 混淆代碼時默認已經將 lib目錄中的 jar 都已經添加到打包腳本中,因此不須要再次手動添加。