Android studio 混淆配置详解
混淆
studio使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。
功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。
优点:
1.删除项目无用的资源,有效减小apk大小;
2.删除无用的类、类成员、方法和属性,还可以删除无用的注释,最大限度的优化字节码文件;
3.使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度。
配置
buildTypes{ release{ //true-打开混淆 minifyEnabledtrue //true-打开资源压缩 shrinkResourcestrue //用于设置Proguard的规划路径; proguardFilesgetDefaultProguardFile('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,一般不做修改 -optimizationpasses5 #混合时不使用大小写混合,混合后的类名为小写 -dontusemixedcaseclassnames #指定不去忽略非公共库的类 -dontskipnonpubliclibraryclasses #指定不去忽略非公共库的类成员 -dontskipnonpubliclibraryclassmembers #这句话能够使我们的项目混淆后产生映射文件 #包含有类名->混淆后类名的映射关系 -verbose #不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。 -dontpreverify #保留Annotation不混淆这在JSON实体映射时非常重要,比如fastJson -keepattributes*Annotation*,InnerClasses #避免混淆泛型 -keepattributesSignature #抛出异常时保留代码行号 -keepattributesSourceFile,LineNumberTable #指定混淆是采用的算法,后面的参数是一个过滤器 #这个过滤器是谷歌推荐的算法,一般不做更改 -optimizations!code/simplification/cast,!field/*,!class/merging/* #忽略警告 -ignorewarnings #设置是否允许改变作用域 -allowaccessmodification #把混淆类中的方法名也混淆了 -useuniqueclassmembernames #apk包内所有class的内部结构 -dumpclass_files.txt #未混淆的类和成员 -printseedsseeds_txt #列出从apk中删除的代码 -printusageunused.txt #混淆前后的映射 -printmappingmapping.txt
不能使用混淆
1、反射中使用的元素,需要保证类名、方法名、属性名不变,否则反射会有问题。
2、最好不让一些bean类混淆
3、四大组件不能混淆,四大组件必须在manifest中注册声明,而混淆后类名会发生更改,这样不符合四大组件的注册机制。
-keeppublicclass*extendsandroid.app.Activity -keeppublicclass*extendsandroid.app.Application -keeppublicclass*extendsandroid.app.Service -keeppublicclass*extendsandroid.content.BroadcastReceiver -keeppublicclass*extendsandroid.content.ContentProvider -keeppublicclass*extendsandroid.app.backup.BackupAgent -keeppublicclass*extendsandroid.preference.Preference -keeppublicclass*extendsandroid.support.v4.app.Fragment -keeppublicclass*extendsandroid.app.Fragment -keeppublicclass*extendsandroid.view.view -keeppublicclasscom.android.vending.licensing.ILicensingService
4、注解不能混淆,很多场景下注解被用于在进行时反射一些元素。
-keepattributes*Annotation*
5、不能混淆枚举中的value和valueOf方法,因为这两个方法是静态添加到代码中进行,也会被反射使用,所以无法混淆这两种方法。应用使用枚举将添加很多方法,增加了包中的方法数,将增加dex的大小。
-keepclassmembersenum*{ publicstatic**[]values(); publicstatic**valueOf(java.lang.String); }
6、JNI调用Java方法,需要通过类名和方法名构成的地址形成。
7、Java使用Native方法,Native是C/C++编写的,方法是无法一同混淆的。
-keepclasseswithmembernamesclass*{ native; }
8、JS调用Java方法
-keepattributes*JavascriptInterface*
9、Webview中JavaScript的调用方法不能混淆
注意:Webview引用的是哪个包名下的。
-keepclassmembersclassfqcn.of.javascript.interface.for.webview{ public*; } -keepclassmembersclass*extendsandroid.webkit.WebViewClient{ publicvoid*(android.webkit.WebView,java.lang.String,android.graphics.Bitmap); publicboolean*(android.webkit.WebView,java.lang.String); } -keepclassmembersclass*extendsandroid.webkit.WebViewClient{ publicvoid*(android.webkit.WebView,java.lang.String); }
10、第三方可建议使用其自身混淆规则
11、Parcelable的子类和Creator的静态成员变量不混淆,否则会出现android.os.BadParcelableExeception异常。
Serializable接口类反序列化:
-keepclass*implementsandroid.os.Parcelable{ publicstaticfinalandroid.os.Parcelable$Creator*; } -keepclass*implementsjava.io.Serializable{ public*; } -keepclassmembersclass*implementsjava.io.Serializable{ staticfinallongserialVersionUID; privatestaticfinaljava.io.ObjectStreamField[]serialPersistentFields; !static!transient; privatevoidwriteObject(java.io.ObjectOutputStream); privatevoidreadObject(java.io.ObjectInputStream); java.lang.ObjectwriteReplace(); java.lang.ObjectreadResolve(); }
12、Gson的序列号和反序列化,其实质上是使用反射获取类解析的
-keepclasscom.google.gson.**{*;} -keepclasssun.misc.Unsafe{*;} -keepclasscom.google.gson.stream.**{*;} -keepclasscom.google.gson.examples.android.model.**{*;} -keepclasscom.google.**{; ; } -dontwarnclasscom.google.gson.**
到此这篇关于Androidstudio混淆配置详解的文章就介绍到这了,更多相关Androidstudio混淆内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!