UETool大戰餓了麼!

本文同步自wing的地方酒館php

本文僅供學習研究用,若有侵犯,聯繫做者當即刪除。java

餓了麼最近新推出一款開源庫叫作UETool,用來幫助設計師,程序員,測試人員來在APP上修改View的各項參數。可謂是十分好用。android

BUT

他只能給本身的項目添加依賴。這樣就侷限了他的實力。git

若是能夠把它集成到其餘App就行了。那麼,今天的目標就是: 把UETool注入到餓了麼APK內部。程序員

先來看下效果圖, 成品是UETool已經成功運行在了餓了麼裏面:github

接下來,將一步步帶領你們把UETool注入進去:bash

要注入一些代碼進入apk,首先確定是要先反編譯咯,因此用apktool搞之:學習

java -jar apktool_2.3.3.jar d eliaome_252.apk
複製代碼

而後你就會發現,呃。。apktool報錯了:測試

可能不少小夥伴就此打住了,以爲無法解決。沒事,別慌。由於是最新版apktool,這必定能夠解決的。 仔細看其中有一句: Baksmaling assets/hack.dex...spa

很可疑,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

相關文章
相關標籤/搜索