Android代码混淆踩过的那些坑

Java是一种跨平台的解释型语言,其源代码编译成中间“字节码”存储于class文件中。由于跨平台的需要,Java字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,而这些符号带有许多语义信息,很容易被反编译成Java源代码。为了防止这种现象,我们需要对Java字节码进行混淆。
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。
基本上在android studio里混淆代码很简单,只要把build.gradle中minifyEnabled的值改成true就可以了。但还是免不了跳进坑里。

release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

1.四大组件与application是默认不会被混淆的
也许是由于四大组件与application都需要在AndroidManifest.xml中注册,所以不能被混淆,包括其重写的方法。还有某些情况下v4包和v7包也是不能混淆的。由于这些核心组件混淆了之后程序就没有办法运行了,所以即使默认不被混淆,还是自己在proguard-rules.pro文件中单独写出来更让人放心。
2.某些第三方的功能代码是不能被混淆的
由于现在大部分的客户端都有分享功能,而分享功能就势必要用到“别人写的代码”,对于其中的核心代码片段是不能混淆的,否则同样会找不到类名或方法名报错。理论上使用第三方的东西都会提供相应的proguard-rules,一定要记得看,最好再加一份通用的proguard-rules是最保险的。
3.警告与unknown resources
在某些情况下,即使做了上述两步混淆也是有可能不成功的,这个时候就需要一行代码一行代码的扒了,也确实没有办法。如果是打包失败,问题是某一类有警告,就加上-dontwarn 包名+类名.**这句,把warning取消掉。如果是调试时没有问题而打包之后出了问题,一般都会提示unknown resources,这时就需要-keep class 包名+类名{*;}或者包名.**{*;},把你不想混淆的类或方法保留。

你可能感兴趣的:(Android)