Apktool(3)——Apktool的使用

时间:2024-03-13 21:41:19

一.apktool的作用

安卓应用apk文件不仅仅是包含有resource和编译的java代码的zip文件,如果你尝试用解压工具(如好压)解压后,你将会获得classes.dex和resource.arsc等文件。但这些文件对我们来说一无用处。你可以尝试打开AndroidManifest.xml:

image

如果我们有了apktool:输入apktool d testapp.apk
image

再打开AndroidManifest.xml:

image

除了这些,我们还获得了该apk的其他有用资源。

二.apktool命令相关选项(options)说明

1.概要

使用:apktool

(1)-version,--version

查看apktool版本号。

(2)-v,--verbose

使用apktool命令时输出详细内容,该参数必须作为第一个参数。

(3)-q,--quiet

隐藏输出(quiet output),即输出是不显示详细信息,该参数必须作为第一个参数。

(4)-advance,--advances

输出更详细的信息。

2.反编译(decode)

使用:apktool d testapp.apk

(1)--api

产生smail文件的api等级。(??)

(2)-b,--no-debug-info

阻止baksmail写出debug信息。

(3)-d,--debug

在debug模式下decode apk。

(4)--debug-line-prefix

在debug模式下decode时,smali中有行号前缀。

(5)-f,--force

强制删除目标目录,如在再次decode时,删除已经存在的文件夹。强制覆盖存在。

(6)--keep-broken-res

如果存在类似这样的错误:Invalid Config Flags Detected. Dropping Resouerces…,如果加上该选项,则仍然能够通过decode,但需要手动修改文件夹中报错的问题。

(7)-m,--match-original

尽量去保持跟原文件一致或接近,但不能够重新编译打包(rebuild)。

(8)-o,--output <dir>

apk反编译后输出到指定目录

(9)-p,--frame-path <dir>

指定framework文件储存的位置。

(10)-r,--no-res

阻止反编译resource,不修改resources.arsc,若仅仅修改java(smail),建议使用该选项。

(11)-s,--no-src

阻止dex文件分割,在build时仅仅移动classes.dex,若需要快速打包,建议使用该选项。

(12)-t,--frame-tag <TAG>

给生成的framework文件打上标识。

2.编译(rebuild)

使用:apktool b apptest

(1)-a,--aapt

从特殊的位置load appt,不在依赖path。

(2)-c,--copy-original

复制原始的AndroidManifest.xml 和 META-INF文件到apk,可用于保持签名。

(3)-d,--debug

在debug模式下打包。

(4)-f,--force-all

在打包时重写已经存在的文件,强制覆盖。

(5)-o,-output <file>

输出apk的位置和名字。

(6)-p,--frame-path <dir>

保存framework文件到指定目录。

三.重要补充

1.framework文件

一般来说,在用apktool反编译前不需要做其他任何事情,然而有些厂商,如小米,htc,三星等,定制了framework文件并且他们在系统应用中使用了这些文件,因此,为了能够正常反编译这些apk,则必须拷贝反编译apk依赖framework文件。

如,我们尝试编译小米桌面的MiuiHome.apk,将会得到如下错误。

image

 

使用:apktool if/install-framework <framework.apk>

再次尝试反编译MiuiHome.apk

image

2.签名问题

使用apktool b testapp –o out\testapp.apk,不出意外程序就会编译成功,单编译生成的testapp.apk并没有签名,还不能安装测试。一般情况下,保持原始签名不变,使用-c选项来保持。否则就要使用其他的签名工具来对apk签名了,如signapk.jar,auto-sign等。

META-INF包含apk的签名,使用-c/--copy-original来保持签名,使用原始的AndroidManifest.xml文件。但是如果修改AndroidManifest.xml文件,签名也就丢失了。就要重新对其签名。

参考文献:

apktool官方网站:http://ibotpeaches.github.io/Apktool/