ProGuard进行混淆代码原理初探

ProGuard充当Java类文件的缩小,优化,混淆,先行检验的角色。

ProGuard执行guo'cheng

总体原理描述

<1>缩小步骤找出并移除无用类,字段,方法和属性。优化过程分析和优化方法的字节码。
<2>混淆过程用短而无意义的名字重命名余下的类,字段,和方法。
<3>第一个的步骤使代码变得更加小且效率和更难进行逆行工程。最后一个先行检验的步骤添加先行检验信息到类,这个类是java微型版要求并且能提高Java6的启动速度。

注意:

每一个步骤都是可选的。例如,ProGuard也能够仅仅被用来列出应用程序dead code,或者先行检验类文件在Java6高效果运行。
ProGuard通常读取输入Jars(或者wars,ears,zips,或者目录树),然后收缩,优化,混淆和先行检验它们。具有选择性的是,它可以执行多个优化通道,每一个通常遵循另一个收缩步骤。ProGuard把处理结果写到到一个或多个输出jars(或者wars,ears,zips,或者目录树)。输入可能包含资源文件,其名称和内容可选择的被更新以映射到混淆的类名称。
ProGuard要求 library jars(或者wars,ears,zips,或者目录树)指定输入Jars。这些本质上是你将需要编译代码时的libraries。ProGuard用他们去重建那些需要适当处理的类的依赖关系。Library jars本身是保持不变的,你仍然应该把它们放到你的最终应用程序的类路径。
本《使用手册》describes keep 选项的必要性和实例部分提供了很多例子。

Entry points(切入点)


为了确保哪些代码被保存,哪些被废弃或混淆,你必须为你的代码指定一个或多个切入点。
以下切入点通常与类的主方法,applet和midlets相关
1.在收缩步骤,ProGuard从那些种子和递归确定所使用的类和类成员开始。所有其它类和类成员都会被丢弃。
2.在优化步骤,ProGuarad进一步优化代码。在其他的优化中,没有切入点的类和方法可以是private,static or final,且无用的参数可以被移除和一些方法可能是inline的。
3.在混淆步骤,ProGuard重命名没有切入点的类和类成员。在整个过程中,保持切入点确保它们冉冉可以访问它们原来的名字。
4.在先行检验步骤,是不知道入口点的唯一步骤。

Reflection(反射)

反射和introspection为任何自动执行的代码提出了特殊的问题。在ProGuard中,你代码中的类和类成员被创建或者动态调用(即是通过名字),不得不指定为一个切入点。
例如,Class.forName()构造器可能在运行时涉及到任何类。通常不可能预见哪些类必须保留(用它们的原始名称&#

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值