参考:
https://blog.youkuaiyun.com/zhangdaiscott/article/details/45368261
https://blog.youkuaiyun.com/shensky711/article/details/52770993?utm_source=blogxgwz2
https://www.cnblogs.com/cr330326/p/5534915.html
https://www.cnblogs.com/xuxiuxiu/p/7151995.html
图形工具基本操作说明
下载安装
-
安装:
解压proguard,执行 bin目录下的proguardgui.bat,然后会弹出图形化界面;
基本操作
-
添加待混淆jar包
点击左侧input/output,出现右侧界面,Add imput添加待混淆的jar包的路径,Add output混淆后结果的路径;下面的Add将项目依赖的jar包导入,包括project里的libraries所有Library的jar包(jre、maven等);
-
压缩
点击Shrinking,进行压缩设置:
-
混淆
点击Obfuscation,进行混淆设置:
-
优化
点击Optimization进行设置
-
版本信息
点击Information,设置jdk版本
-
执行混淆
①点击Process,②保存配置信息,也可以去本地文件中使用代码命令修改配置文件,③预览配置信息④执行
执行成功后结果如图:
- 优化脚本
在第6步保存的配置文件就是所有设定的命令文件,所有上面的操作可以都不选,然后在配置文件中写命令;如果我们有写好的配置文件,可以直接点击页面的ProGuard,在点击下面的导入,然后重复第6步点击执行;优化调试脚本经常做这两步操作;
常用脚本命令
- 导入
-injars
- 导出
-outjars
- 外部jar包
-libraryjars
- 警告和描述
所有警告和描述不出现
-dontnote
-dontwarn
也可以指定具体的哪些不出现
-dontnote java.*
- 不区分大小写
-dontusemixedcaseclassnames
- 不混淆包名
-keeppackagenames
- jdk版本
-target 1.8
- 保留有main方法的类名和main方法
-keepclasseswithmembers public class com.test.TestClass {
public static void main(java.lang.String[]);
}
- 保留外部引用的jar包
-keep class java.** {
<fields>;
<methods>;
}
-keep class org.** {
<fields>;
<methods>;
}
将一些常用的jar包不混淆,可以按这种格式追加;也可以用下面的格式,会自动转为上面格式的
-keep class org.** { *; }
- 自定义类的保留
自定义的类也可以按上面格式写,表示类、方法、属性都不混淆,下面我们也可以选择性不混淆
-keep class com.test.TestClass {
public void test();
private static final java.lang.String name;
}
类名、test方法和name属性不混淆;
如果keep变成keepclassmembers 则类名混淆,成员不混淆;
常见问题解决
-
Note: can’t find dynamically referenced class …
问题:缺少jar包;
解决:添加该jar包不混淆
例:-keep class org.** { *; } -
Note: … calls ‘(…)Class.forName(variable).newInstance()’
Note: … accesses a field/method ‘…’ dynamically
Note: … calls ‘Class.get…’, ‘Field.get…’, or ‘Method.get…’
问题:反射类名、方法、属性找不到
注解的原理也是反射,不混淆注解keepattributes Annotation
解决:反射类不能混淆,不混淆注解
例:-keep class org.** { *; }
keepattributes Annotation -
Note: duplicate definition of program/library class
问题:重复定义了jar,比如有多个版本的一类jar包共存;
解决:首先不能混淆该jar包,如果还显示note,可以使用-dontnote 这个jar
例:-keep class org.** { *; }
-dontnote org.** -
更多问题解决详见官方文档:https://www.guardsquare.com/en/products/proguard/manual/troubleshooting#dynamicalclassmember