Android 混淆规则
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 混淆规则相关推荐
- Android混淆规则介绍
Android混淆规则介绍 写在前面的话 APP上线推广,免不得是需要混淆加固的,况且劳动成果不易又会有谁希望自己的APP被破解抄袭呢.鉴于此方显本片文章的通用型和重要意义. 混淆简介 Android ...
- android 混淆规则作用,Android混淆规则
简介 Java代码是非常容易反编译的.为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理. ProGuard是一个混淆代码的开源项目.它的主要作用就是混淆,当然它还能对字节码 ...
- android 混淆规则作用,Android代码混淆详解
一.混淆的意义 混淆代码并不是让代码无法被反编译,而是将代码中的类.方法.变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类.方法.变量等. 所以直观的看,通过混淆可以提高 ...
- Android中jsoup的混淆规则
Android中jsoup的混淆规则 版权声明:转载必须注明本文转自严振杰的博客:http://blog.yanzhenjie.com 说实话这篇文章的标题和内容我觉得很水,所以读者们要是也觉得这篇文 ...
- Android自定义注解不被混淆,Android 混淆压缩开启以及自定义混淆规则
1. app module下build文件开启代码混淆和资源压缩 通过minifyEnabled=true开启混淆,shrinkResources=true开启资源压缩,混淆会增加编译时间,一般rel ...
- Android 代码混淆规则
1. Proguard介绍 Android SDK自带了混淆工具Proguard.它位于SDK根目录\tools\proguard下面. ProGuard是一个免费的Java类文件收缩,优化,混淆和预 ...
- Android代码混淆之混淆规则
请尊重他人的劳动成果,转载请注明出处:<Android代码混淆技巧> 因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆.SDK已经集成了ProGua ...
- Android混淆解析
此文章转载来源https://www.jianshu.com/p/84114b7feb38点击打开链接 Android混淆解析 一.混淆的目的 一款发布到市场的软件原则上都应该做代码混淆. 通过代码混 ...
- Android混淆详解
综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及资源压缩等的优化过程.依靠 ProGua ...
- Android 混淆详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/69388246 本文出自[赵彦军的博客] 文章目录 混淆的基本概念 开启混淆 混淆规 ...
最新文章
- SAP QM 执行事务代码QE01为检验批录入结果直接进入Multiple Specification标签页?
- [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
- 医疗保健数据接口_应用的大数据:医疗保健的经济学
- python中变量和函数的区别_python中带下划线的变量和函数的意义
- 数据分析项目实战—信用卡客户违约概率预测
- 数据库的基本语句(mysql举例)
- xp系统无法访问服务器共享打印机,XP系统无法访问共享打印机解决方案
- numpy 随机生成矩阵
- 通过 purge_relay_logs 自动清理relaylog
- java linux virt_解决Unable to load library 'virt'
- selenium+Python 刷视频视频播放量
- vue+cesium实现风场
- 【思考】人脸认证真的准确吗?通过身份证的人脸对比有哪些问题?
- Qt程序报错:Socket notifiers cannot be enabled or disabled from another thread
- 春秋旅游移动app设计界面
- C语言学习笔记(C程序设计-谭浩强)
- 辽宁计算机相关硕士非全日制,辽宁地区院校非全日制硕士研究生招生专业汇总...
- 74LS244 三态门 功能介绍
- python数据分析库pandas-三、: python数据分析处理库-Pandas
- linux 增加静态路由命令