本文主要参考5分钟搞定android混淆
一、前言
二、上模板
1 | #-------------------------------------------定制化区域---------------------------------------------- |
三、分析
1. 实体类、自定义控件
实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的,自定义控件也是一样。将你项目中实体类都拎出来,用以下语法进行保留。
1 | -keep class 你的实体类所在的包.** { *; } |
如我的项目下类User的完整路径为:com.demo.login.bean.User, 那我的混淆如下
1 | #---------------------------------1.实体类、自定义控件----------------------- |
当然你的实体类、自定义控件肯定不止这一个,请用上边的方式一一添加,如果你的实体类、自定义控件都在一个包下,那你就幸福了。
2. 第三方包
打开你app下的build.gradle文件,查看你用了哪些第三方的包。
1 | dependencies { |
我这里用了glide,eventbus。我去他们的官网把已经写好的混淆copy下来。
1 | #---------------------------------2.第三方包------------------------------- |
一般官网都是有混淆的,没有的话就google,也没有的话自己按照上面的写法自己写,还不会的话。。。。。只能换个包。。。。。如果你是直接包含的jar包的话,你这样写
1 | #---------------------------------2.第三方包------------------------------- |
大致意思就是不混淆,不报warn。如果gradle报错的话,可以考虑注释掉-libraryjars log4j-1.2.17.jar这句。
3. 与js互相调用的类
工程中没有直接跳过,一般你可以这样写
1 | -keep class 你的类所在的包.** { *; } |
如果是内部类的话,你可以这样1
-keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; }
例如1
2
3-keepclasseswithmembers class com.demo.login.bean.ui.MainActivity$JSInterface {
<methods>;
}
4. 反射相关的类和方法
工程中没有直接跳过,类的话直接这样1
-keep class 你的类所在的包.** { *; }
四、深入了解
先逐条介绍下基本指令区指令的含义
代码混淆的压缩比例,值在0-7之间:1
-optimizationpasses 5
混淆后类名都为小写:1
-dontusemixedcaseclassnames
指定不去忽略非公共的库的类:1
-dontskipnonpubliclibraryclasses
指定不去忽略非公共的库的类的成员:1
-dontskipnonpubliclibraryclassmembers
不做预校验的操作:1
-dontpreverify
生成原类名和混淆后的类名的映射文件:1
2-verbose
-printmapping proguardMapping.txt
指定混淆是采用的算法:1
-optimizations !code/simplification/cast,!field/*,!class/merging/*
不混淆Annotation:1
-keepattributes *Annotation*,InnerClasses
不混淆泛型:1
-keepattributes Signature
抛出异常时保留代码行号:1
-keepattributes SourceFile,LineNumberTable
基本指令区基本介绍完了,说下2条用的最多的指令:
保留类名不变,也就是类名不混淆,而类中的成员名不保证。当然也可以是继承XXX类的所有类名不混淆,具体代码不贴了,重在理解。
1
-keep class XXXX
保留类名和成员名。当然也可以是类中特定方法,代码不贴了,理由同上。
1
-keepclasseswithmembers class XXXX
五、附:完整的混淆
1 | #-------------------------------------------定制化区域---------------------------------------------- |
六、后言
将app下的build.gradle中minifyEnabled设置为true打个包试试吧
1 | release { |