
这是一篇关于 Android 代码保护的文┞仿,旨在介绍代码混淆、防止逆向工程的各类高等技能。大年夜家都很忙,我也赶着归去持续开辟我的新应用,是以话不多说,越干(gan, 一声)越好。
本文有两部分内容,一部分讲混淆,一部分介绍一些混淆之下的安然手段。基准原则都是:在包管不麻烦到自身 以及 可以或许正常浏览异常日记的前提下,尽可能进步混淆强度和保护代码安然。
本文原文地址:http://drakeet.me/android-advanced-proguard-and-security/
混淆
Android 官方集成了 Proguard 以供我们进行代码混淆工作,关于 Proguard 你可以搜刮到各类它的 rules 解释,这些文┞仿一模一样,是以我不再赘述,只说一些特其余有效的技能:
一般情况下,Android 的 gradle 中都邑默认写着:
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
这一行代码很多人不懂得。它的意思是,指定了两个 Proguard rules 文件,一个是经由过程getDefaultProguardFile() 办法获得官方自带的混淆规矩文件路径,另一个是与当前 gradle 雷同目次下的 proguard-rules.pro 文件路径。
后者就在我们项目中,由我们书写的,没什么好说的,我们要存眷的是前者这个默认 Proguard 文件,它的内容是什么你有曾商量过吗?没有的话,你可以在你的体系文件里搜刮proguard-android.txt 就应当能把它找出来,具体本身去看,我就说一些关键的,这个默认文件中帮我们声清楚明了很多混淆规矩内容,包含:keep 所有持续自 View 的类,keep 所有持续自 Activity 的类,keep 所有 JavascriptInterface、native 办法声明,以及 keep 一些注解了@Keep 的内容。
那么为什么官方默认会帮我们写下这些?为什么 View 和 Activity 默认情况下应当被保存呢?
简单来说,因为 Proguard 本来是为 Java 打造的,它无法搜刮到我们 AndroidManifest、构造等文件中引用了哪些 Java 类,是以如不雅 Java 代码变了而 XML 文件中的引用没变,就会造成反射掉败。所以这些被 XML 应用到的类须要 keep 住。
对于这个问题,饿了么 的团队供给了一个鲜为人知的 gradle 插件 用来无伤混淆 Activity 和 View,这个项目叫 Mess:https://github.com/eleme/Mess ,具体内容各位可以稍后自行去浏览其文档和教程,链接最后都还会附于末尾。简单来说,Mess 弥补了 Proguard 不克不及检索 XML 文件的缺点,帮 Proguard 完成了 Activity 和 View 的改名及 mapping。
话说回来,前面我建议各位都去逐行懂得下默认混淆设备文件,因为只有如许,你才知道全部混淆对象帮你做了什么,懂得清跋扈之后,我建议的一个做法是,把这个默认文件拷贝到你的项目目次之下,删掉落 getDefaultProguardFile('proguard-android.txt'),再惹人现存于你目次之下的原默认文件。这么做的好处是,便利你修改┞封个默认文件,因为它有些内容是不须要或者可以更改的。不过根本上我们可以保存其原样。复制过来的另一个好处是,避免其被外方更新导致你引用过来后产生变数。总之,proguardFiles 这个设备项(其实是一个 gradle 办法)可以接收无穷个 rules 文件路径,它的参数是一个可变字符串参数,不过为了避免代码横向成长,我更愿意应用另一个办法,叫 proguardFile,留意,少了一个 s 有没有,它接收单个参数,相当于 add 一个 rules。对此,供给我的设备以供参考:
- release {
- debuggable false
- minifyEnabled true
- zipAlignEnabled true
- shrinkResources true
- signingConfig signingConfigs.release
- proguardFile 'proguard-common.pro'
- proguardFile 'proguard-rules.pro'
- proguardFile 'proguard-rules-google-ads.pro'}
个中 proguard-common.pro 这个文件就是上述我说的复制过来的官方默认设备文件,它被我放在当前 module 目次之下和 proguard-rules.pro 并列。这么写很清跋扈并且便于复竽暌姑。
讲完根本内容之后,我决定再介绍两条特别实用的 Proguard rules:
所以你知道为什么默认情况下,即使你本身一条规矩都没有参加,你的自定义 View 和 Activity 都被保存下来了吧,至少类名都没有被混淆。
-repackageclasses
-repackageclasses 这条规矩设备特别强大年夜,它可以把你的代码以及所应用到的各类第三方库代码一切移动到同一个包下,可能有人知道这条设备,但仅仅知道它还不克不及发挥它最大年夜的感化,默认情况下,你只要在 rules 文件中写上 -repackageclasses 这一行代码就可以了,它会把上述的代码文件都移动到根包目次下,即在 / 包之下,如许当有人反编译了你的 APK,将会在根包之下看到 成千上万 的类文件并列着,除此之外,因为我们有时不得不 keep 一些类文件,于是你应用的包名层次仍然会存在,有一些没被完全混淆的类将持续存留在你的包名之下,这些类文件就相对得不到很好的保护。于是我要介绍一个小技能,就是 -repackageclasses 后跟上一个你应用的包名,如:
推荐阅读
1.uptime敕令在Linux中,uptime敕令显示了你的体系运行了多久以及今朝登录的用户有若干,别的还显示了距离1分钟、5分钟和15分钟的负载平均值。# uptime08:16:26 up 22min, 1 user,loadave>>>详细阅读
本文标题:Android高级混淆和代码保护技术
地址:http://www.17bianji.com/lsqh/36365.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示