1. 程式人生 > >Apktool回編譯apk遇到的問題及解決方案

Apktool回編譯apk遇到的問題及解決方案

背景:

在安卓逆向分析開發中,如果要重組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]

解決方案:

  1. 將apktool升級到最新版本(2.3.3就可以了)
  2. 找到電腦中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)

解決方案:

  1. 確認smali資料夾同級目錄下是否有smali_classes2資料夾,如果沒有則建一個smali_classes2資料夾
  2. 將反編譯得到的smali資料夾中的部分smali程式碼移到smali_classes2資料夾中
  3. 注意,要保持包名一致,否則執行的時候會找不到類。同時,Application類和在Application類中使用到的類不能移動,同時,該專案必須引入multiDex的jar,並在Application初始化中初始化multiJar,否則低版本的手機會找不到dex2的方法。