代码混淆
概念
proguard工具用于压缩,优化,混淆代码。主要作用是移除代码中的无用类,字段,方法和属性,同时可以进行代码混淆
原因
保护源代码,阻止反向工程。
反向工程会带来许多问题,诸如知识产权泄露,程序弱点暴露易受攻击等。使用即时编译技术的语言,如Java、C#所编写的程序更容易受到反向工程的威胁。
方法
将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字
打乱代码的格式。如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等
问题
被混淆的代码难于理解,调试困难
对于支持反射的语言,代码混淆有可能与反射发生冲突
代码混淆并不能真正阻止反向工程,只能增大其难度
技术功能
压缩(Shrink)
检测并移除代码中无用的类、字段、方法和特性(Attribute)
优化(Optimize)
对字节码进行优化,移除无用的指令
混淆(Obfuscate)
使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名
预检测(Preveirfy)
在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的
工作原理
混淆规则
https://juejin.im/entry/58f6d2a10ce463006bc9e6af
问题
怎么判断代码是否被使用
Entry Point(入口点):在ProGuard过程中不会被处理的类或方法,在ProGuard.properties文件中配置
压缩时,ProGuard会从上述的Entry Point开始递归遍历,对未使用的类和类变量进行压缩或丢弃
非Entry Point的类、方法都会被设置为private、static或final,不使用的参数会被移除
有些方法会被标记为内联的,在混淆的步骤中,ProGuard会对非Entry Point的类和方法进行重命名