Proguard 部分类不混淆的技巧

最近比较忙,博客和 codeKK 都两个月没怎么更新了。赶在月末分享个小技巧。

一、场景

两年前在 Proguard 语法及常用 proguard.cfg 代码 中介绍过一些 Proguard 的基础知识,其中提到一些类不能混淆,比如实现了 Serializable 接口的,否则反序列化时会出错。这种情况我们可以简单的通过在 proguard-rules.pro 配置文件中添加配置,对于较早 Android 项目默认配置文件可能为 proguard.cfg,如下:

Java
1
2
3
4
5
6
7
8
9
10

-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

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

packagecn.trinea.android.common.annotation;
importjava.lang.annotation.ElementType;
importjava.lang.annotation.Retention;
importjava.lang.annotation.RetentionPolicy;
importjava.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@interfaceNotProguard{
}

NotProguard 是个编译时注解,不会对运行时性能有任何影响。可修饰类、方法、构造函数、属性。
关于注解更多的知识可见:Java Annotation 介绍及几个常用开源项目注解原理简析

2. 在 Proguard 配置文件中过滤被这个注解修饰的元素

Java
1
2
3
4
5
6

# Keep annotated by NotProguard
-keep @cn.trinea.android.lib.annotation.NotProguard class * {*;}
-keep,allowobfuscation @interface cn.trinea.android.lib.annotation.NotProguard
-keepclassmembers class * {
    @cn.trinea.android.lib.annotation.NotProguard *;
}

表示不混淆被 NotProguard 修饰的类、属性和方法。

3. 使用

(1) 整个类不混淆

Java
1
2

@NotProguard
publicclassUser{}

(2) 单个属性不混淆

Java
1
2

@NotProguard
public int id;

(3) 单个方法不混淆

Java
1
2
3
4

@NotProguard
publicbooleanisValid(){
    …
}

这样我们便解决了每个类都需要在 proguard 配置文件中配置的问题。

三、关于混淆

混淆一般在 Release 模式生效,主要有三个作用:
(1) 压缩、优化、删除代码;
(2) 一定程度上提高反编译后被读懂的难度;
(3) 通过删除代码功能实现的特殊作用。
比如在 Proguard 语法及常用 proguard.cfg 代码 中介绍的利用 Progurad 使得线上版本不打印 Log.d 和 Log.v 的技巧,防止调试的敏感信息被泄露。

一些应用的代码可能从来都没混淆过,虽说这些代码实际价值可能不大,本身可能也是开源代码凑起来的,再者该破解的还是能破解,但本着做事要专业的态度,还是混淆吧。

关于 Proguard 基础可参考:
Proguard 语法及常用 proguard.cfg 代码
ProGuard 的作用、使用及 Bug 分析

四、杂谈

感谢不少朋友的关心,九月份博客会恢复正常更新。虽然很忙,还是抽空完善了 codeKK。
透露下下周 codeKK 会发布一个大功能模块,对,跟源码解析、职位内推并列的顶级模块,相信会对大家有用,希望大家到时多支持。

Proguard 部分类不混淆的技巧相关推荐

  1. 使用最新jarjar修改包名,且保留部分类或者包名不做更改

    需求 对第三方sdk的jar包包名进行修改,比如将jar包的前缀包名是com.x,需要将其前缀包名改成com.y 实现工具 经过搜索,发现能完成上述要求的工具是jarjar,但是大部分文章引用的jar ...

  2. Partial Class部分类

    Partial Class ,部分类 或者分布类.顾名思义,就是将一个类分成多个部分.比如说:一个类中有3个方法,在VS 2005将该类中3个方法分别存放在3个不同的.cs文件中. 这样做的好处: 1 ...

  3. 混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集

    混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集 目录

  4. java 部分类_为什么微软部分类和Java不?

    微软成功的秘密(不再是秘密了)是GUI(图形用户界面). 如果你是像我这样的老家伙,你会记得直到80年代的操作系统都是基于DOS的,有那些黑色的窗口和残忍的命令,如dir, edit, mkdir,等 ...

  5. WinForm中Partial部分类的使用

    文章目录 1 WinForm中Partial部分类的使用 1.1 WinForm中Partial部分类的简要介绍 1 WinForm中Partial部分类的使用 1.1 WinForm中Partial ...

  6. Intellij IDEA设置忽略部分类编译错误

    有些时候我们的项目中有些错误,但这些错误并不影响项目的整体运行(或许是没有使用到),默认情况下idea是无法通过编译的,因此也就无法部署运行,要达到正确运行项目的目的需要作一些设置才行. 设置Inte ...

  7. 多目标分类的混淆矩阵_用于目标检测的混淆矩阵

    多目标分类的混淆矩阵 After training a machine learning classifier, the next step is to evaluate its performanc ...

  8. C# partial 部分类使用简单举例说明

    partial 关键字允许把类.结构.方法或者接口放在多个文件中.一般情况下,某种类型的代码生成器生成了一个类的某部分,所以把这类放在多个文件中是有益的.假定要给类添加一些从工具中自动生成的内容.如果 ...

  9. C#编程(十九)----------部分类

    部分类 C#中使用关键字partial把类,结构或结构放在多个文件中.一般情况下,一个类全部驻留在单个文件中.但有时候,多个开发人员需要访问同一个类,或者某种类型的代码生成器生成了一个类的某部分,所以 ...

最新文章

  1. (个人)Zookeeper集群环境部署
  2. 使用yml多环境配置
  3. 如何利用数据分析找到女朋友?
  4. ASP.NET MVC动态二级域名及DNS(泛解析配置)
  5. tomcat发布web项目
  6. 零基础的人也能学好C++
  7. Man vs. AI – Six Fields Where Artificial Intelligence Are Surpassing Human Intelligence
  8. NekoHtml 解析内容时需要注意的地方
  9. Faster RCNN 结构总结
  10. 计算机的硬件软件组成
  11. 在html5水平边距属性hspace,响应式网页设计(html5+css3+cms)教学课件作者李文奎第2章html基础.pptx...
  12. 计算机键盘英语,电脑键盘打字时中英文如何切换?
  13. linux 设备类型misc,linux驱动开发之misc类设备介绍
  14. java 过滤bom头_去除bom头.java
  15. Python机器学习-搭建神经网络以及数据集引入和断点续存
  16. 不定宽高,实现盒子左右垂直居中
  17. android仿QQ优雅的修改App字体大小
  18. KSO-.NETCore中配置swagger分级
  19. CSharp(C#)语言_第六章(表达式和运算符)
  20. 苹果应用分身_你喜欢用苹果手机拍照!不学会这4个功能,怪不得拍不出好照片...

热门文章

  1. 专题5 低级文件编程
  2. linux查看ssh端口8222,下载服务器SSH被用户恶意猜密码了
  3. 数组中的逆序对,为什么要在第一个小于等于的时候计数?
  4. 计算机软件评测减增值税,软件产品即征即退政策依据之一
  5. mysql-5.2 lib_Centos 5.2下安装多个mysql数据库配置详解
  6. 负数分解质因数java_Java经典案例之-“分解质因数”
  7. oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...
  8. linux mysql 健康检查_Linux下检查MySQL的Slave是否正常
  9. String 方法中 replace 和 replaceAll 的区别详解(源码分析)
  10. 微信上线新功能:再也不怕好友赖账了