文章目录
一、Proguard 默认混淆结果
二、Proguard 保留类及成员混淆结果
三、Proguard 保留注解以及被注解修饰的类/成员/方法
更多 ProGuard 混淆配置参考 : https://www.guardsquare.com/en/products/proguard/manual/usage
一、Proguard 默认混淆结果
ProGuard 的默认混淆结果 , 就是没有 人为添加保留任何设置 , 使用的是 默认混淆文件 , 除了 MainActivity , 以及 MainActivity 中的 3 33 个内部类 , IdleHandler , Handler , Thread , 其余 Java 文件都被混淆 ;
二、Proguard 保留类及成员混淆结果
在 应用 Module 下的 proguard-rules.pro 中进行如下配置 :
# 保留 MainActivity 类名 -keep public class kim.hsl.handler.MainActivity
混淆结果如下 : 可以看到 MainActivity 类名被保留下来 , 成员由于没有配置 , 因此被混淆了 ;
保留 MainActivity 类名 , 成员变量名称 , 成员方法名称 ,
# 保留 MainActivity 类名,成员变量名称 -keep public class kim.hsl.handler.MainActivity{ *; }
由下图可以看出 , 成员变量 , 成员方法 的名称都保存下来了 ;
三、Proguard 保留注解以及被注解修饰的类/成员/方法
创建注解 :
package kim.hsl.handler; public @interface Keep { }
ProGuard 中配置 保留该注解 , 以及 被该注解修饰的类 ;
# 保留 Main 类及成员 -keep public class kim.hsl.handler.Main # 保留 Keep 注解 -keep public class kim.hsl.handler.Keep # 保留被 Keep 注解修饰的类 -keep @kim.hsl.handler.Keep class * {*;}
使用上述注解修饰 Handler 类 , 下面的代码中只需要关注 @Keep 注解即可 ;
package kim.hsl.handler; @Keep public class Handler { /** * 消息队列 * 该消息队列封装在 Looper 中 * Looper 封装在线程本地变量中 */ MessageQueue mQueue; public Handler(){ /* 在 Handler 中需要拿到 Looper 进而拿到 Looper 中的 MessageQueue 消息队列 Handler 的操作就是将 Message 放入 MessageQueue 因此在 Handler 中需要持有 MessageQueue 消息队列的引用 获取 Looper 时 , Looper 必须已经初始化完毕, 也就是已经调用过 prepare 创建了 Looper 并将其放入了线程本地变量 */ // 获取当前线程中的 线程本地变量 Looper Looper looper = Looper.looper(); // 获取封装在 Looper 中的 消息队列 MessageQueue mQueue = looper.mQueue; } /** * 发送消息 * @param msg */ public void sendMessage(Message msg){ // 为消息设置发送的 Handler msg.target = this; // 向消息队列中放入要执行的消息 mQueue.enqueueMessage(msg); } /** * 执行消息对应的任务 * @param next */ public void handleMessage(Message next) { } }
编译混淆结果 : Handler 的类 和 成员没有被混淆 ;
因此可以使用注解形式 , 灵活配置某个类 / 方法 / 成员 不被混淆 ;