Android代码混淆以及如何判断一个apk代码是否被混淆。

1,程序保护原理

Java代码被编译成二进制类文件,该文件也可以被反编译成源代码。除了注释,其他代码基本都能看到。为了防止重要代码泄露,我们经常需要混淆,即改变方法名、变量名、类名、包名等java元素的名称。到意想不到的名字,使代码结构保持不变,可以运行,但很难理解代码架构。Proguard扮演了这样一个角色:

首先,它可以分析一组类的结构,然后根据用户的配置,将这些类文件中可以混淆的java元素混淆。

第二,删除无效代码

第三,优化代码(使用adt插件导出的apk和zipalign优化)

默认情况下,proguard会混淆所有代码,但在以下情况下,不能更改java元素的名称,否则会导致程序错误。

第一,使用反射的地方(android中的api经常被@hide注释掉,开发者在调用相应的方法时需要使用反射)

第二,当app的代码依赖于系统的接口时,比如系统代码调用的回调方法,这种方法就比较复杂。

第三,在配置文件中配置java元素名称。

所以在使用proguard的时候,我们需要有一个配置文件来告诉proguard哪些java元素不能混淆。

2.proguard配置

-dontwarn默认proguard会检查每个引用是否正确,但是第三方库中往往有一些类不会用到,引用不正确。如果没有配置,系统将报告错误。

由-keep指定的类和类成员作为条目保留。

由-keepclassmembers指定的类成员是保留的。

如果指定的类成员存在,则保留由-keepclasswithmembers指定的类和类成员。