美文网首页
Android 混淆

Android 混淆

作者: 王冥 | 来源:发表于2019-08-13 18:04 被阅读0次

    混淆

    studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。

    功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。

    优点:

    1.删除项目无用的资源,有效减小apk大小;

    2.删除无用的类、类成员、方法和属性,还可以删除无用的注释,最大限度的优化字节码文件;

    3.使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度。

    配置

    buildTypes { release {// true - 打开混淆minifyEnabledtrue// true - 打开资源压缩shrinkResourcestrue// 用于设置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,一般不做修改-optimizationpasses5# 混合时不使用大小写混合,混合后的类名为小写-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 中注册声明,而混淆后类名会发生更改,这样不符合四大组件的注册机制。

    -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.** {;    ;}

    -dontwarn com.google.gson.**

    优秀文章

    Android Proguard(混淆)

    摘录https://www.jianshu.com/p/48d6bce58e47

    相关文章

      网友评论

          本文标题:Android 混淆

          本文链接:https://www.haomeiwen.com/subject/lvgbjctx.html