Android反編譯:手把手教你制作高德地圖車機共存版

高德地圖車機版

前言

去年年底提了新車,這車什么都好就是自帶的高德地圖版本太低了,在高德地圖已經(jīng)進入6.x的時代,車機上自帶的才4.x,更重要的是不支持升級,從高德官網(wǎng)下載的車機版安裝提示簽名不同,覆蓋安裝又沒有權(quán)限,就很難受,好在高德官方論壇里面有很多大佬都有提供共存版本,非常好用。

但是,作為一個Android開發(fā)人員,怎能如此沒有追求,當(dāng)然得自己造一個出來啊。

前期準(zhǔn)備

首先需要感謝的是高德地圖的APK沒有進行加固,這大大減輕了我們反編譯的工作量,為此我們需要以下工具:

  1. apktools.jar 用于對apk進行反編譯及重新打包 官方地址

    注意:這里的 apktools.jar 不建議使用最新版本,最新版本存在無法恢復(fù)打包問題,使用 2.6.0 版本即可。

  2. jadx 用于打開apk文件,查看其中源碼 官方地址

由于部分網(wǎng)站可能被墻無法訪問,可以選擇從我打包好的云盤下載

當(dāng)然,最后還不能忘了下載 高德地圖車機版

最終環(huán)境結(jié)構(gòu)如下:

文件結(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)前路徑,并通過 dex2jardex 文件轉(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

權(quán)限
內(nèi)容提供者

生成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格式的

SMALI文件

一個簡單的類被拆成了這么多,并且對應(yīng)smali代碼我們也不熟悉,更重要的是smali中的中文都被編碼了,排查起來更加困難,這個時候 jadx 就派上了用場

定位校驗邏輯

打開 jadx 并將AUTO_V6.1.0.600644_release_signed.apk 拖拽到窗口里,我們很快找到啟動 Activity 的代碼

FILLACTIVITY

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

錯誤信息

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

調(diào)用地點

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

跳轉(zhuǎn)地圖

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

校驗代碼

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

關(guān)鍵方法

修改校驗邏輯

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!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容