Android如何进行混淆

android开发为什么要进相混淆?

Android开发使用Java作为开发语言,Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,它还能对字节码进行缩减体积、优化。

1、如何进行混淆?

(1)使用Android Studio正式打包时默认是不开启代码混淆的,如果需要开启代码混淆,首先需要在 app 模块下的build.gradle 文件中修改 minifyEnabled false 为 true。代码结构如下:

 buildTypes {
    debug {
        buildConfigField "boolean", "LOG_DEBUG", "true"
        minifyEnabled false   
        zipAlignEnabled false  
        shrinkResources false  
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //默认的混淆文件以及我们指定的混淆文件
    }
    release {
        buildConfigField "boolean", "LOG_DEBUG", "false"              //不显示log
        minifyEnabled true   //开启混淆
        zipAlignEnabled true  //压缩优化
        shrinkResources true  //移出无用资源
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //默认的混淆文件以及我们指定的混淆文件
    }    
因为开启混淆会使编译时间变长,所以debug模式下不开启

(2)然后在app模块下的proguard-rules.pro 文件来定义项目打包的混淆选项。

混淆配置规则

  1. 对于Android APP来说四大组件和Application不能混淆
  2. 避免混淆JSON类的构造函数,因为json转换用到了java反射
  3. 注解不能混淆,因为注解也用到了java反射
  4. 泛型不能混淆
  5. 避免混淆自定义控件类的get/set方法和构造函数
  6. java内部类的混淆需要注意,如果会被外部调用到,那么也不能混淆
  7. 不混淆任何包含native方法的,否则找不到本地方法。
  8. 避免混淆js相关的接口
  9. 避免混淆枚举类
  10. 避免混淆序列化类
  11. 避免混淆第三方SDK
  12. 避免混淆第三方框架
  13. 避免混淆属性动画兼容库
  14. 避免混淆Rxjava/RxAndroid
  15. 避免混淆实体类

混淆配置语法

 -libraryjars class_path                    //应用的依赖包,如android-support-v4  
 -keep [,modifier,...] class_specification //不混淆某些类  
 -keepclassmembers [,modifier,...] class_specification //不混淆类的成员  
 -keepclasseswithmembers [,modifier,...] class_specification                    //不混淆类及其成员  
 -keepnames class_specification         //不混淆类及其成员名  
 -keepclassmembernames class_specification //不混淆类的成员名  
 -keepclasseswithmembernames class_specification //不混淆类及其成员名  
 -assumenosideeffects class_specification //假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println和Log.v等等  
 -dontwarn [class_filter]               //不提示warnning 

Android app代码混淆配置的基础配置

 -optimizationpasses 5          # 指定代码的压缩级别
 -dontusemixedcaseclassnames   # 是否使用大小写混合
 -dontpreverify           # 混淆时是否做预校验
 -verbose                # 混淆时是否记录日志

 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法

 -keep public class * extends android.app.Activity      # 保持哪些类不被混淆
 -keep public class * extends android.app.Application   # 保持哪些类不被混淆
 -keep public class * extends android.app.Service       # 保持哪些类不被混淆
 -keep public class * extends android.content.BroadcastReceiver  # 保持哪些类不被混淆
 -keep public class * extends android.content.ContentProvider    # 保持哪些类不被混淆
 -keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆
 -keep public class * extends android.preference.Preference        # 保持哪些类不被混淆
 -keep public class * extends android.support.v4.**
 -keep public class com.android.vending.licensing.ILicensingService
 -keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    native <methods>;
 }
 -keepclasseswithmembers class * {   # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
 }
 -keepclasseswithmembers class * {# 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);
 }
 -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
    public void *(android.view.View);
 }
 -keepclassmembers enum * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
 }
 -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
 }
 # 过滤注解
 -keepattributes *Annotation*
 -keep class * extends java.lang.annotation.Annotation { *; }
 -keep interface * extends java.lang.annotation.Annotation { *; }
 # 过滤泛型
 -keepattributes Signature  
以上只是基础配置,其他的需按项目需要进行配置,例如项目中用到的实体类、第三方库、第三方jar包的混淆配置
 #----------1.实体类----------------------------------
 #保持bean目录下文件不被混淆
 -keep class com.chinalife.chinalifeinvestment_oa.been.** {*;}

#-----------2.第三方引用-------------------------------
#百度地图
-dontwarn com.baidu.**
-keep class com.baidu.**{*; }

# ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# Gson
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}

#------------第三方jar包-----------------------------
-dontwarn com.unionpay.**
-keep class com.unionpay.** { *; }
-dontwarn livenessLib.**
-libraryjars libs/MGFaceppSDK-0.4.7.aar
-keep class android.support.v7.widget.RecyclerView {*;}

#忽略警告
-ignorewarnings  

对于第三方可以直接去官网找它的混淆配置

2、Apk反编译得到Java源代码:

1.下载工具dex2jar和jd-gui ,解压

2.将要反编译的APK后缀名改为.rar或者 .zip

3.解压,得到其中的classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内

4.在命令行下定位到dex2jar.bat所在目录,输入cd 路径;再输入dex2jar.bat classes.dex,出现done会在该目录下会生成一个classes_dex2jar.jar的文件

5.然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了,被混淆过的(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容