Android面试系列文章2018之实战经验部分之proguard混淆篇

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ClAndEllen/article/details/79369761

Android面试系列文章2018之实战经验部分之proguard混淆篇

1.proguard是什么?

  proguard工具是用于压缩,优化,混淆我们的代码,主作用是可以移除代码中的无用类,字段,方法和属性,同时可以进行代码混淆。

  为什么需要进行混淆呢?

  代码混淆,是将计算机程序的代码转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。

  代码混淆的主要目的是为了保护源代码,阻止反向工程。反向工程会带来许多问题,诸如知识产权泄露,程序弱点暴露易受攻击等。使用即时编译技术的语言,如Java、C#所编写的程序更容易受到反向工程的威胁。

  代码混淆的主要的方法有:
  将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。
重写代码中的部分逻辑,将其变成功能上等价但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。
  打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。

  代码混淆器也会带来一些问题。主要的问题包括:
  被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。
  对于支持反射的语言,代码混淆有可能与反射发生冲突。
  代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。

2.proguard技术功能

a.压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。

b.优化(Optimize):对字节码进行优化,移除无用的指令。

c.混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。

d.预检测(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

3.proguard工作原理

  ProGuard由shrink、optimize、obfuscate和preveirfy四个步骤组成,每个步骤都是可选的,我们可以通过配置脚本来决定执行其中的哪几个步骤。

这里写图片描述

  混淆就是移除没有用到的代码,然后对代码里面的类、变量、方法重命名为人可读性很差的简短名字。
  那么有一个问题,ProGuard怎么知道这个代码没有被用到呢?
  这里引入一个Entry Point(入口点)概念,Entry Point是在ProGuard过程中不会被处理的类或方法。在压缩的步骤中,ProGuard会从上述的Entry Point开始递归遍历,搜索哪些类和类的成员在使用,对于没有被使用的类和类的成员,就会在压缩段丢弃,在接下来的优化过程中,那些非Entry Point的类、方法都会被设置为private、static或final,不使用的参数会被移除,此外,有些方法会被标记为内联的,在混淆的步骤中,ProGuard会对非Entry Point的类和方法进行重命名。
那么这个入口点怎么来呢?就是从ProGuard的配置文件来,只要这个配置了,那么就不会被移除。

详细了解请看以下链接:

https://www.cnblogs.com/cr330326/p/5534915.html

4.Android Studio如何进行代码混淆?

猜你喜欢

转载自blog.csdn.net/ClAndEllen/article/details/79369761
今日推荐