UETool大战饿了么!

本文仅供学习研究用,如有侵犯,联系作者立即删除。

饿了么最近新推出一款开源库叫做UETool,用来帮助设计师,程序员,测试人员来在APP上修改View的各项参数。可谓是十分好用。

BUT

他只能给自己的项目添加依赖。这样就局限了他的实力。

如果可以把它集成到其他App就好了。那么,今天的目标就是: 把UETool注入到饿了么APK内部。

先来看下效果图, 成品是UETool已经成功运行在了饿了么里面:

接下来,将一步步带领大家把UETool注入进去:

要注入一些代码进入apk,首先肯定是要先反编译咯,所以用apktool搞之:

然后你就会发现,呃。。apktool报错了:

可能很多小伙伴就此打住了,觉得没法解决。没事,别慌。因为是最新版apktool,这一定可以解决的。
仔细看其中有一句:
Baksmaling assets/hack.dex…

很可疑,assets底下有一个hack.dex,不管是存放位置还是命名都很可疑。猜测这是一个格式错误的dex,用于防范反编译。遂,搞之。 解压删除hack.dex,顺便把签名也删掉。

再次使用apktool反编译。很好,我们想要的东西出来了:

那怎么注入呢? 很简单,我们把UETool的sample的apk也给反编译,把UETool的smali文件拷贝过来,直接放入eleme的smali文件夹即可。

因为这里UETool的包名和饿了么的包名一样,所以才可以这样做,如果报名不一样,需要对所有smali文件做改动。

放入smali的时候,注意文件夹位置。

这个时候,代码问题解决完了,还要解决资源问题。观察UETool开源库,他的资源文件都是uet开头的,这下就好说了。把UETool反编译之后的values/public.xml文件打开,查找uet开头的资源:

这些就是开源库里面需要的资源,将其复制到饿了么的public.xml,并且把对应的xml文件也复制到饿了么的对应资源文件下。

此时,用apktool回编译,你会发现会报错。这是因为资源id冲突。

在aapt生成的资源中,7f是系统预留的资源开头id,后面两位代表类型,如图:
layout为04
drawable为02
再往后四位是id编号,这里为了防止冲突,统一修改为99xx,按续递增。

再次回编译,发现报错,找不到id。

于是将报错的id加入到values/ids.xml文件里面。 此时再回编译。发现编译成功!

此时,打开饿了么还不能运行UETool。因为没有调用他的showMenu。于是我们想在饿了么APP oncreate的时候,就注入。所以我们在UETool的demo里面,加一个类,判断一下进程,因为他会开多个进程:

将它编译为smali后,考入饿了么的smali文件夹,并且在android.taobao.atlas.startup.AtlasBridgeApplication注入一句启动UETool的代码:

这个时候,重打包apk。安装启动,发现打开会跳到UETool的辅助功能悬浮窗授权页面,说明代码已经生效了。

但是再进入页面,会崩溃,观察log日志:

查看相关UETool源码发现:

明明是添加到LinearLayout上,为什么会报CoordinatorLayout呢?
在深思熟虑了10分钟后,终于灵光一现,原来是忘记改UETool里R$id的数值,然后代码就用UETool的id去饿了么apk里索引,于是找到了CoordinatorLayout。。

所以在此修改R$id里面的对应的id值。具体的值从public.xml找即可。这里需要注意的是,所有引用到的id基本上都要改掉。比如一些通用的id名比如name,那么饿了么里面也会有,所以要找到饿了么本身的name的id值给到UETool的id值。

这下大功告成,直接重打包,签名,安装,UETool就出现在了饿了么上面。

整个过程就是这样,总结成文章没多长,但是整个踩坑过程还是很耗时的。可以学到很多东西,哈哈。

如果你觉得文章不错,欢迎点个赞。

欢迎加入qq群交流Android技术:425983695

发表评论

电子邮件地址不会被公开。