Proguard 部分类不混淆的技巧
来源:互联网 发布:abb机器人编程入门书 编辑:程序博客网 时间:2024/04/30 01:39
两年前在 Proguard 语法及常用 proguard.cfg 代码 中介绍过一些 Proguard 的基础知识,其中提到一些类不能混淆,比如实现了 Serializable 接口的,否则反序列化时会出错。这种情况我们可以简单的通过在 proguard-rules.pro 配置文件中添加配置,对于较早 Android 项目默认配置文件可能为 proguard.cfg,如下:
-keepnames class * implements java.io.Serializable-keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; !static !transient <fields>; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve();}
表示所有实现了 Serializable 接口的类及其成员都不进行混淆。
但有时我们可能需要防止一些没有明显共同特征的类被混淆,比如个别控制层类需要反射、个别实体类需要 JSON 化存本地,这时我们怎么做呢,一个个添加到 proguard-rules.pro(或 proguard.cfg) 中吗?
这样会导致 proguard 配置文件变得杂乱无章,同时需要团队所有成员对其语法有所了解。
这里分享个小技巧,通过给这些类、属性、函数添加共同标识,然后统一过滤。
二、解决方法
1. 新建表示统一标识的注解 NotProguard
package cn.trinea.android.common.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * NotProguard, Means not proguard something, like class, method, field<br/> * * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2015-08-07 */@Retention(RetentionPolicy.CLASS)@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})public @interface NotProguard {}
NotProguard 是个编译时注解,不会对运行时性能有任何影响。可修饰类、方法、构造函数、属性。
2. 在 Proguard 配置文件中过滤被这个注解修饰的元素
# keep annotated by NotProguard-keep @cn.trinea.android.common.annotation.NotProguard class * {*;}-keep class * { @cn.trinea.android.common.annotation.NotProguard <fields>;}-keepclassmembers class * { @cn.trinea.android.common.annotation.NotProguard <methods>;}表示不混淆被 NotProguard 修饰的类、属性和方法。
3. 使用
(1) 整个类不混淆
(2) 单个属性不混淆
(3) 单个方法不混淆
这样我们便解决了每个类都需要在 proguard 配置文件中配置的问题。
三、关于混淆
混淆一般在 Release 模式生效,主要有三个作用:
(1) 压缩、优化、删除代码;
(2) 一定程度上提高反编译后被读懂的难度;
(3) 通过删除代码功能实现的特殊作用。
比如在 Proguard 语法及常用 proguard.cfg 代码 中介绍的利用 Progurad 使得线上版本不打印 Log.d 和 Log.v 的技巧,防止调试的敏感信息被泄露。
一些应用的代码可能从来都没混淆过,虽说这些代码实际价值可能不大,本身可能也是开源代码凑起来的,再者该破解的还是能破解,但本着做事要专业的态度,还是混淆吧。
附上大神.trinea 的博客地址: http://www.trinea.cn/android/android-proguard-tip-not-proguard/
- Proguard 部分类不混淆的技巧
- Proguard 部分类不混淆的技巧
- Proguard 部分类不混淆的技巧
- proguard 不混淆内部类的方法
- proguard 不混淆内部类的方法
- proguard 不混淆内部类的方法
- 混淆的proguard.cfg
- android的Proguard混淆
- 混淆工具 proguard 的安装
- 混淆利器proguard的用法
- ProGuard混淆存在的问题
- proguard混淆的简单总结
- proguard混淆编译的问题
- proguard混淆编译的问题
- ProGuard工具的混淆功能
- 关于混淆proguard的配置
- apk文件的混淆proguard
- 【android】admob的广告,经过proguard混淆之后,不显示的问题
- Intellij Idea 创建JavaWeb项目
- 基本文件的I/O --压缩文件
- CentOS6.5 + LAMP + Yaf +Svn
- SQL 一条SQL语句 统计 各班总人数,男女各总人数 ,各自 男女 比例
- Python daemonize
- Proguard 部分类不混淆的技巧
- 黑马程序员——Java之常用API
- eclipse界面语言切换
- 深入JVM系列(二)之GC机制、收集器与GC调优
- Deleting JPA Entity Objects
- 数字视频广播字幕系统(第6.7章)
- 阅读检测小程序
- 关于unity中的update、Lateupdate和FixedUpdate。
- 【OpenCV学习笔记】一.操作像素