Android studio生成arr包並混淆精解
-
grade配置
使用AndroidStudio , 在 build.grade 的配置檔案中增加如下配置即可:
buildTypes { release { debuggable false minifyEnabled true //是否啟動混淆 ture:開啟false:關閉 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }
-
找到 proguard-rules.pro檔案增加混淆方法
只要在工程應用目錄的gradle檔案中設定minifyEnabled:true即可。然後我們就可以到proguard-rules.pro檔案中加入我們的混淆規則了,這裡展示一些常用的混淆:自定義不混淆的需要在自定義後面增加
############################################# # # 對於一些基本指令的新增 # ############################################# # 程式碼混淆壓縮比,在0~7之間,預設為5,一般不做修改 -optimizationpasses 5 # 混合時不使用大小寫混合,混合後的類名為小寫 -dontusemixedcaseclassnames # 指定不去忽略非公共庫的類 -dontskipnonpubliclibraryclasses # 這句話能夠使我們的專案混淆後產生對映檔案 # 包含有類名->混淆後類名的對映關係 -verbose # 指定不去忽略非公共庫的類成員 -dontskipnonpubliclibraryclassmembers # 不做預校驗,preverify是proguard的四個步驟之一,Android不需要preverify,去掉這一步能夠加快混淆速度。 -dontpreverify # 保留Annotation不混淆 -keepattributes *Annotation*,InnerClasses # 避免混淆泛型 -keepattributes Signature # 丟擲異常時保留程式碼行號 -keepattributes SourceFile,LineNumberTable # 指定混淆是採用的演算法,後面的引數是一個過濾器 # 這個過濾器是谷歌推薦的演算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* ############################################# # # Android開發中一些需要保留的公共部分 # ############################################# # 保留我們使用的四大元件,自定義的Application等等這些類不被混淆 # 因為這些子類都有可能被外部呼叫 -keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -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.view.View -keep public class com.android.vending.licensing.ILicensingService # 保留support下的所有類及其內部類 -keep class android.support.** {*;} # 保留繼承的 -keep public class * extends android.support.v4.** -keep public class * extends android.support.v7.** -keep public class * extends android.support.annotation.** # 保留R下面的資源 -keep class **.R$* {*;} # 保留本地native方法不被混淆 -keepclasseswithmembernames class * { native <methods>; } # 保留在Activity中的方法引數是view的方法, # 這樣以來我們在layout中寫的onClick就不會被影響 -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } # 保留列舉類不被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } # 保留我們自定義控制元件(繼承自View)不被混淆 -keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } # 保留Parcelable序列化類不被混淆 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留Serializable序列化的類不被混淆 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; !private <fields>; !private <methods>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # 對於帶有回撥函式的onXXEvent、**On*Listener的,不能被混淆 -keepclassmembers class * { void *(**On*Event); void *(**On*Listener); } # webView處理,專案中沒有使用到webView忽略即可 -keepclassmembers class fqcn.of.javascript.interface.for.webview { public *; } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.webViewClient { public void *(android.webkit.webView, jav.lang.String); } ############################################# # # 自定義不混淆區域 # #############################################
混淆 ProGuard常用語法
//不混淆某個類 -keep public class 所在包名.類名 { *; } //不混淆某個類的子類 -keep public class * extends 所在包名.類名 { *; } //不混淆所有類名中包含了“model”的類及其成員 -keep public class **.*model*.** {*;} //不混淆某個介面的實現 -keep class * implements 所在包名.介面類名 { *; } //不混淆某個類的構造方法 -keepclassmembers class 所在包名.類名 { public <init>(); } //不混淆某個類的特定的方法 -keepclassmembers class 所在包名.類名 { public void test(java.lang.String); } //不混淆某個類的內部類 -keep class 所在包名.類名$* { *; } //兩個常用的混淆命令,注意: //一顆星表示只是保持該包下的類名,而子包下的類名還是會被混淆; //兩顆星表示把本包和所含子包下的類名都保持; -keep class com.suchengkeji.android.ui.** -keep class com.suchengkeji.android.ui.* //用以上方法保持類後,你會發現類名雖然未混淆,但裡面的具體方法和變數命名還是變了, //如果既想保持類名,又想保持裡面的內容不被混淆,我們就需要以下方法了 //不混淆某個包所有的類 -keep class com.suchengkeji.android.bean.** { *; }
從混淆後的目錄看到,程式碼明顯暈未混淆的不同,屬性方法基本都用啊,b,c...表示了,更不容易看懂程式碼結果和方法,這就減少了原始碼的外洩等