android项目对apk进行混淆

android项目对apk进行混淆,第1张

    混淆apk是一个很基础的工作,博客上也有一堆介绍,本文提供一下这类工作的解决思路。在安卓源码下面和android studio里面的做法差异不大,本文以android源码举例。

    首先在对应mk文件里面添加proguard enabled的语句,系统有一个自带的build/core/proguard.flags,默认是使用这个文件,而且一般项目默认是关闭的,这也是有原因的。因为这里的proguard.flags是没有针对app的配置的,使用默认的混淆,app很有可能就不工作了。

    添加了mk文件修改之后,在Android.mk同级根目录创建本app自有的proguard.flags。新增内容如下,这里需要注意,网上很多demo,基本分为三部分,一部是保留app基础功能部分的内容不混淆2是保持app对外接口,例如get、set、isxx、AIDL、public、native层的接口或者类3.是第三方jar包或接口。混淆的基本原理就是将上诉类或接口进行统一简单字母的替换,如果改变了这些对外接口的名字,很有可能被别人使用的时候就找不到对应哦接口

    一些第三方的库如何不进行混淆,这个根据项目特点,可以自行搜索,比如百度的地图包什么的。

    然后是如何验证和解决混淆过程遇到的问题,因为是对接口名进行替换,如果出现混淆问题的话,log里面一定会有类似

这个时候只需要对相关接口进行例外(-keep)即可,然后用android-studio,直接打开或者dex2jar进行反解可以看到相关的接口是否被简单替换。

基于微信的 Android资源混淆工具 ,实现资源混淆。

Android的资源类型是很多的,比如说drawable,string,layout等,aapt在打包时,会将这些资源的名称,id和位置打包进一个resources.arsc包。

通过AndroidStudio可以查看resouces.arsc文件的内容。

AndResGuard大致上做的就是修改资源的名称和路径,修改为a b c这种简短的名称。

如果你的资源,存在使用插件化的方式加载的,即:使用名称去找id,再用id去加载资源,由于资源的名称已经修改过了,所以会无法找到id。这种情况不能混淆。框架中提供了添加白名单的方法。

但是三方sdk中隐藏的插件化方式有点防不胜防。官方提供了常见的 sdk白名单

我使用的是gradle集成的方式

简单来说,Android 进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节。

首先在build.gradle 中将混淆的开关打开,即 minifyEnabled 置为 true

然后就要去proguard-rules.pro写入我们的混淆的规则(如文件其名),防止重要的类被混淆移除了。

省事第一步,先套个模板,就是找到网上博客上别人分享好的模板,像四大组件,主流开源库,JNI调用本地方法,R资源等的混淆规则都一般有了,注意一点就是套模板,也要套个时间比较近的,没有翻车的模板,可以能比较节省自己的时间,毕竟这么多行不一定能快速看出来,打个包出来才发现有问题就尴尬啦。

一般来说,用了混淆的模板后,我们还会有很多项目专属的需要混淆的部分,例如我们的自定义View,Json解析的实体类,反射用到的类,还有我们依赖的非主流的开源框架,SDK等等。

对于自定义View,很多的模板都会将继承与View的类用keep指令防止被混淆。有个偷懒的方法就是把自定义View 放入同一个包,再把这个包的类都写入混淆规则,就可以搞定了。

对于Json解析的实体类,反射用到的类都是同理可得,找到那些不能被移除的,把它们写入自己的混淆规则里面。

所以如果在做项目时,有提前想到要给项目做混淆的,在导入依赖时就顺手把对应混淆规则写了,那事后就快活似神仙了。

首先,先判断下它是否内置了混淆规则。如果不声明它的混淆规则也正常运行,说明已经它带了混淆。

但是生活往往不会一帆风顺,一般来说会有各种报错,所以还是需要对它声明混淆。

最简单的办法就是找到依赖的这个包,就这个包的类都写入混淆规则。例如:

项目里导入了一个非主流的开源库,然后我需要对它写入混淆规则,确保它能正常工作。

这时候不可以认为直接去使用它的地方,将有关它 import的类 keep class 就可以。

因为可能它内部还会使用包内其他类,所以最好仔细排查,最简(tou)单(lan)就是把这个包的类都 用 keep 指令,防止它们被混淆。如下所示:

一般来说就可以防止这个开源库里的类被混淆了。

例如

先使用 -libraryjars 命令 ,对导入的jar包和 so 文件进行声明保留它们。

如果依旧出错,尝试去External library文件夹 或者使用 这个SDK的地方 找到这个 SDK的包找到,并把这个包里的类 都用 keep 指令保持不被移除。如:

根据包名,写入混淆规则

一般来说,这样就可以避免这个SDK的类被混淆啦

好了,最后附上一份自己做的项目的混淆规则(伪模板)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11389151.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存