Android混淆大全,一篇就够了

Proguard介绍

Android SDK自带了混淆工具Proguard。它位于SDK根目录\tools\proguard下面。 ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。它可以将类、字段和方法使用短无意义的名称进行重命名。最后,预校验的Java6或针对Java MicroEdition的所述处理后的码。
如果开启了混淆,Proguard默认情况下会对所有代码,包括第三方包都进行混淆,可是有些代码或者第三方包是不能混淆的,这就需要我们手动编写混淆规则来保持不能被混淆的部分。

  • 项目中如果含有多个module时,在主app中设置了混淆其他module都会混淆。
    在App module build.gradle中
android {......defaultConfig {......}buildTypes {release {minifyEnabled true      // 开启代码混淆zipAlignEnabled true    // 开启Zip压缩优化shrinkResources true    // 移除未被使用的资源proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}......
}

上面这几个功能都是默认打开的,要关闭他们只需配置对应的规则即可。
混淆后默认会在工程目录app/build/outputs/mapping/release下生成一个mapping.txt文件,这就是混淆规则,我们可以根据这个文件把混淆后的代码反推回源本的代码,所以这个文件很重要,注意保护好。原则上,代码混淆后越乱越无规律越好,但有些地方我们是要避免混淆的,否则程序运行就会出错。

Proguard作用

Android中的“混淆”可以分为两部分,一部分是 Java 代码的优化与混淆,依靠 proguard 混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系,但一般我们都会放一起讲)。

基本指令

> -ignorewarning:是否忽略警告
> -optimizationpasses n:指定代码的压缩级别(在0~7之间,默认为5)
> -dontusemixedcaseclassnames:是否使用大小写混合(windows大小写不敏感,建议加入)
> -dontskipnonpubliclibraryclasses:是否混淆非公共的库的类
> -dontskipnonpubliclibraryclassmembers:是否混淆非公共的库的类的成员
> -dontpreverify:混淆时是否做预校验(Android不需要预校验,去掉可以加快混淆速度)
> -verbose:混淆时是否记录日志(混淆后会生成映射文件)
> -obfuscationdictionary dictionary_path:指定外部模糊字典
> -classobfuscationdictionary dictionary_path:指定class模糊字典
> -packageobfuscationdictionary dictionary_path:指定package模糊字典
> -optimizations !code/simplification/arithmetic,!field/,!class/merging/,!code/allocation/variable:混淆时所采用的算法(谷歌推荐算法)
> -libraryjars libs(*.jar;):添加支持的jar(引入libs下的所有jar包)
> -renamesourcefileattribute SourceFile:将文件来源重命名为“SourceFile”字符串
> -keepattributes Annotation:保持注解不被混淆
> -keep class * extends java.lang.annotation.Annotation {*;}:保持注解不被混淆
> -keep interface * extends java.lang.annotation.Annotation { *; }:保持注解不被混淆
> -keepattributes Signature:保持泛型不被混淆
> -keepattributes EnclosingMethod:保持反射不被混淆
> -keepattributes Exceptions:保持异常不被混淆
> -keepattributes InnerClasses:保持内部类不被混淆
> -keepattributes SourceFile,LineNumberTable:抛出异常时保留代码行号
> -keep [,modifier,...] class_specification:指定需要保留的类和类成员(作为公共类库,应该保留所有可公开访问的public方法)
> -keepclassmembers [,modifier,...] class_specification:指定需要保留的类成员:变量或者方法
> -keepclasseswithmembers [,modifier,...] class_specification:指定保留的类和类成员,条件是所指定的类成员都存在(既在压缩阶段没有被删除的成员,效果和keep差不多)
> -keepnames class_specification:指定要保留名称的类和类成员,前提是在压缩阶段未被删除,仅用于模糊处理。[-keep
> allowshrinking class_specification 的简写]
> -keepclassmembernames class_specification:指定要保留名称的类成员,前提是在压缩阶段未被删除,仅用于模糊处理。[-keepclassmembers
> allowshrinking class_specification 的简写]
> -keepclasseswithmembernames class_specification:指定要保留名称的类成员,前提是在压缩阶段后所指定的类成员都存在,仅用于模糊处理。[-keepclasseswithmembers
> allowshrinking class_specification 的简写]
> -printseeds [filename]:指定详尽列出由各种-keep选项匹配的类和类成员。列表打印到标准输出或给定文件。 该列表可用于验证是否真的找到了预期的类成员,特别是如果您使用通配符。

保持元素不参与混淆的规则的命令格式:

[保持命令] [类] {[成员]
}
**类**
代表类相关的限定条件,它将最终定位到某些符合该限定条件的类。它的内容可以使用:
具体的类
访问修饰符(public、protected、private)
通配符*,匹配任意长度字符,但不含包名分隔符(.)
通配符**,匹配任意长度字符,并且包含包名分隔符(.)
extends,即可以指定类的基类
implement,匹配实现了某接口的类
$,内部类
**成员**
代表类成员相关的限定条件,它将最终定位到某些符合该限定条件的类成员。它的内容可以使用:
<init> 匹配所有构造器
<fields> 匹配所有域
<methods> 匹配所有方法
通配符*,匹配任意长度字符,但不含包名分隔符(.)
通配符**,匹配任意长度字符,并且包含包名分隔符(.)
通配符***,匹配任意参数类型
…,匹配任意长度的任意类型参数。
比如void test(…)就能匹配任意 void test(String a) 或者是
void test(int a, String b) 这些方法。
访问修饰符(public、protected、private)
# 保持继承了BaseActivity的public修饰的类名不被混淆
-keep public class * extends com.xing.weijian.base.BaseActivity
# 内部类使用 $ 号,保持 TabFragment 中 内部类 OnFragmentData的所有 public 修饰的都不被混淆掉
-keepclassmembers class com.xing.weijian.TabFragment$OnFragmentData{public *;
}<init>   # 匹配所有构造函数
<fields>  # 匹配所有成员变量
<methods> # 匹配所有的方法可以在它们前面添加 private ,public 进行进一步更精细的限制范围,比如保持 User 类中 所有 public 方法不被混淆:
-keep class com.xing.weijian.bean.User {public <methods>;
}
也可以在方法中加入参数进行限定:比如 保持 User 类的 public 修饰,参数是 String 类型的方法不被混淆:
-keep class com.xing.weijian.bean.User {public <methods>(String);
}
内部类使用 $ 号,保持 TabFragment 中 内部类 OnFragmentData的所有 public 修饰的都不被混淆掉
-keepclassmembers class com.xing.weijian.TabFragment$OnFragmentData{public *;
}
jni 方法不能混淆,因为这个方法需要和 native 方法保持一致
-keepclasseswithmembernames class * { # 保持native方法不被混淆    native <methods>;
}

不混淆某个类

-keep public class com.android.proguard.example.Test { *; }

不混淆某个包所有的类

-keep class com.android.proguard.example.** { *; }

不混淆某个类的子类

-keep public class * extends com.android.proguard.example.Test { *; }

不混淆所有类名中包含了“model”的类及其成员

-keep public class **.*model*.** {*;}

不混淆某个接口的实现

-keep class * implements com.android.proguard.example.TestInterface { *; }

不混淆某个类的构造方法

-keepclassmembers class com.android.proguard.example.Test {public <init>();
}

不混淆某个类的特定的方法

-keepclassmembers class com.android.proguard.example.Test {public void test(java.lang.String);
}

不混淆某个类的内部类

-keep class com.android.proguard.example.Test$* {*;}
  • keep 与 keepclassmembers , keepclasseswithmembers

配置混淆规则

# --------------------------------------------基本指令区--------------------------------------------#
-ignorewarning                                      # 是否忽略警告
-optimizationpasses 5                               # 指定代码的压缩级别(在0~7之间,默认为5)
-dontusemixedcaseclassnames                         # 是否使用大小写混合(windows大小写不敏感,建议加入)
-dontskipnonpubliclibraryclasses                    # 是否混淆非公共的库的类
-dontskipnonpubliclibraryclassmembers               # 是否混淆非公共的库的类的成员
-dontpreverify                                      # 混淆时是否做预校验(Android不需要预校验,去掉可以加快混淆速度)
-verbose                                            # 混淆时是否记录日志(混淆后会生成映射文件)#指定外部模糊字典
-obfuscationdictionary dictionary1.txt
#指定class模糊字典
-classobfuscationdictionary dictionary1.txt
#指定package模糊字典
-packageobfuscationdictionary dictionary2.txt#混淆时所采用的算法(谷歌推荐算法)
-optimizations !code/simplification/arithmetic,!field,!class/merging,!code/allocation/variable#添加支持的jar(引入libs下的所有jar包)
-libraryjars libs(*.jar;)#将文件来源重命名为“SourceFile”字符串
-renamesourcefileattribute SourceFile#保持注解不被混淆
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation {*;}#保持泛型不被混淆
-keepattributes Signature
#保持反射不被混淆
-keepattributes EnclosingMethod
#保持异常不被混淆
-keepattributes Exceptions
#保持内部类不被混淆
-keepattributes Exceptions,InnerClasses
#抛出异常时保留代码行号
-keepattributes SourceFile,LineNumberTable#------------------------------------默认保留区--------------------------------------#
#保持基本组件不被混淆
-keep public class * extends android.app.Fragment
-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.BackupAgentHelper
-keep public class * extends android.preference.Preference#保持 Google 原生服务需要的类不被混淆
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService#Support包规则
-dontwarn android.support.**
-keep public class * extends android.support.v4.**
-keep public class * extends android.support.v7.**
-keep public class * extends android.support.annotation.**#保持 native 方法不被混淆
-keepclasseswithmembernames class * {native &lt;methods&gt;;
}#保留自定义控件(继承自View)不被混淆
-keep public class * extends android.view.View {*** get*();void set*(***);public &lt;init&gt;(android.content.Context);public &lt;init&gt;(android.content.Context, android.util.AttributeSet);public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
}#保留指定格式的构造方法不被混淆
-keepclasseswithmembers class * {public &lt;init&gt;(android.content.Context, android.util.AttributeSet);public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
}#保留在Activity中的方法参数是view的方法(避免布局文件里面onClick被影响)
-keepclassmembers class * extends android.app.Activity {public void *(android.view.View);
}#保持枚举 enum 类不被混淆
-keepclassmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);
}#保持R(资源)下的所有类及其方法不能被混淆
-keep class **.R$* { *; }#保持 Parcelable 序列化的类不被混淆(注:aidl文件不能去混淆)
-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;
}#需要序列化和反序列化的类不能被混淆(注:Java反射用到的类也不能被混淆)
-keepnames class * implements java.io.Serializable#持 Serializable 序列化的类成员不被混淆
-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient &lt;fields&gt;;!private &lt;fields&gt;;!private &lt;methods&gt;;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();
}#保持 BaseAdapter 类不被混淆
-keep public class * extends android.widget.BaseAdapter { *; }
#保持 CusorAdapter 类不被混淆
-keep public class * extends android.widget.CusorAdapter{ *; }#-------------------------------------webView区---------------------------------------#
#WebView处理,项目中没有使用到webView忽略即可
#保持Android与JavaScript进行交互的类不被混淆
-keep class **.AndroidJavaScript { *; }
-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.WebChromeClient {public void *(android.webkit.WebView,java.lang.String);
}#网络请求相关
-keep public class android.net.http.SslError#-------------------------------------删除代码区--------------------------------------#
删除代码中Log相关的代码
-assumenosideeffects class android.util.Log {public static boolean isLoggable(java.lang.String, int);public static int v(...);public static int i(...);public static int w(...);public static int d(...);public static int e(...);
}#---------------------------------1.实体类---------------------------------
#--------------------------------------------------------------------------
#---------------------------------2.与JS交互的类-----------------------------
#--------------------------------------------------------------------------
#---------------------------------3.反射相关的类和方法-----------------------
#--------------------------------------------------------------------------
#---------------------------------2.第三方依赖--------------------------------
#--------------------------------------------------------------------------

Android 混淆大全一篇就够了相关推荐

  1. hive优化大全-一篇就够了

    1.概述 在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据量大不 ...

  2. Android混淆总结篇(一)

    前言 这阵子自己的心又长草了,静不下来~又挺迷茫的!在这个纷纷跳槽的季节,感觉还是应该让自己静下心来多学习学习.还是写写博客,总结总结~梳理下心里的野草. 上个月跟朋友讨论了这么一问题:"项 ...

  3. Android画中画模式-看这篇就够啦

    最近做做播放器,有个浮窗播放的需求,两种实现方式,一种是申请浮窗权限,创建浮窗参考 flowWindow,一种是采用画中画模式(8.0以上) 关于画中画 Android 8.0 Oreo(API Le ...

  4. Android原生TabLayout使用全解析,看这篇就够了

    前言 为什么会有这篇文章呢,是因为之前关于TabLayout的使用陆陆续续也写了好几篇了,感觉比较分散,且不成体系,写这篇文章的目的就是希望能把各种效果的实现一次性讲齐,所以也有了标题的「看这篇就够了 ...

  5. Android微信分享功能集成开发指南(这一篇就够了)

    前言 本文介绍的只是微信开发中的一个功能,分享.看到网上很多关于微信分享的博客.帖子,说实话,没几篇写的全的,很多都是复制粘贴,介绍的也不全,缺少代码的分析,关键性的代码总是漏一句两句,看着就很难受. ...

  6. SpringAOP从入门到源码分析大全,学好AOP这一篇就够了(二)

    文章目录 系列文档索引 四.Spring AOP的使用入门 1.激活AspectJ模块 (1)注解激活 (2)XML激活 2.创建 @AspectJ 代理(了解) (1)编程方式创建 @AspectJ ...

  7. (转载) android项目大全,总有你所需的

    目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...

  8. android 项目大全,总有你所需的

    android项目大全,总有你所需的 目录(?)[+] 注:打开请贴网址,有些直接通过链接打开的不正确. 1.相对布局实例 http://kukuqiu.iteye.com/blog/1018396 ...

  9. 新手入门一篇就够:从零开发移动端IM

    一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和交流门槛,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...

  10. api网关选型_如何轻松打造百亿流量API网关?看这一篇就够了(下)

    如何轻松打造百亿流量API网关?看这一篇就够了(上) 上篇整体描述了网关的背景,涉及职能.分类.定位环节,本篇进入本文的重点,将会具体谈下百亿级流量API网关的演进过程. 准备好瓜子花生小板凳开始积累 ...

最新文章

  1. 【ACM】Doubly Linked List(STL list)
  2. 底部固定菜单_【悬浮菜单】安卓悬浮amp;手势助手
  3. python gil锁_python中的GIL锁
  4. Java 11功能– Java飞行记录器
  5. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
  6. android之APP模块编译
  7. 定义下一代存储,打造全新一代数据基础设施
  8. Java == equal
  9. 关于java中的位运算
  10. 四种变量的区别(局部变量,全局变量,静态局部变量,静态全局变量)
  11. 尚学堂科技_王勇_JAVA视频教程_Hibernate
  12. android intent json,如何从android中的Intent服务中的服务器获取Json响应?
  13. 计算机课件大学,大学计算机基础应用课件
  14. Python 全栈打造某宝客微信机器人
  15. oracle本地数据库登录之连接pdb数据库
  16. 【机器学习】偏差-方差分解Bias-variance Decomposition
  17. 几何平均数,代数平均数: 调和是什么意思,调和平均数 点火公式 平面曲线弧长(代数方程,参数方程,极坐标方程) 旋转曲面面积 旋转体体积 拉格朗日乘数法求最值;
  18. 多元相关与回归分析及R使用
  19. 如何申请微信号测试账号,进行微信开发
  20. Linux sqlite3基本命令

热门文章

  1. 领域驱动设计思维导图
  2. SATA工作模式咋选?揭秘AHCI和IDE区别(全文)
  3. 继电器rc吸收电路取值_RC吸收电路
  4. 三菱plc控制步进电机实例_「PLC案例」三菱FX3U与威纶通HMI的步进定位控制,附程序图~...
  5. 可控硅型号怎样识别_可控硅型号分类
  6. 11种基于ARM的嵌入式操作系统
  7. 图解傅里叶变换(时域频域)
  8. 简单用BT3破解无线网络WEP, WPA密码
  9. 畅销书热榜html网页制作,黑色简洁形式pc+wap畅销书作者介绍网页模板代码
  10. 用javaScript制作星空特效