
前言
去年年底提了新車,這車什么都好就是自帶的高德地圖版本太低了,在高德地圖已經(jīng)進入6.x的時代,車機上自帶的才4.x,更重要的是不支持升級,從高德官網(wǎng)下載的車機版安裝提示簽名不同,覆蓋安裝又沒有權(quán)限,就很難受,好在高德官方論壇里面有很多大佬都有提供共存版本,非常好用。
但是,作為一個Android開發(fā)人員,怎能如此沒有追求,當(dāng)然得自己造一個出來啊。
前期準(zhǔn)備
首先需要感謝的是高德地圖的APK沒有進行加固,這大大減輕了我們反編譯的工作量,為此我們需要以下工具:
-
apktools.jar用于對apk進行反編譯及重新打包 官方地址注意:這里的
apktools.jar不建議使用最新版本,最新版本存在無法恢復(fù)打包問題,使用2.6.0版本即可。 jadx用于打開apk文件,查看其中源碼 官方地址
由于部分網(wǎng)站可能被墻無法訪問,可以選擇從我打包好的云盤下載
當(dāng)然,最后還不能忘了下載 高德地圖車機版
最終環(huán)境結(jié)構(gòu)如下:

反編譯流程
反編譯獲取有效信息
首先第一步就是通過 apktools.jar 工具對官方的apk進行解包;
# 通過 apktools.jar 進行解包
$ java -jar .\apktool_2.6.0.jar d .\AUTO_V6.1.0.600644_release_signed.apk
命令執(zhí)行后會在當(dāng)前路徑生成一個 AUTO_V6.1.0.600644_release_signed 文件夾,這里面就是apk解包之后的內(nèi)容,我們后續(xù)的修改也是基于這個文件夾
接著將 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í)行后會在當(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
在對解包后的數(shù)據(jù)進行修改之后,我們可以再通過 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í)行后會在當(dāng)前路徑生成 AUTO_V6.1.0.600644_coexist_unsigned.apk,這個時候的apk是沒有簽名的,無法進行安裝使用。
重新簽名
對于沒有簽名的apk,可以通過jarsigner -verbose -keystore 【簽名文件】-storepass 【簽名密碼】 -signedjar 【輸出APK】 【未簽名APK】 【簽名別名】進行簽名
# 重新簽名
$ 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
簽名完成會在當(dāng)前路徑生成 AUTO_V6.1.0.600644_coexist_signed.apk,這個apk就可以直接進行安裝使用了
繞過校驗機制
在安裝完上面的apk打開后,你會發(fā)現(xiàn)根本無法使用,會提示應(yīng)用出現(xiàn)異常錯誤

這個是高德地圖啟動的時候做了簽名相關(guān)的校驗,我們修改了包名及簽名,所以無法通過校驗
定位啟動界面
定位啟動界面其實很簡單,還是打開之前的 AndroidManifest.xml 文件,在其中搜索 android.intent.category.LAUNCHER,其所在 Activity 就是啟動界面

然后我們就可以按照這個包路徑,在之前界面的文件夾里面找到對應(yīng)的源文件了,解包出來的代碼是smali格式的

一個簡單的類被拆成了這么多,并且對應(yīng)smali代碼我們也不熟悉,更重要的是smali中的中文都被編碼了,排查起來更加困難,這個時候 jadx 就派上了用場
定位校驗邏輯
打開 jadx 并將AUTO_V6.1.0.600644_release_signed.apk 拖拽到窗口里,我們很快找到啟動 Activity 的代碼

在這里我們可以直接搜索錯誤信息文本

我們找到方法 g() 的調(diào)用地點

根據(jù)上面的代碼,我們能簡單的推斷,方法 i() 就是跳轉(zhuǎn)進入導(dǎo)航界面

由此可知關(guān)鍵代碼 p90.d(vd.w().e()) 如果返回為 false 則會直接打開地圖,否則就會提示異常

這里我們在回調(diào)解包出來的 smali 代碼里,找到 p90 這個文件,找到 d(Context) 這個方法

修改校驗邏輯
smali 語法和 Java 還是有很大差別的,但是我們不需要精通,對應(yīng)這個校驗方法看上去很復(fù)雜,但是我們的需求只不過是讓這個方法返回 true 即可,因此修改如下:

修改之后再按照上面 打包APK 的步驟重新打包就能正常使用了。
資源修改
如果你想要給APP修改為不同的名稱,不同的圖標(biāo)甚至是替換內(nèi)部的圖片,這些就都很簡單了,只需要找到對應(yīng)的圖片、文本資源,直接進行替換就可以了,不需要像修改包名那么復(fù)雜
最終效果
來看下安裝的最終效果吧

文章作者: WangJie0822
文章鏈接: http://www.wangjie0822.top/posts/5569bb54
版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協(xié)議。轉(zhuǎn)載請注明來自 WangJie0822!