安卓混淆和資源壓縮
摘要:
開啟混淆配置
android {
...
buildTypes {
release {
// zipAlign可以讓安裝包中的資源按4位元組對齊,這樣可以減少應用在執行時的記憶體消耗。
zipAlignEnable...
開啟混淆配置
android { ... buildTypes { release { // zipAlign可以讓安裝包中的資源按4位元組對齊,這樣可以減少應用在執行時的記憶體消耗。 zipAlignEnabled true // 壓縮資源 shrinkResources true // 開啟混淆 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
通用規則
#指定壓縮級別 -optimizationpasses 5 #不跳過非公共的庫的類成員 -dontskipnonpubliclibraryclassmembers #混淆時採用的演算法 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #把混淆類中的方法名也混淆了 -useuniqueclassmembernames #優化時允許訪問並修改有修飾符的類和類的成員 -allowaccessmodification #將檔案來源重新命名為“SourceFile”字串 -renamesourcefileattribute SourceFile #保留行號 -keepattributes SourceFile,LineNumberTable #保持泛型 -keepattributes Signature #保持所有實現 Serializable 介面的類成員 -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } #Fragment不需要在AndroidManifest.xml中註冊,需要額外保護下 -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native -keepclasseswithmembernames class * { native <methods>; } # keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View { void set*(***); *** get*(); } # We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keepclassmembers class * implements android.os.Parcelable { # 保持Parcelable不被混淆 public static final android.os.Parcelable$Creator CREATOR; } -keepclassmembers class **.R$* { public static <fields>; } # The support library contains references to newer platform versions. # Don't warn about those in case this app is linking against an older # platform version.We know about them, and they are safe. -dontwarn android.support.** # Understand the @Keep support annotation. -keep class android.support.annotation.Keep -keep @android.support.annotation.Keep class * {*;} -keepclasseswithmembers class * { @android.support.annotation.Keep <methods>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <fields>; } -keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...); } # 保持測試相關的程式碼 -dontnote junit.framework.** -dontnote junit.runner.** -dontwarn android.test.** -dontwarn android.support.test.** -dontwarn org.junit.**
哪些需要新增keep規則
- 三方庫
- 反射程式碼
- JNI native程式碼
- webview js注入方法相關類
自定義規則及語法
- 不混淆某個類
-keep public class name.huihui.example.Test { *; }
- 不混淆某個包所有的類
-keep class name.huihui.test.** { *; }
- 不混淆某個類的子類
-keep public class * extends name.huihui.example.Test { *; }
- 不混淆所有類名中包含了“model”的類及其成員
-keep public class **.*model*.** {*;}
- 不混淆某個介面的實現
-keep class * implements name.huihui.example.TestInterface { *; }
- 不混淆某個類的構造方法
-keepclassmembers class name.huihui.example.Test { <init>; #匹配所有構造器 <fields>;#匹配所有域 <methods>;#匹配所有方法} public void test(java.lang.String); # 特定方法 public <methods>;#保持該類下所有的共有方法不被混淆 public *;#保持該類下所有的共有內容不被混淆 private <methods>;#保持該類下所有的私有方法不被混淆 private *;#保持該類下所有的私有內容不被混淆 public <init>(java.lang.String);#保持該類的String型別的構造方法 }
- 不混淆某個類的內部類
-keep class name.huihui.example.Test$* { *; }