更多 ProGuard 混淆配置参考 : https://www.guardsquare.com/en/products/proguard/manual/usage
ProGuard 的默认混淆结果 , 就是没有 人为添加保留任何设置 , 使用的是 默认混淆文件 , 除了 MainActivity , 以及 MainActivity 中的
个内部类 , IdleHandler , Handler , Thread , 其余 Java 文件都被混淆 ;
在 应用 Module 下的 proguard-rules.pro 中进行如下配置 :
# 保留 MainActivity 类名
-keep public class kim.hsl.handler.MainActivity
混淆结果如下 : 可以看到 MainActivity 类名被保留下来 , 成员由于没有配置 , 因此被混淆了 ;
保留 MainActivity 类名 , 成员变量名称 , 成员方法名称 ,
# 保留 MainActivity 类名,成员变量名称
-keep public class kim.hsl.handler.MainActivity{
*;
}
由下图可以看出 , 成员变量 , 成员方法 的名称都保存下来了 ;
创建注解 :
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 的类 和 成员没有被混淆 ;
因此可以使用注解形式 , 灵活配置某个类 / 方法 / 成员 不被混淆 ;