字段到底管什么:從反編譯到重打包的完整解讀)
apktool.yml 里那 7 個(gè)字段到底管什么從反編譯到重打包的完整解讀【免費(fèi)下載鏈接】ApktoolA tool for reverse engineering Android apk files項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ap/Apktool您運(yùn)行apktool d xxx.apk之后輸出目錄最顯眼的一個(gè)文件不是 smali 或 res而是一份短短的apktool.yml。很多人直接忽略它直到b命令重打包時(shí)報(bào)錯(cuò)、或者資源 ID 對(duì)不上才回頭查。這個(gè)文件由 Apktool 生成并持久化它就是 Apktool 保存 APK 元數(shù)據(jù)的方式記錄了反編譯時(shí)發(fā)現(xiàn)的框架依賴、SDK 版本、資源包信息和壓縮策略重打包時(shí)工具會(huì)重新讀入它來決定怎么重建 APK。本文把這份文件從頭到尾拆開講每個(gè)字段什么含義、哪些值能動(dòng)、哪些絕對(duì)別碰。apktool.yml 是怎么生成的這一節(jié)回答文件從哪來、什么時(shí)候會(huì)被再讀。反編譯階段ApkDecoder解析 APK 后把結(jié)果填進(jìn) ApkInfo.java 這個(gè)類然后調(diào)用它的save()方法寫成 YAML重打包時(shí)ApkBuilder則調(diào)用ApkInfo.load(反編譯目錄)讀回。整個(gè)過程您不需要手動(dòng)參與但要知道一點(diǎn)這個(gè)文件是單向依賴的——?jiǎng)h掉它再重打包工具只能按默認(rèn)值猜結(jié)果往往不符合預(yù)期。七個(gè)頂層字段逐一對(duì)照這是全文核心。下表把a(bǔ)pktool.yml的全部頂層鍵整理出來按改動(dòng)風(fēng)險(xiǎn)從高到低排序字段含義示例值能不能改version生成該文件的 Apktool 版本2.8.1不建議改版本不匹配時(shí)解析行為可能變化apkFileName原始 APK 文件名standard.apk可改純記錄性質(zhì)usesFramework框架依賴ids是框架 ID 列表tag是系統(tǒng)應(yīng)用標(biāo)簽ids: [1]改 ID 前必須確認(rèn)本機(jī)有對(duì)應(yīng)框架否則打包失敗usesLibrary第三方共享庫列表常見為空為空時(shí)不寫出按需增刪sdkInfominSdkVersion/targetSdkVersion/maxSdkVersion三項(xiàng)25 / 30可以改但需與 manifest 保持一致versionInfoversionCode與versionName取自 manifest-1 / null讀不到時(shí)建議同步修改 manifest 中的同名屬性resourcesInfo資源包packageId通常 127、包名、sparseEntries標(biāo)志127packageId 改動(dòng)極易引發(fā)資源引用失效doNotCompress打包時(shí)不壓縮的擴(kuò)展名或文件列表arsc、png可安全增刪其中兩個(gè)子對(duì)象值得多看一眼。sdkInfo的字段在 SdkInfo.java 中定義除了純數(shù)字還支持M、N、Q這類代號(hào)寫法構(gòu)建時(shí)會(huì)統(tǒng)一換算成 API 等級(jí)另外當(dāng) min、max、target 三者矛盾時(shí)重打包用的是被夾在 min/max 中間的那個(gè) target 值。usesFramework的tag非 null 時(shí)說明這是一個(gè)系統(tǒng)應(yīng)用overlay 或系統(tǒng)擴(kuò)展重打包需要對(duì)應(yīng)的框架環(huán)境。一份真實(shí)文件長(zhǎng)什么樣下面是倉(cāng)庫測(cè)試資源里的兩個(gè)真實(shí)樣例。左邊是最簡(jiǎn)形態(tài)——很多字段為空時(shí)干脆不出現(xiàn)在文件里這也是新手常見的困惑為什么我的 yml 里連sdkInfo都沒有因?yàn)樵?APK 的 manifest 里就沒寫。右邊字段齊全可以看到列表項(xiàng)用 4 空格縮進(jìn)的寫法同樣合法# 最簡(jiǎn)樣例src/test/resources/meta/standard.yml apkFileName: standard.apk doNotCompress: - arsc resourcesInfo: packageId: 127 packageName: null sparseEntries: false sdkInfo: minSdkVersion: 25 targetSdkVersion: 30 usesFramework: ids: - 1 tag: null version: 2.8.1 versionInfo: versionCode: -1 versionName: null您想改字段時(shí)最容易踩的四個(gè)坑這一節(jié)只講改壞了會(huì)怎樣。packageId動(dòng)了資源全亂。resourcesInfo.packageId是 smali 里0x7f...常量與資源表之間的橋梁改成非 127 且不同步修改資源表時(shí)運(yùn)行期找不到資源是常規(guī)結(jié)局。doNotCompress漏了arsc。把resources.arsc壓縮進(jìn) zip部分機(jī)型讀取資源會(huì)失敗。反編譯時(shí)若原包以 stored 方式存放 arsc這里必有arsc手動(dòng)刪掉等于自找問題。versionCode改成 0 或負(fù)數(shù)。升級(jí)安裝場(chǎng)景下 versionCode 必須大于舊版本-1是原 manifest 讀不到的占位值直接帶著它打包等于沒設(shè)置。version字段改成別的版本號(hào)。它記錄的是寫出這份文件的 Apktool 版本不是 APK 的版本。改成與本機(jī) apktool 不一致的值不會(huì)報(bào)錯(cuò)但跨版本序列化時(shí)新增字段可能被忽略。重打包前必查的三項(xiàng)動(dòng)手執(zhí)行apktool b之前花十秒核對(duì)這三點(diǎn)能避免絕大多數(shù)詭異報(bào)錯(cuò)usesFramework.ids與本機(jī)1框架一致apktool ifp可查看框架安裝情況sdkInfo三個(gè)值滿足 min ≤ target ≤ max且與修改后的 AndroidManifest.xml 一致doNotCompress包含arsc以及您新加入的不壓縮文件類型。核對(duì)無誤后再打包若仍失敗錯(cuò)誤日志里通常會(huì)點(diǎn)名是哪個(gè)階段出問題回到本文的字段表對(duì)照定位即可。小結(jié)apktool.yml是 Apktool 在反編譯與重打包之間傳遞 APK 元數(shù)據(jù)的唯一載體七個(gè)頂層字段分別管版本、文件名、框架、庫、SDK、應(yīng)用版本和資源包信息。它不該被刪除改動(dòng)前先用本文的字段表確認(rèn)風(fēng)險(xiǎn)重打包前過一遍上面三項(xiàng)檢查這份小小的 YAML 就不會(huì)再給您添堵。【免費(fèi)下載鏈接】ApktoolA tool for reverse engineering Android apk files項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ap/Apktool創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考