饿了么最近新推出一款开源库叫做,用来帮助设计师,程序员,测试人员来在APP上修改View的各项参数。可谓是十分好用。
BUT
他只能给自己的项目添加依赖。这样就局限了他的实力。
如果可以把它集成到其他App就好了。那么,今天的目标就是: 把UETool注入到饿了么APK内部。
先来看下效果图, 成品是UETool已经成功运行在了饿了么里面:
接下来,将一步步带领大家把UETool注入进去:
要注入一些代码进入apk,首先肯定是要先反编译咯,所以用apktool搞之:
java -jar apktool_2.3.3.jar d eliaome_252.apk
复制代码
然后你就会发现,呃。。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的代码:
invoke-static {p0}, Lme/ele/uetool/UETool3PHelper;->showUETool(Landroid/content/Context;)V
复制代码
这个时候,重打包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