前言
去年年底提了新車,這車什么都好就是自帶的高德地圖版本太低了,在高德地圖已經(jīng)進(jìn)入6.x的時(shí)代,車機(jī)上自帶的才4.x逞度,更重要的是不支持升級(jí),從高德官網(wǎng)下載的車機(jī)版安裝提示簽名不同妙啃,覆蓋安裝又沒有權(quán)限档泽,就很難受,好在高德官方論壇里面有很多大佬都有提供共存版本揖赴,非常好用馆匿。
但是,作為一個(gè)Android開發(fā)人員燥滑,怎能如此沒有追求渐北,當(dāng)然得自己造一個(gè)出來啊。
前期準(zhǔn)備
首先需要感謝的是高德地圖的APK沒有進(jìn)行加固铭拧,這大大減輕了我們反編譯的工作量赃蛛,為此我們需要以下工具:
-
apktools.jar
用于對(duì)apk進(jìn)行反編譯及重新打包 官方地址注意:這里的
apktools.jar
不建議使用最新版本,最新版本存在無法恢復(fù)打包問題搀菩,使用2.6.0
版本即可呕臂。 jadx
用于打開apk文件,查看其中源碼 官方地址
由于部分網(wǎng)站可能被墻無法訪問肪跋,可以選擇從我打包好的云盤下載
當(dāng)然歧蒋,最后還不能忘了下載 高德地圖車機(jī)版
最終環(huán)境結(jié)構(gòu)如下:
反編譯流程
反編譯獲取有效信息
首先第一步就是通過 apktools.jar
工具對(duì)官方的apk進(jìn)行解包;
# 通過 apktools.jar 進(jìn)行解包
$ java -jar .\apktool_2.6.0.jar d .\AUTO_V6.1.0.600644_release_signed.apk
命令執(zhí)行后會(huì)在當(dāng)前路徑生成一個(gè) AUTO_V6.1.0.600644_release_signed
文件夾州既,這里面就是apk解包之后的內(nèi)容谜洽,我們后續(xù)的修改也是基于這個(gè)文件夾
接著將 AUTO_V6.1.0.600644_release_signed.apk
當(dāng)作壓縮文件打開,將其中的 classes.dex
文件解壓到當(dāng)前路徑吴叶,并通過 dex2jar
將 dex
文件轉(zhuǎn)換為 jar
文件
# 將 dex 轉(zhuǎn)換為 jar
$ .\dex2jar-2.0\d2j-dex2jar.bat .\classes.dex
命令執(zhí)行后會(huì)在當(dāng)前路徑生成 classes-dex2jar.jar
文件
修改關(guān)鍵信息
修改包名
要做共存版阐虚,最重要的當(dāng)然是修改應(yīng)用包名了,打開 .\AUTO_V6.1.0.600644_release_signed\AndroidManifest.xml
蚌卤,第一行里面 package
屬性就是包名敌呈,改為你自己的包名,注意不要和其它應(yīng)用重復(fù)即可造寝,我這邊是在后面加上了.coexist
修改為com.autonavi.amapauto.coexist
修改其它配置
僅修改包名并沒有結(jié)束,除此之外吭练,我們還需要將 AndroidManifest.xml
文件中的所有涉及到權(quán)限及內(nèi)容提供者的原 com.autonavi.amapauto
修改為 com.autonavi.amapauto.coexist
生成APK
重新打包成apk
在對(duì)解包后的數(shù)據(jù)進(jìn)行修改之后诫龙,我們可以再通過 apktools.jar
將文件夾重新打包為 apk
# 重新打包為apk
$ java -jar .\apktool_2.6.0.jar b .\AUTO_V6.1.0.600644_release_signed -o .\AUTO_V6.1.0.600644_coexist_unsigned.apk
執(zhí)行后會(huì)在當(dāng)前路徑生成 AUTO_V6.1.0.600644_coexist_unsigned.apk
,這個(gè)時(shí)候的apk是沒有簽名的鲫咽,無法進(jìn)行安裝使用签赃。
重新簽名
對(duì)于沒有簽名的apk谷异,可以通過jarsigner -verbose -keystore 【簽名文件】-storepass 【簽名密碼】 -signedjar 【輸出APK】 【未簽名APK】 【簽名別名】
進(jìn)行簽名
# 重新簽名
$ jarsigner -verbose -keystore .\wj_android.jks -storepass xxxxxx -signedjar .\AUTO_V6.1.0.600644_coexist_signed.apk .\AUTO_V6.1.0.600644_coexist_unsigned.apk xxxxxx
簽名完成會(huì)在當(dāng)前路徑生成 AUTO_V6.1.0.600644_coexist_signed.apk
,這個(gè)apk就可以直接進(jìn)行安裝使用了
繞過校驗(yàn)機(jī)制
在安裝完上面的apk打開后锦聊,你會(huì)發(fā)現(xiàn)根本無法使用歹嘹,會(huì)提示應(yīng)用出現(xiàn)異常錯(cuò)誤
這個(gè)是高德地圖啟動(dòng)的時(shí)候做了簽名相關(guān)的校驗(yàn),我們修改了包名及簽名孔庭,所以無法通過校驗(yàn)
定位啟動(dòng)界面
定位啟動(dòng)界面其實(shí)很簡單尺上,還是打開之前的 AndroidManifest.xml
文件,在其中搜索 android.intent.category.LAUNCHER
圆到,其所在 Activity
就是啟動(dòng)界面
然后我們就可以按照這個(gè)包路徑怎抛,在之前界面的文件夾里面找到對(duì)應(yīng)的源文件了,解包出來的代碼是smali
格式的
一個(gè)簡單的類被拆成了這么多芽淡,并且對(duì)應(yīng)smali
代碼我們也不熟悉马绝,更重要的是smali
中的中文都被編碼了,排查起來更加困難挣菲,這個(gè)時(shí)候 jadx
就派上了用場
定位校驗(yàn)邏輯
打開 jadx
并將AUTO_V6.1.0.600644_release_signed.apk
拖拽到窗口里富稻,我們很快找到啟動(dòng) Activity
的代碼
在這里我們可以直接搜索錯(cuò)誤信息文本
我們找到方法 g()
的調(diào)用地點(diǎn)
根據(jù)上面的代碼,我們能簡單的推斷白胀,方法 i()
就是跳轉(zhuǎn)進(jìn)入導(dǎo)航界面
由此可知關(guān)鍵代碼 p90.d(vd.w().e())
如果返回為 false
則會(huì)直接打開地圖椭赋,否則就會(huì)提示異常
這里我們在回調(diào)解包出來的 smali
代碼里,找到 p90
這個(gè)文件纹笼,找到 d(Context)
這個(gè)方法
修改校驗(yàn)邏輯
smali
語法和 Java
還是有很大差別的纹份,但是我們不需要精通,對(duì)應(yīng)這個(gè)校驗(yàn)方法看上去很復(fù)雜廷痘,但是我們的需求只不過是讓這個(gè)方法返回 true
即可蔓涧,因此修改如下:
修改之后再按照上面 打包APK 的步驟重新打包就能正常使用了。
資源修改
如果你想要給APP修改為不同的名稱笋额,不同的圖標(biāo)甚至是替換內(nèi)部的圖片元暴,這些就都很簡單了,只需要找到對(duì)應(yīng)的圖片兄猩、文本資源茉盏,直接進(jìn)行替換就可以了,不需要像修改包名那么復(fù)雜
最終效果
來看下安裝的最終效果吧
文章作者: WangJie0822
文章鏈接: http://www.wangjie0822.top/posts/5569bb54
版權(quán)聲明: 本博客所有文章除特別聲明外枢冤,均采用 CC BY-NC-SA 4.0 許可協(xié)議鸠姨。轉(zhuǎn)載請(qǐng)注明來自 WangJie0822!