Apktool回編譯apk遇到的問題及解決方案
阿新 • • 發佈:2019-01-09
背景:
在安卓逆向分析開發中,如果要重組apk,我們經常會使用開源工具apktool進行反編譯,然後重編譯apk。但是,經常會遇到一些奇奇怪怪的問題,導致回編譯失敗。
目的:
該部落格目的在於記錄回編譯apk的時候出現過的問題和解決方案的記錄。
命令:
(前提是你的電腦已經具備了安卓開發環境、同時已下載了apktool並且將apktool配置到環境變數中)
反編譯apk命令:apktool d -f xxx.apk -o 反編譯輸出的目錄
回編譯apk命令:apktool b 需要回編譯的資料夾
問題集合:
問題一
回編譯的時候出現找不到“keyboardNavigationCluster”
Error>W: D:\XX\apk應用包\20180806\ApkDecodeOutput\res\layout-v26\abc_screen_toolbar.xml:5: error: No resource identifier found for attribute 'keyboardNavigationCluster' in package 'android' Error>W: Error>brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\XX\AppData\Local\Temp\brut_util_Jar_2015214293129272673.tmp, p, --forced-package-id, 127, --min-sdk-version, 16, --target-sdk-version, 22, --version-code, 840045722, --version-name, 1.7.0.45722, --no-version-vectors, -F, C:\Users\XX\AppData\Local\Temp\APKTOOL4487408744564026314.tmp, -0, xml, -0, arsc, -0, assets/XXwan_info, -0, assets/XXyyb_data, -0, assets/com.tencent.open.config.json, -0, assets/common_data, -0, json, -0, assets/libwbsafeedit, -0, assets/libwbsafeedit_64, -0, assets/libwbsafeedit_x86, -0, assets/libwbsafeedit_x86_64, -0, assets/manifest, -0, assets/meizu_sdk_data, -0, assets/ngpush_data, -0, assets/ngshare_data, -0, assets/ntshare_data, -0, assets/ntunisdk_common_data, -0, assets/ntunisdk_data, -0, assets/pinyinindex, -0, assets/unisdk_protocol_default_txt, -0, assets/unisdk_qrcode_data, -0, fsb, -0, config, -0, arsc, -I, C:\Users\XX\AppData\Local\apktool\framework\1.apk, -S, D:\XX\apk應用包\20180806\ApkDecodeOutput\res, -M, D:\XX\apk應用包\20180806\ApkDecodeOutput\AndroidManifest.xml]
解決方案:
- 將apktool升級到最新版本(2.3.3就可以了)
- 找到電腦中C盤下的1.apk的路徑,例如:C:\Users\XX\AppData\Local\apktool\framework\1.apk,然後將其刪掉,再重試就可以解決以上問題。
問題二
回編譯的時候,出現dex溢位的情況,該情況出現的情況為,如果手動去融合smali程式碼的話,可能會導致dex溢位的情況。具體的溢位原因為dex中最多的方法數為65536,如果dex中的方法數超過該數的話,會報以下錯誤
Exception in thread "main" org.jf.util.ExceptionWithContext: Unsigned short value out of range: 65765 at org.jf.dexlib2.writer.DexDataWriter.writeUshort(DexDataWriter.java:116) at org.jf.dexlib2.writer.InstructionWriter.write(InstructionWriter.java:329) at org.jf.dexlib2.writer.DexWriter.writeCodeItem(DexWriter.java:1027) at org.jf.dexlib2.writer.DexWriter.writeDebugAndCodeItems(DexWriter.java:803) at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:252) at org.jf.dexlib2.writer.DexWriter.writeTo(DexWriter.java:230) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:61) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:36) at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:404) at brut.androlib.Androlib.buildSources(Androlib.java:335) at brut.androlib.Androlib.build(Androlib.java:291) at brut.androlib.Androlib.build(Androlib.java:263) at brut.apktool.Main.cmdBuild(Main.java:227) at brut.apktool.Main.main(Main.java:84)
解決方案:
- 確認smali資料夾同級目錄下是否有smali_classes2資料夾,如果沒有則建一個smali_classes2資料夾
- 將反編譯得到的smali資料夾中的部分smali程式碼移到smali_classes2資料夾中
- 注意,要保持包名一致,否則執行的時候會找不到類。同時,Application類和在Application類中使用到的類不能移動,同時,該專案必須引入multiDex的jar,並在Application初始化中初始化multiJar,否則低版本的手機會找不到dex2的方法。