Android混淆心得
来源:互联网 发布:淘宝十大人气主播 编辑:程序博客网 时间:2024/06/05 23:50
最近在做Android应用的混淆,踩了一些坑,这里记录分享下个人的心得。
混淆介绍
首先先简单说一下什么是混淆和混淆的作用,其实这个搜索下可以找到一堆官方的说法等等,这里简单口语叙述一下,混淆就是把代码替换成a、b、c基本字母组成的代码,比如一个方法名为:function(),混淆后可能会被替换成a()。
混淆的好处:
- 代码混淆后阅读性降低,反编译后破译程序难度提高
- 混淆后字节数减少,减少了应用了体积
前者只能说有一点作用,后者则需要看代码的数量
当然不能忽视混淆的缺点:
- 混淆后,测试不充分可能导致某些功能不能使用
开启混淆
混淆在android Studio的项目中默认是关闭的,其中控制开关和规则配置文件分别由项目moudle中的build.gradle和proguard-rules.pro控制,如下图所示:
其中build.gradle中
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
其中
- 1
- 1
表示不开启混淆,可以改为
- 1
- 1
开启混淆,开启混淆后可以添加一句:
- 1
- 1
表示去掉没有引用的资源,可以减少应用的体积,但这个只有在混淆开启后才有效。
混淆规则文件
可以从上述的代码看出,Android自带一个混淆规则文件:
- 1
- 1
这个文件在SDK目录下,里面有一些默认自带的规则,而我们今天需要配置的自定义配置的文件,即上面所述的
- 1
- 1
混淆规则基本语法
混淆文件采用白名单法,意思是不在白名单里面的都要混淆。
混淆规则的基本符号:
- 1
- 2
- 1
- 2
一般规则用连起来单词表示,主要有:
- 1
- 2
- 3
- 1
- 2
- 3
混淆配置文件不检查规则是否重复,如果两条规则冲突,则采用白名单的,比如设置了开启优化和不优化两个选项后,无论顺序,最终都会执行不优化的操作。
优化控制
这个是用于控制混淆是否开启优化代码,例如一些if/else语句可以被简化等这些操作:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
值得注意的是默认混淆配置文件开启了-dontoptimize
。
优化进阶
开启优化后可以设置下面的规则,assumenosideeffects表示指定的代码无效,可以优化,最终效果表现为不执行。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
基本混淆规则
下面这些一般混淆规则都要加入,其中前两个在默认文件中已经配置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
输出混淆记录
混淆后由于阅读困难性提高,所以为了方便自己查阅,可以输出mapping对应文件,可以利用AndroidSDK\tools\proguard\bin中的proguardgui.bat打开混淆工具,利用retrace结合mapping和stacktrace调试遇到的错误
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
保留源代码行号
即使使用retrace工具,还是很难定位到错误的时候,可以暂时先保留行号,观察错误修改后再关闭掉
- 1
- 2
- 3
- 1
- 2
- 3
基本组件白名单
Android中的基本组件不能混淆,为了方便,下面提供了兼容性比较高的规则:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
Support包规则
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
不混淆本地方法
本地方法不能混淆,这个规则在默认配置文件中有:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
WebView混淆规则
使用了WebView的js功能则开启下面规则,这个规则在自定义规则文件中已经用注释说明了:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
注解、泛型和反射混淆
下面是混淆规则:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
有些注解可能不能被混淆,需要手动混淆一下
内部类混淆
- 1
- 2
- 1
- 2
第三方混淆参考规则
Gson
- 1
- 2
- 3
- 1
- 2
- 3
otto
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
universal-image-loader
- 1
- 2
- 1
- 2
友盟统计
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
OkHttp
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
nineoldandroids
- 1
- 2
- 1
- 2
支付宝
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
Socket.io
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
JPUSH
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
友盟分享
这个只有部分热门的SDK,具体可以参考分享文档:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
个人遇到的一些坑
网络层混淆
混淆要注意,一般网络层都不进行混淆,可以经过划分包后直接不混淆网络层的包:
- 1
- 1
数据模型混淆
所有bean都不要混淆,可以使用下面的:
- 1
- 2
- 1
- 2
但是有时候上述代码可能导致应用卡住,没用任何错误提示,所以我建议采用分包模式,把所有bean放在一个包中,直接对该包加白名单:
- 1
- 1
XML映射问题
如果你遇到一些控件无法Inflate,报NullPointException,比如ListView,NavigationView等等,这个问题花了我几个小时自己研究出了规则:
- 1
- 1
混淆规则编写方法
如果混淆后报错,通过retrace后找到错误的问题后可以直接编写规则来去掉混淆,但是如果报的错误莫名其妙,而且报错的类没有混淆,那么你可以采用极端的方法:
加入下面规则:
- 1
- 1
这条规则表示不混淆所有类及其中所有代码,加了这条规则之后,
还不能运行表示是其他问题,例如注解,内部类等等,
可以运行后,可以通过反编译,寻找所有包名,记录下来,把上述规则改为:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
一个个去掉检查是否有报错,例如查到
- 1
- 1
加了就不报错,则可以继续一级级往下检查。
但要注意,有时候可能是几个包混合问题。
- Android 代码混淆心得!
- Android 代码混淆心得!
- Android混淆心得
- Android混淆心得
- Android 代码混淆心得!
- Android混淆心得
- Android混淆心得
- android 混淆jar及apk的心得
- android 混淆jar及apk的心得
- android 混淆jar及apk的心得
- Android之混淆心得与亲身体验
- Android之混淆心得与亲身体验
- 关于 Android 混淆的一些心得
- Android之混淆心得与亲身体验
- android proguard 混淆 的一点心得
- android 混淆jar及apk的心得(错误总结)
- Android studio 使用心得(五)---代码混淆和破解apk
- 安卓代码混淆心得
- linux下调用opencv接口函数在指定图片上面画几何图形
- shiro 减少用redis实现的自定义SessionDAO的doUpdate的调用次数
- Android系统自动转屏流程(二)
- Python UnitTest 文档中文翻译-2-3(渣翻自娱)
- 反向代理概念
- Android混淆心得
- foreach 简单使用
- windows禁用笔记本自带键盘办法
- 课程学习3
- java基础教程:常用对象之Object(20)
- 一次外场宕机引发对linux内存管理的进一步思考--Linux虚拟地址空间如何分布
- Spring MVC文件下载及中文文件名乱码解决
- UVa 12100 printer queue 解题报告
- Weibull分布(韦伯分布, 威布尔分布)函数公式, 参数,曲线分布图