radar4hooker Android 平臺(tái) Java 工程編譯 + 依賴包合并 + 重命名 + 生成 Dex 文件的自動(dòng)化 Shell 腳本makeDex4linux.sh

radar4hooker/makeDex4linux.sh at master · CreditTone/radar4hooker

腳本代碼逐行深度理解

這是一個(gè)Android 平臺(tái) Java 工程編譯 + 依賴包合并 + 重命名 + 生成 Dex 文件的自動(dòng)化 Shell 腳本,核心用途:把你的 Java 爬蟲/鉤子代碼 + 所有第三方依賴,打包成可在 Android 上運(yùn)行的 Jar 和 Dex 文件。

我會(huì)逐行拆解,并總結(jié)整體流程,新手也能看懂。


一、逐行代碼解釋

1. 清理舊編譯文件

rm -rf classes/
mkdir classes
  • rm -rf classes/:強(qiáng)制刪除舊的classes文件夾(清空之前的編譯產(chǎn)物)
  • mkdir classes:新建空的classes文件夾,存放新的編譯結(jié)果

2. 收集所有 Java 源碼文件

find . -name "*.java">sources.txt
  • 遞歸查找當(dāng)前目錄下所有 .java 后綴的代碼文件
  • 把文件路徑全部寫入sources.txt文本文件,給編譯器批量讀取

3. 核心:編譯 Java 代碼

javac -encoding utf-8 -Xlint:unchecked  -classpath android.jar:android-support-v4.jar:... -d classes @sources.txt

這是Java 編譯命令,參數(shù)含義:

  • javac:Java 編譯器
  • -encoding utf-8:指定編碼為 UTF-8,防止中文亂碼
  • -Xlint:unchecked:開啟未檢查類型轉(zhuǎn)換的警告提示
  • -classpath xxx.jar編譯依賴,告訴編譯器:代碼用到了這些 Android 框架/第三方庫
  • -d classes:編譯后的class 字節(jié)碼文件全部輸出到 classes 文件夾
  • @sources.txt:批量編譯文件里列出的所有 Java 源碼

4. 復(fù)制第三方 Jar 包到編譯目錄

cp nanohttpd-2.3.1.jar classes/
cp okhttp-3.12.6.jar classes/
cp okio-1.15.0.jar classes/
cp fastjson-1.2.9.jar classes/
  • 把網(wǎng)絡(luò)請(qǐng)求、JSON 解析等依賴庫,復(fù)制到classes目錄,為后續(xù)合并做準(zhǔn)備

5. 進(jìn)入編譯目錄,解壓所有 Jar 包

cd classes/
jar xvf nanohttpd-2.3.1.jar
jar xvf okhttp-3.12.6.jar
jar xvf okio-1.15.0.jar
jar xvf fastjson-1.2.9.jar
  • cd classes/:進(jìn)入編譯輸出目錄
  • jar xvf xxx.jar解壓 Jar 包,把所有依賴庫的 class 文件全部解壓出來,和你自己的代碼混在一起

6. 刪除無用 Jar,打包合并所有代碼

rm -rf *.jar
jar cvf merge.jar .
cd ..
  • rm -rf *.jar:刪除已經(jīng)解壓過的 Jar 包
  • jar cvf merge.jar .把當(dāng)前目錄所有文件(你的代碼 + 所有依賴)打包成一個(gè) merge.jar
  • cd ..:回到上級(jí)目錄

7. Jar 包重命名(防沖突)

java -jar jarjar-1.3.jar process rule.txt classes/merge.jar classes/xradar.jar
rm classes/merge.jar
  • 使用jarjar工具:按照rule.txt規(guī)則修改包名,避免和其他項(xiàng)目包名沖突
  • 輸出最終 Jar:xradar.jar
  • 刪除臨時(shí)文件merge.jar

8. 生成 Android 可運(yùn)行的 Dex 文件

alias dx=$ANDROID_HOME/build-tools/30.0.3/dx
dx --dex --output=classes/radar.dex classes/xradar.jar
  • Android 不能直接運(yùn)行標(biāo)準(zhǔn) Jar,必須轉(zhuǎn)成 Dex 格式
  • dx --dex:Android 構(gòu)建工具,把 Jar 轉(zhuǎn)換成 Dex 文件
  • 輸出:radar.dex(給 Hook 工具/Android 設(shè)備直接運(yùn)行)

9. 最終提示

echo "xradar.jar 用于你的爬蟲工程."
echo "radar.dex用于替換hooker根目錄下的radar.dex"

告訴用戶兩個(gè)文件的用途:

  • xradar.jar:給 Java 爬蟲項(xiàng)目做依賴庫
  • radar.dex:替換 Hook 工具里的文件,在 Android 上運(yùn)行

二、整體流程總結(jié)(最核心)

這個(gè)腳本做了5 件大事

  1. 清理 + 收集代碼:找到所有 Java 文件
  2. 編譯代碼:用 Android 依賴庫編譯成 class 文件
  3. 合并 Jar:把你的代碼 + 所有第三方庫,打包成一個(gè)完整 Jar
  4. 重命名防沖突:用 jarjar 修改包名
  5. 生成 Dex:轉(zhuǎn)換成 Android 可執(zhí)行的 Dex 文件

三、這個(gè)腳本的用途

你大概率是在做:

  • Android 爬蟲 / 數(shù)據(jù)采集
  • Android Hook 開發(fā)(Xposed、Frida 相關(guān))
  • Java 代碼打包成 Android 可執(zhí)行文件

它的價(jià)值:一鍵完成編譯、合并、轉(zhuǎn)換,不用手動(dòng)操作。


總結(jié)

  1. 這是自動(dòng)化編譯打包腳本,用于 Android Java 項(xiàng)目
  2. 核心結(jié)果:生成xradar.jar(開發(fā)用)+radar.dex(Android 運(yùn)行用)
  3. 依賴 Android SDK、第三方庫、jarjar 工具
  4. 全程無需人工干預(yù),執(zhí)行腳本即可完成全套流程

rule.txt

rule okhttp3.** gz.okhttp3.@1
rule okio.** gz.okio.@1

結(jié)合之前的Shell腳本和jarjar工具的使用邏輯,這份rule.txtjarjar工具的包名重命名規(guī)則配置文件,核心作用是修改第三方依賴的包名,避免包名沖突,下面分維度詳細(xì)解釋:

一、核心語法解析

jarjar工具的重命名規(guī)則格式為:rule 原包名匹配規(guī)則 新包名模板,其中關(guān)鍵符號(hào)含義:

  • **:通配符,匹配原包名下的所有子包、類、接口(遞歸匹配);
  • @1:占位符,代表匹配到的**對(duì)應(yīng)的所有內(nèi)容,會(huì)原封不動(dòng)映射到新包名中。

對(duì)應(yīng)本次的兩條規(guī)則:

  1. rule okhttp3.** gz.okhttp3.@1:將okhttp3包下的所有內(nèi)容,重命名為gz.okhttp3包下的同名內(nèi)容;
  2. rule okio.** gz.okio.@1:將okio包下的所有內(nèi)容,重命名為gz.okio包下的同名內(nèi)容。

二、具體重命名效果

以實(shí)際類為例,重命名后類的全限定名會(huì)發(fā)生如下變化:

  • okhttp3.OkHttpClientgz.okhttp3.OkHttpClient
  • okhttp3.Requestgz.okhttp3.Request
  • okio.Buffergz.okio.Buffer
  • okio.ByteStringgz.okio.ByteString
  • 包括子包(如okhttp3.internal)也會(huì)同步重命名:okhttp3.internal.Utilgz.okhttp3.internal.Util。

三、為什么要做包名重命名?(核心目的)

這份規(guī)則是為了解決Android開發(fā)中常見的包名/類名沖突問題,結(jié)合你的腳本場(chǎng)景(爬蟲/Hook開發(fā)),原因主要有兩點(diǎn):

  1. 宿主應(yīng)用沖突:你的Hook代碼最終會(huì)運(yùn)行在Android宿主應(yīng)用中,如果宿主應(yīng)用本身已經(jīng)集成了okhttp3/okio庫,且版本和你使用的(okhttp3.12.6、okio1.15.0)不一致,會(huì)出現(xiàn)類加載沖突,導(dǎo)致Hook代碼崩潰;
  2. 工程自身沖突:如果你的爬蟲/Hook工程后續(xù)引入其他依賴,而這些依賴也包含okhttp3/okio,會(huì)出現(xiàn)依賴重復(fù)、版本沖突的問題,重命名后可實(shí)現(xiàn)依賴隔離

簡單說:把第三方庫的包名加上自定義前綴gz.,讓它成為專屬的獨(dú)立包,和其他任何庫都不會(huì)產(chǎn)生命名沖突。

四、和Shell腳本的聯(lián)動(dòng)邏輯

在腳本中這行命令會(huì)加載該規(guī)則并執(zhí)行重命名:

java -jar jarjar-1.3.jar process rule.txt classes/merge.jar classes/xradar.jar

執(zhí)行流程為:

  1. jarjar工具讀取rule.txt中的兩條重命名規(guī)則;
  2. 對(duì)merge.jar(你的代碼+所有解壓的第三方類)中的okhttp3/okio相關(guān)類執(zhí)行包名重命名;
  3. 將重命名后的所有內(nèi)容重新打包為xradar.jar,最終生成的radar.dex也會(huì)沿用重命名后的包名。

補(bǔ)充:jarjar的作用邊界

本次規(guī)則僅重命名了okhttp3okio,而腳本中還集成了nanohttpdfastjson,說明這兩個(gè)庫在目標(biāo)運(yùn)行環(huán)境(Hook宿主/爬蟲工程)中無沖突風(fēng)險(xiǎn),因此無需配置重命名規(guī)則。如果后續(xù)出現(xiàn)沖突,只需在rule.txt中新增對(duì)應(yīng)規(guī)則即可,格式與現(xiàn)有兩條一致。

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

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

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