Android studio 混淆 Android studio 混淆配置详解
Endv 人气:0混淆
studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。
功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。
优点:
1.删除项目无用的资源,有效减小apk大小;
2.删除无用的类、类成员、方法和属性,还可以删除无用的注释,最大限度的优化字节码文件;
3.使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度。
配置
buildTypes { release { // true - 打开混淆 minifyEnabled true // true - 打开资源压缩 shrinkResources true // 用于设置Proguard的规划路径; proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', '../libModule/proguard-rules.pro' } }
- proguard-android.txt:其中proguard-android.txt 是系统默认的混淆文件,具体在../sdk/tools/proguard/ 目录下,其中包含了 android 最基本的混淆,一般不需要改动;
- proguard-rules.pro:是我们需要配置的规则;如果要配置多个Module的混淆文件,只需要后面添加逗号跟混淆文件路径;
- 基本混淆配置
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改 -optimizationpasses 5 # 混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames # 指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses # 指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers # 这句话能够使我们的项目混淆后产生映射文件 # 包含有类名->混淆后类名的映射关系 -verbose # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 -dontpreverify # 保留Annotation不混淆 这在JSON实体映射时非常重要,比如fastJson -keepattributes *Annotation*,InnerClasses # 避免混淆泛型 -keepattributes Signature # 抛出异常时保留代码行号 -keepattributes SourceFile,LineNumberTable # 指定混淆是采用的算法,后面的参数是一个过滤器 # 这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations !code/simplification/cast,!field/*,!class/merging/* # 忽略警告 -ignorewarnings # 设置是否允许改变作用域 -allowaccessmodification # 把混淆类中的方法名也混淆了 -useuniqueclassmembernames # apk 包内所有 class 的内部结构 -dump class_files.txt # 未混淆的类和成员 -printseeds seeds_txt # 列出从apk中删除的代码 -printusage unused.txt # 混淆前后的映射 -printmapping mapping.txt
不能使用混淆
1、反射中使用的元素,需要保证类名、方法名、属性名不变,否则反射会有问题。
2、最好不让一些bean 类混淆
3、四大组件不能混淆,四大组件必须在 manifest 中注册声明,而混淆后类名会发生更改,这样不符合四大组件的注册机制。
-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.BackupAgent -keep public class * extends android.preference.Preference -keep public class * extends android.support.v4.app.Fragment -keep public class * extends android.app.Fragment -keep public class * extends android.view.view -keep public class com.android.vending.licensing.ILicensingService
4、注解不能混淆,很多场景下注解被用于在进行时反射一些元素。
-keepattributes *Annotation*
5、不能混淆枚举中的value和valueOf方法,因为这两个方法是静态添加到代码中进行,也会被反射使用,所以无法混淆这两种方法。应用使用枚举将添加很多方法,增加了包中的方法数,将增加 dex 的大小。
-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
6、JNI 调用 Java 方法,需要通过类名和方法名构成的地址形成。
7、Java 使用 Native 方法,Native 是C/C++编写的,方法是无法一同混淆的。
-keepclasseswithmembernames class * { native <methods>; }
8、JS 调用Java 方法
-keepattributes *JavascriptInterface*
9、Webview 中 JavaScript 的调用方法不能混淆
注意: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, java.lang.String); }
10、第三方可建议使用其自身混淆规则
11、Parcelable 的子类和 Creator 的静态成员变量不混淆,否则会出现 android.os.BadParcelableExeception 异常。
Serializable 接口类反序列化:
-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keep class * implements java.io.Serializable { public *; } -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); }
12、Gson 的序列号和反序列化,其实质上是使用反射获取类解析的
-keep class com.google.gson.** {*;} -keep class sun.misc.Unsafe {*;} -keep class com.google.gson.stream.** {*;} -keep class com.google.gson.examples.android.model.** {*;} -keep class com.google.** { <fields>; <methods>; } -dontwarn class com.google.gson.**
加载全部内容