一、起因
接到运营的需求,需要对CP的包体进行部分修正,默默的掏出APK改之理搞起来,一顿进程后,发现好家伙,失败了??
这就尴尬了,赶紧看看什么原因。。。点开目录一看,好家伙,怎么出现了smali_assets目录.
二、查因
顺着assets关键字对apk进行解压缩,发现apk包里面的assets目录先存着一个dex文件,如图所示
那么问题就是出现在了这里咯?
这个Dex文件是从哪里来的呢?查询得知它来自MSA移动安全联盟sdk,这个SDK是为了解决,Android 10版本中,广告渠道商们作为非厂商系统应用将无法获取 IMEI、MAC等设备信息选择OAID字段作为IMEI等的替代字段标识.没错,它是为了获取设备标识来获取OAID字段的。也就是未来很多apk将会带上这个SDK,那这个问题得解决啊.
三、解决
这个问题其实是APK改之理没有长期更新遗留的一个问题,这个问题可以通过两种方法解决。
方法一
既然APK改之理不支持assets目录有dex文件存在来操作,那么只要把apk里面的assets的dex文件拿出来,反编译,回编译的时候手动放回去就可以解决,这个解决方式一两次还好,多次就显得麻烦的要死了,而且回编译的时候很可能会忘记,导致apk的一些功能异常。
方法二
解决问题肯定要找到根源来解决啦,APK改之理虽然不更新了,但是他也是依托apktool这个工具来反编译了,说白了就是代码调用了一下这个工具而已,那么更新一下apktool不就可以了,还好apktool到现在没有断更。
找到自己现在用的apktool的目录,通过修改apktool来到达彻底解决这个问题的目的。
找到apktool是官网更新日志,查看解决方法,发现在版本2.4.1以上就已经解决了这个问题。
APKTool官网更新日志
既然知道了解决办法,其实就是加一条指令 --only-main-classes
而已。那问题就不大了,找打apktool的源代码,Apktool在github的源码地址,翻到程序的入口类 brut.apktool.Main
找到对应的入口main方法后。
因为我们是为了给APK改之理解决这个问题了,所以就偷个懒,不用看apktool的源代码了,直接遇到反编译指令的时候,强行插入一段我们想要插入的指令,如下
代码如下
1 | int size = args.length; |
经过简单粗暴的一段代码后,不掉头发的前提下,打出了一个jar包替换APK改之理的jar解决这个问题,如下