Android 代码混淆语法

指定代码的压缩级别

1
-optimizationpasses 5

包明不混合大小写

1
-dontusemixedcaseclassnames

不去忽略非公共的库类

1
-dontskipnonpubliclibraryclasses

优化不优化输入的类文件

1
-dontoptimize

预校验

1
-dontpreverify

混淆时是否记录日志

1
-verbose

混淆时所采用的算法

1
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

保护注解

1
-keepattributes *Annotation*

保持哪些类不被混淆

1
2
3
4
5
6
7
8
9
-keep public classextends android.app.Fragment
-keep public classextends android.app.Activity
-keep public classextends android.app.Application
-keep public classextends android.app.Service
-keep public classextends android.content.BroadcastReceiver
-keep public classextends android.content.ContentProvider
-keep public classextends android.app.backup.BackupAgentHelper
-keep public classextends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

如果有引用v4包可以添加下面这行

1
-keep public classextends android.support.v4.app.Fragment

apk 包内所有 class 的内部结构

1
-dump class_files.txt

未混淆的类和成员

1
-printseeds seeds.txt

列出从 apk 中删除的代码

1
-printusage unused.txt

混淆前后的映射

1
-printmapping mapping.txt

保持 native 方法不被混淆

1
2
3
-keepclasseswithmembernames class * {
native \<methods\>;

}

保持自定义控件类不被混淆

1
2
3
-keepclasseswithmembers class * {
public \<init\>(android.content.Context, android.util.AttributeSet);

}

保持自定义控件类不被混淆

1
2
3
-keepclasseswithmembers class{
public \<init\>(android.content.Context, android.util.AttributeSet, int);
}

保持自定义控件类不被混淆

1
2
3
-keepclassmembers classextends android.app.Activity {
public void *(android.view.View);
}

保持 Parcelable 不被混淆

1
2
3
-keep classimplements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}

保持 Serializable 不被混淆

1
-keepnames classimplements java.io.Serializable

保持 Serializable 不被混淆并且enum 类也不被混淆

1
2
3
4
5
6
7
8
9
10
11
-keepclassmembers classimplements 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();
}

不混淆资源类

1
2
3
4
5
6
7
8
9
10
11
-keepclassmembers class **.R$* {
public static \<fields\>;

}
-keep class **.R$* -keep class org.apache.http.** 
-keep class android.support.v7.widget.**{*;}
-keep class android.support.design.**{*;}
-keep public class android.support.v7.widget.LinearLayoutManager

-keep public classextends android.support.v7.widget.CardView$LayoutManager{
public \<init\>(...);

}

support-v4

1
2
3
-dontwarn android.support.v4.** 
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

support-v7

1
2
3
-dontwarn android.support.v7.** 
-keep class android.support.v7.internal.** { *; }
-keep interface android.support.v7.internal.** { *; }