Apktool回编译apk遇到的问题及解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/github_39998545/article/details/81484122

背景:

在安卓逆向分析开发中,如果要重组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的方法。
展开阅读全文

没有更多推荐了,返回首页