PGzxc的博客

纸上得来终觉浅 绝知此事要躬行

0%

Android开发之——Android 代码混淆(1)

前言

在开始之前我们先看几个概念:

混淆

概念:
混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。
混淆的特点:

  • 被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样;
  • 只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号;
  • 在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。
  • 混淆是不可逆的;
  • 在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

不混淆的危害

发布出去的商用APP一般都是经过混淆的,如果不混淆发布出去,已经反编译就可以查看到我们的源码信息,给APP的安全性带来隐患甚至难以估量的损失;这里的混淆就是Proguard技术;

混淆的作用

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

什么是ProGuard

ProGuard工具是用于压缩,优化,混淆,预检我们的代码,作用是可以移除代码中的无用类,字段,方法和属性使得打包后APP的体积缩小;同时可以对其进行混淆命名,降低代码的易读性,保障APP的安全性;

ProGuard技术的功能

  • 压缩(Shink)
    用于检测和删除没有使用到的类,字段,方法和熟悉性;
  • 优化(Optimeze)
    对字节码进行优化,并且移除无用指令
  • 混淆(Obfuscate)
    使用a,b,c等无意义的名称,对类,字段和方法进行重命名。
  • 预检测(Preveirfy)
    主要是在java平台上对处理后的代码进行预检测。

ProGuard的原理

为了解ProGuard的工作原理,引入EntryPoint的概念
EntryPoint(入口点): 一种标志,在Proguard中不会被处理的类,属性和方法;
过程分析:

  1. 在ProGuard进行压缩的过程中,从EntryPoint中搜索那些类和它的成员在使用
  2. 如果搜索到在使用的则被标记为EntryPoint的类和方法,一般是那些配置混淆时不希望被混淆的类和方法
  3. 对有些是没有使用的的类和成员,会在压缩阶段被ProGuard所丢弃,这样在进一步优化过程中,那些不是EntryPoint的会被设置为private,下一步将会被移除
  4. 最后Proguard会对那些非EntryPoint的类进行重命名,以保证与检测阶段代码的稳定性;