Android 混淆及反编译工具Jadx

Android Studio自身集成Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单,只需要在工程应用目录的gradle文件中设置minifyEnabled为true即可。然后我们就可以到proguard-rules.pro文件中加入我们的混淆规则了。

android { ... buildTypes {release {minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         } }
}
复制代码

以上示例代码表示对release版本就行混淆处理。下面我们先来简介下ProGuard的三大作用,并简要说明下它们常用的命令。

ProGuard作用

压缩(Shrinking):默认开启,用以减小应用体积,移除未被使用的类和成员,并且会在优化动作执行之后再次执行(因为优化后可能会再次暴露一些未被使用的类和成员)。

-dontshrink 关闭压缩
复制代码

优化(Optimization):默认开启,在字节码级别执行优化,让应用运行的更快。

-dontoptimize 关闭优化
-optimizationpasses n 表示proguard对代码进行迭代优化的次数,Android一般为5
复制代码

混淆(Obfuscation):默认开启,增大反编译难度,类和类成员会被随机命名,除非用keep保护。

-dontobfuscate 关闭混淆
复制代码

混淆后默认会在工程目录app/build/outputs/mapping/release下生成一个mapping.txt文件,这就是混淆规则,我们可以根据这个文件把混淆后的代码反推回源本的代码,所以这个文件很重要,注意保护好。原则上,代码混淆后越乱越无规律越好,但有些地方我们是要避免混淆的,否则程序运行就会出错,所以就有了下面我们要教大家的,如何让自己的部分代码避免混淆从而防止出错。

基本规则

先看如下两个比较常用的命令,很多童鞋可能会比较迷惑以下两者的区别。

-keep class cn.hadcn.test.**
-keep class cn.hadcn.test.*
复制代码

一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;两颗星表示把本包和所含子包下的类名都保持;用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,这时如果既想保持类名,又想保持里面的内容不被混淆,我们就需要以下方法了

-keep class cn.hadcn.test.* {*;}
复制代码

在此基础上,我们也可以使用Java的基本规则来保护特定类不被混淆,比如我们可以用extend,implement等这些Java规则。如下例子就避免所有继承Activity的类被混淆

-keep public class * extends android.app.Activity
复制代码

如果我们要保留一个类中的内部类不被混淆则需要用$符号,如下例子表示保持ScriptFragment内部类JavaScriptInterface中的所有public内容不被混淆。

-keepclassmembers class cc.ninty.chat.ui.fragment.ScriptFragment$JavaScriptInterface { public *;
}
复制代码

再者,如果一个类中你不希望保持全部内容不被混淆,而只是希望保护类下的特定内容,就可以使用

<init>; //匹配所有构造器
<fields>; //匹配所有域
<methods>; //匹配所有方法方法
复制代码

你还可以在或前面加上private 、public、native等来进一步指定不被混淆的内容,如

-keep class cn.hadcn.test.One { public <methods>;
}
复制代码

表示One类下的所有public方法都不会被混淆,当然你还可以加入参数,比如以下表示用JSONObject作为入参的构造函数不会被混淆

-keep class cn.hadcn.test.One { public <init>(org.json.JSONObject);
}复制代码

有时候你是不是还想着,我不需要保持类名,我只需要把该类下的特定方法保持不被混淆就好,那你就不能用keep方法了,keep方法会保持类名,而需要用keepclassmembers ,如此类名就不会被保持,为了便于对这些规则进行理解,官网给出了以下表格

保留 防止被移除或者被重命名 防止被重命名
类和类成员 -keep -keepnames
仅类成员 -keepclassmembers -keepclassmembernames
如果拥有某成员,保留类和类成员 -keepclasseswithmembers -keepclasseswithmembernames

移除是指在压缩(Shrinking)时是否会被删除。以上内容时混淆规则中需要重点掌握的,了解后,基本所有的混淆规则文件你应该都能看懂了。再配合以下几点注意事项,开启你为自己代码,实现混淆规则之旅吧。

注意事项

1,jni方法不可混淆,因为这个方法需要和native方法保持一致;

-keepclasseswithmembernames class * { # 保持native方法不被混淆 native <methods>;
}
复制代码

2,反射用到的类不混淆(否则反射可能出现问题);

3,AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的;

4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象;

5,使用第三方开源库或者引用其他第三方的SDK包时,如果有特别要求,也需要在混淆文件中加入对应的混淆规则;

6,有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样;

7,Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常;

-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *;
}
复制代码

8,使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。

-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String);}
复制代码

写在最后

发布一款应用除了设minifyEnabled为ture,你也应该设置zipAlignEnabled为true,像Google Play强制要求开发者上传的应用必须是经过zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。

android 反编译工具Jadx

github.com/skylot/jadx

查看源码工具

Source Insight

作者:walkingCoder
链接:https://juejin.cn/post/7119094290780962823
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android 混淆规则相关推荐

  1. Android混淆规则介绍

    Android混淆规则介绍 写在前面的话 APP上线推广,免不得是需要混淆加固的,况且劳动成果不易又会有谁希望自己的APP被破解抄袭呢.鉴于此方显本片文章的通用型和重要意义. 混淆简介 Android ...

  2. android 混淆规则作用,Android混淆规则

    简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...

  3. android 混淆规则作用,Android代码混淆详解

    一.混淆的意义 混淆代码并不是让代码无法被反编译,而是将代码中的类.方法.变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类.方法.变量等. 所以直观的看,通过混淆可以提高 ...

  4. Android中jsoup的混淆规则

    Android中jsoup的混淆规则 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 说实话这篇文章的标题和内容我觉得很水,所以读者们要是也觉得这篇文 ...

  5. Android自定义注解不被混淆,Android 混淆压缩开启以及自定义混淆规则

    1. app module下build文件开启代码混淆和资源压缩 通过minifyEnabled=true开启混淆,shrinkResources=true开启资源压缩,混淆会增加编译时间,一般rel ...

  6. Android 代码混淆规则

    1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录\tools\proguard下面. ProGuard是一个免费的Java类文件收缩,优化,混淆和预 ...

  7. Android代码混淆之混淆规则

    请尊重他人的劳动成果,转载请注明出处:<Android代码混淆技巧> 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆.SDK已经集成了ProGua ...

  8. Android混淆解析

    此文章转载来源https://www.jianshu.com/p/84114b7feb38点击打开链接 Android混淆解析 一.混淆的目的 一款发布到市场的软件原则上都应该做代码混淆. 通过代码混 ...

  9. Android混淆详解

    综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及资源压缩等的优化过程.依靠 ProGua ...

  10. Android 混淆详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/69388246 本文出自[赵彦军的博客] 文章目录 混淆的基本概念 开启混淆 混淆规 ...

最新文章

  1. SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页?
  2. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  3. 医疗保健数据接口_应用的大数据:医疗保健的经济学
  4. python中变量和函数的区别_python中带下划线的变量和函数的意义
  5. 数据分析项目实战—信用卡客户违约概率预测
  6. 数据库的基本语句(mysql举例)
  7. xp系统无法访问服务器共享打印机,XP系统无法访问共享打印机解决方案
  8. numpy 随机生成矩阵
  9. 通过 purge_relay_logs 自动清理relaylog
  10. java linux virt_解决Unable to load library 'virt'
  11. selenium+Python 刷视频视频播放量
  12. vue+cesium实现风场
  13. 【思考】人脸认证真的准确吗?通过身份证的人脸对比有哪些问题?
  14. Qt程序报错:Socket notifiers cannot be enabled or disabled from another thread
  15. 春秋旅游移动app设计界面
  16. C语言学习笔记(C程序设计-谭浩强)
  17. 辽宁计算机相关硕士非全日制,辽宁地区院校非全日制硕士研究生招生专业汇总...
  18. 74LS244 三态门 功能介绍
  19. python数据分析库pandas-三、: python数据分析处理库-Pandas
  20. linux 增加静态路由命令

热门文章

  1. js 判断数组的4种方法
  2. 【UE·蓝图】UE4蓝图MediaPlayer注意事项
  3. 打印机驱动开发,初步了解
  4. UltraEdit 注册机
  5. Maven镜像源汇总(含国内、国外)
  6. matlab和r语言做热图,R语言画图与MATLAB画图PK
  7. 基于Multism的高频小信号谐振放大器仿真研究
  8. 第三次科技革命与计算机网络,第三次科技革命
  9. 海洋网络收音机海洋影音盒
  10. 从NPU-SLAM-EDA技术分析