资源混淆有助于减小包体积,也可以提高被反编译后阅读代码的难度。还可以应对一些安全检测机构对于资源混淆要求。
基于微信的Android资源混淆工具,实现资源混淆。
原理
Android的资源类型是很多的,比如说drawable,string,layout等,aapt在打包时,会将这些资源的名称,id和位置打包进一个resources.arsc包。
通过AndroidStudio可以查看resouces.arsc文件的内容。
image.png
AndResGuard大致上做的就是修改资源的名称和路径,修改为a b c这种简短的名称。
注意事项
如果你的资源,存在使用插件化的方式加载的,即:使用名称去找id,再用id去加载资源,由于资源的名称已经修改过了,所以会无法找到id。这种情况不能混淆。框架中提供了添加白名单的方法。
但是三方sdk中隐藏的插件化方式有点防不胜防。官方提供了常见的sdk白名单
使用方法
我使用的是gradle集成的方式
1.添加gradle配置
2.设置白名单,我设置了除了layout以外所有的资源不进行混淆,因为我的需求是应付安全监测,并且我们的项目中存在图片插件加载,为了降低后期维护成本,就不进行混淆了。
3.执行命令:resguardRelease 与assemble类似
具体可以参考github
一些细节
-
mappingFile
要不要加?我选择不加,加了之后,会keep住资源的路径,如果对增量包大小有要求的,可以加。不加的话,包体积可以进一步减小,并在一定程度上提高反编译的难度。 -
mergeDuplicationedRes
要不要加?我是加的。是否会造成什么问题?应该是不会的。因为框架本质上修改的是图片的指向的路径,图片的名称和id都没有修改,所以不管是正常引用和插件化加载都是没问题的。
网友评论