Android开发之——Android 代码混淆(1)
一 概述
在开始之前我们先看几个概念:
- 混淆
- ProGuard
二 混淆
2.1 概念:
混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。
混淆的特点:
- 被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样;
- 只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号;
- 在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。
- 混淆是不可逆的;
- 在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。
2.2 不混淆的危害
发布出去的商用APP一般都是经过混淆的,如果不混淆发布出去,已经反编译就可以查看到我们的源码信息,给APP的安全性带来隐患甚至难以估量的损失;这里的混淆就是Proguard技术;
2.3 混淆的作用
混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。
三 ProGuard
3.1 什么是ProGuard
ProGuard工具是用于压缩,优化,混淆,预检我们的代码,作用是可以移除代码中的无用类,字段,方法和属性使得打包后APP的体积缩小;同时可以对其进行混淆命名,降低代码的易读性,保障APP的安全性;
3.2 ProGuard技术的功能
- 压缩(Shink)
用于检测和删除没有使用到的类,字段,方法和熟悉性; - 优化(Optimeze)
对字节码进行优化,并且移除无用指令 - 混淆(Obfuscate)
使用a,b,c等无意义的名称,对类,字段和方法进行重命名。 - 预检测(Preveirfy)
主要是在java平台上对处理后的代码进行预检测。
3.3 ProGuard的原理
为了解ProGuard的工作原理,引入EntryPoint的概念
EntryPoint(入口点): 一种标志,在Proguard中不会被处理的类,属性和方法
过程分析:
- 在ProGuard进行压缩的过程中,从EntryPoint中搜索那些类和它的成员在使用
- 如果搜索到在使用的则被标记为EntryPoint的类和方法,一般是那些配置混淆时不希望被混淆的类和方法
- 对有些是没有使用的的类和成员,会在压缩阶段被ProGuard所丢弃,这样在进一步优化过程中,那些不是EntryPoint的会被设置为private,下一步将会被移除
- 最后Proguard会对那些非EntryPoint的类进行重命名,以保证与检测阶段代码的稳定性;