您的位置:首页 > 移动开发 > Android开发

Android代码混淆踩过的那些坑

2016-05-29 16:27 399 查看
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 包名+类名{*;}或者包名.**{*;}
,把你不想混淆的类或方法保留。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息