APK改之理的反编译MSA移动安全联盟sdk异常问题
Angulu Lv1

一、起因

接到运营的需求,需要对CP的包体进行部分修正,默默的掏出APK改之理搞起来,一顿进程后,发现好家伙,失败了??
演示1
这就尴尬了,赶紧看看什么原因。。。点开目录一看,好家伙,怎么出现了smali_assets目录.
演示2

二、查因

顺着assets关键字对apk进行解压缩,发现apk包里面的assets目录先存着一个dex文件,如图所示
演示3
那么问题就是出现在了这里咯?
这个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来到达彻底解决这个问题的目的。
演示7
演示8
找到apktool是官网更新日志,查看解决方法,发现在版本2.4.1以上就已经解决了这个问题。
演示4
APKTool官网更新日志
既然知道了解决办法,其实就是加一条指令 --only-main-classes 而已。那问题就不大了,找打apktool的源代码,Apktool在github的源码地址,翻到程序的入口类 brut.apktool.Main 找到对应的入口main方法后。
因为我们是为了给APK改之理解决这个问题了,所以就偷个懒,不用看apktool的源代码了,直接遇到反编译指令的时候,强行插入一段我们想要插入的指令,如下
演示5
代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int size = args.length;
String[] newArgs = new String[size+1];
boolean needAdd = false;
for (int i = 0 ; i < size ; i++){
if(args[i].equalsIgnoreCase("d") || args[i].equalsIgnoreCase("decode")){
needAdd = true;
break;
}
}
if(needAdd){
int j = 0;
for (int i = 0 ; i < size ; i++,j++){
if(args[i].equalsIgnoreCase("d") || args[i].equalsIgnoreCase("decode")){
newArgs[j] = args[i];
newArgs[++j] = "--only-main-classes";
}else{
newArgs[j] = args[i];
}
}
}

经过简单粗暴的一段代码后,不掉头发的前提下,打出了一个jar包替换APK改之理的jar解决这个问题,如下
演示6

编译好的Apktool文件