代码混淆简介(安卓gradle情况下用法)

把以前做安卓的东西记录一下

目录
1 反编译
1.1 软件下载地址:
1.2 使用流程:
2 代码混淆
2.1 代码混淆概念
2.2 混淆方法
2.3 混淆模版
2.4 混淆前后对比
2.5 附加说明

1 反编译
学会反编译,查看源码,才知道代码混淆是否成功.
1.1 软件下载地址:

http://www.newasp.net/soft/70498.html
软件:
1.2 使用流程:
1,打开软件ApkDec-Release-0.1, 把apk文件和反编译后的目录选好,点选jar,然后”开始反编译”

2.打开软件jd-gui. 选择之前反编译的jar文件,就能看见源码了


2 代码混淆
2.1 代码混淆概念
代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。
将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。
代码混淆器也会带来一些问题。主要的问题包括:
被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。对于支持反射的语言,代码混淆有可能与反射发生冲突。代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。(全部抄自百度百科~)

2.2 混淆方法
Android studio:
打开build.gradle文件,Android studio默认生成下列代码,以及在(根目录下)生成对应的proguard-rules.pro文件

Ps:如果找不到这些文件,那就是版本不一样,自己百度
步骤一: 把minifyEnabled设置为true,才能开启混淆开关
步骤二:默认生成的只有release 版本,调试时候运行的时候生成的是debug版本,所以需要加入下列代码:
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}

如图所示:

步骤三: 打开”“proguard-rules.pro”文件,输入混淆规则:
2.3 混淆模版
常用格式(模版)整理

指定代码的压缩级别

-optimizationpasses 5

包明不混合大小写

-dontusemixedcaseclassnames

不去忽略非公共的库类

-dontskipnonpubliclibraryclasses
#优化 不优化输入的类文件
-dontoptimize
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/,!class/merging/

保护注解

-keepattributes Annotation

忽略警告

-ignorewarning
指定哪些不混淆:

不混淆所有的公用方法

-keepclasseswithmembers class * {
public ;
}

保持 native 方法不被混淆

-keepclasseswithmembernames class * {
native ;
}

不混淆资源类

-keepclassmembers class *.R$ {
public static ;
}

不混淆filed和method,等于全都不混淆

-keepclasseswithmembers class * {
;
;
}

不混淆这个包以及里面的内容

-keep class org.* {;}
-keep class android.support.v4.* {;}

如果有引用v4包可以添加下面这行

-keep public class * extends android.support.v4.app.*

保持 Serializable 不被混淆

-keepnames class * implements java.io.Serializable

如果引用了v4或者v7包

-dontwarn android.support.**

第三方jar包

libs根目录下的默认不混淆,不需要写,不然会报重复写错误

-libraryjars libs/armeabi/libanw.10.so

2.4 混淆前后对比
混淆前,反编译的结果为源码,阅读性良好:
代码混淆简介(安卓gradle情况下用法)_第1张图片

混淆后,包名,类名,变量名,函数名都变成了无意义的字符,阅读差:
代码混淆简介(安卓gradle情况下用法)_第2张图片


2.5 附加说明
1,不能够”(全部)过度混淆”,过度混淆的后果是,虽然编译成功,但是在运行时会报错.
不能混淆的部分包括但不限于:带有反射的class,jni(native),第三方lib.
下图为过度(全部)混淆的后果,开程序就挂:
代码混淆简介(安卓gradle情况下用法)_第3张图片

混淆的太少:
代码混淆简介(安卓gradle情况下用法)_第4张图片

混淆的刚好
代码混淆简介(安卓gradle情况下用法)_第5张图片

常用格式整理:

指定代码的压缩级别

-optimizationpasses 5

包明不混合大小写

-dontusemixedcaseclassnames

不去忽略非公共的库类

-dontskipnonpubliclibraryclasses
#优化 不优化输入的类文件
-dontoptimize
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/,!class/merging/

保护注解

-keepattributes Annotation

忽略警告

-ignorewarning

不混淆:

不混淆所有的公用方法

-keepclasseswithmembers class * {
public ;
}

保持 native 方法不被混淆

-keepclasseswithmembernames class * {
native ;
}

不混淆资源类

-keepclassmembers class *.R$ {
public static ;
}

不混淆filed和method,等于全都不混淆

-keepclasseswithmembers class * {
;
;
}

不混淆这个包以及里面的内容

-keep class org.* {;}
-keep class android.support.v4.* {;}

如果有引用v4包可以添加下面这行

-keep public class * extends android.support.v4.app.*

保持 Serializable 不被混淆

-keepnames class * implements java.io.Serializable

如果引用了v4或者v7包

-dontwarn android.support.**

libs根目录下的默认不混淆,不需要写,不然会报重复写错误

-libraryjars libs/armeabi/libanw.10.so

你可能感兴趣的:(其他工具)