App 混淆

Android Guide:http://developer.android.com/tools/help/proguard.html


APP混淆是通过在语义上去除无用的类、变量和方法,修改它们的名字来提高APP的反编译难度。


APP混淆器已集成在Android SDK中,使用时只需要使用下列代码打开它:


android {
  ...

   buildTypes {
       release {
           minifyEnabled true
           proguardFiles getDefaultProguardFile('proguard-android.txt'),
           'proguard-rules.pro' //这个是混淆规则文件
       }
   }
 }


proguard-rules.pro是我们自己定义的混淆规则文件,有一些类、变量、方法是不能被混淆的,比如使用反射机制的类,名字被修改后将不能正确反射


混淆规则文档:

https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs/index.html#manual/introduction.html


混淆步骤:

  1. shrink: 去掉无用代码

  2. optimize:优化代码(静态化,内联,无用参数去除等。。)

  3. obfuscate:混淆,给类、变量、方法改名字

  4. preverify:预效验

混淆规则说明:


class_specification

[@annotationtype] [[!]public|final|abstract|@ ...] [!]interface|class|enum classname
   [extends|implements [@annotationtype] classname]
[{
   [@annotationtype] [[!]public|private|protected|static|volatile|transient ...] <fields> |
                                                                     (fieldtype fieldname);
   [@annotationtype] [[!]public|private|protected|static|synchronized|native|abstract|strictfp ...] <methods> |
                                                                                          <init>(argumenttype,...) |
                                                                                          classname(argumenttype,...) |
                                                                                          (returntype methodname(argumenttype,...));
   [@annotationtype] [[!]public|private|protected|static ... ] *;
   ...
}]

1.类的关键字:interface,class,enum,用来描述模块的类型

2.classname: 类名,全称,例如:com.heyy.test.MainActivity,可以使用通配符:


匹配类名中的任意单个字符 (com.heyy.X? 可以匹配com.heyy.XX)

*

匹配类名中的任意字符串,不包含包分隔符(com.*.X 可以匹配com.heyy.X)

**

匹配类名中的任意字符串 (**.XX 可以匹配com.heyy.XX)

3.extends|implements: 指定继承和实现类或接口

4.@annotationtype:指定类或成员被注释的类型

5.类成员和真实的类一样,但是不带名字,也可以使用下面这些类型:


<init>

匹配任意构造函数

<fields>

匹配任意成员变量

<methods>

匹配任意成员方法

*

匹配任意成员

也可以使用?和*两种通配符

6.type:类型,可以使用如下通配符:


%

匹配一个任意主要类型,除了void

匹配一个类型中的任意单个字符

*

匹配一个类型中任意多个字符,不包括包分隔符

**

匹配一个类型中任意多个字符

***

匹配一个任意类型

...

匹配任意个任意类型


7.内部类:

XXX$YY 表示XXX中的类部类YY

-keep [,modifier,...] class_specification

modifier

   allowshrinking:允许shrink步骤

   allowoptimization:允许optimize步骤

   allowobfuscation:允许obfuscate步骤

-keepclassmembers [,modifier,...] class_specification

指定要保留的类成员

-keepclasseswithmembers [,modifier,...] class_specification

指定要保留的类和类成员

-keepnames class_specification

相当于-keep,allowshrinking class_specification

-keepclassmembernames class_specification

相当于-keepclassmembers,allowshrinking class_specification

-keepclasseswithmembernames class_specification

相当于-keepclasseswithmembers,allowshrinking class_specification

-optimizationpasses n

优化级别

-dontoptimize

不使用优化

-optimizations optimization_filter

优化过滤器

更多规则请参考文档。


注意: 在android-studio中,包名一定要小写,不然会被跳过,即使在规则中设置了混淆也不会被混淆。

不能被混淆的代码:


  1. 被系统或其他库调用的,如果混淆系统或库会找不到

  2. android资源文件中的定义

  3. Android Parcelable

  4. android.app.backup.BackupAgentHelper
    android.preference.Preference
    com.android.vending.licensing.ILicensingService

  5. java序列化的东西

  6. 枚举

  7. annotations 注释

  8. 本地方法

  9. 数据库驱动

  10. 用到反射的地方

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值