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指定的类和类成员。