Apktool 参数详解

上一篇 Apktool 使用教程 - 简书 简单说明了以下 apktool 的基本使用。能够反编译和重新打包一个apk了。

如果你学会了使用 -d ,-b 进行apk的反编译和重新打包。

那么恭喜你!apktool你已经学会了90%的使用了,你也能够反编译绝大多数的apk了。

但事情总有小小的例外,有那么一些apk它就是不让你如愿。比如加固过的,或者一些厂商的系统应用,它们依赖了一些系统特有的resource,你不得不进行特殊处理,才能成功的反编译,甚至有时候需要你去修改apktool的源码。

所以,这一篇文章就是告诉你那些你平时可能不注意的小细节,不常用的参数到底有什么用。

注意:本文所用apktool版本为,2.4.1。

官网介绍:Apktool - Documentation

1、-d 反编译

apktool d bar.apk -o baz

apktool decode bar.apk -o baz

你可以使用-o来指定反编译的输出目录,如上命令为 反编译 bar.apk 到 baz 目录,也可以使用绝对路径,输出到任意目录。

decode 和 d 以及 -d 等效。

2、-b 打包apk

apktool b bar -o new_bar.apk

apktool build bar -o new_bar.apk

你可以使用-o来指定重新打包的输出目录,如上命令为 重新编译bar目录下的结构到 new_bar.apk,也可以使用绝对路径,输出到任意目录。

build 和 b 以及 -b 等效。

3、if or install-framework 安装 framework

(1)apktool if framework-res.apk

安装 framework-res.apk 到默认目录,默认目录如下:

        unix - $HOME/.local/share/apktool

        windows - %UserProfile%\AppData\Local\apktool

        mac - $HOME/Library/apktool

(2)apktool if com.htc.resources.apk -t htc

安装 framework-res.apk 到默认目录,并添加tag标记,最终可能生成 2-htc.apk,前序的数字,由所安装的framework的pkgId决定。个人理解pkgId是所安装的 framework 的apk中的Manifest中的package字段值。

(3)apktool if framework-res.apk -t baz -p foo/bar

安装 framework-res.apk 到 -p 指定的目录,并添加tag标记,最终可能在 foo/bar 目录下生成 2-htc.apk

安装framework的作用,是让apktool能够识别一些厂商自定义的属性或resource,否则将反编译失败。

每一个版本的apktool都会自带有最新AOSP的framework,能支持绝大多数的apk反编译。当需要特殊的framework时,如何寻找相应的framework,请参阅apktool文档中的内容,此处不再详述。

如何找到framework


(4)注意:你需要自己确保默认的framework是最新的

apktool会将自带的framework拷贝到默认路径下,各平台默认路径,请参考上文。

但是,当你升级apktool之后,最好是去掉默认路径下的framework,让apktool自动安装最新的(自带的)framework。

同时,当默认路径不可用(通常是无权限)时,apktool会使用 /tmp 目录,但是此目录通常都不稳当,你可以使用 --frame-path(也就是上文提到的 -p ) 指定一个其他的稳定的目录。

从2.2.1版本开始,apktool加入了相应的命令,可以完成此操作。 

apktool empty-framework-dir 

命令会清除framework目录下的所有已安装的framework

(5)apktool不会判断framework是否重复安装了,你可以任意安装

4、使用指定的framework进行反编译

当你安装了不同的framework,并且其中一些framework可能是互不兼容的,那么你在反编译的时候需要指定使用相应的framework。

安装不同的framework,并指定tag

使用指定的framework进行反编译,注意查看log中的区别。

使用不同的framework进行反编译

同时需要说明的是,当你使用了指定的framework进行反编译后,想要重新打包apk时,不需要再进行framework的指定了,apktool会自动使用反编译时使用的framework进行重新打包。

5、关于.9图的问题

谷歌官方文档上有.9图的说明,但是说漏了一些东西。

.9图有两种存在形式,一种是"源码"形式,一种是经过编译处理的形式。

"源码"形式很容易得到,我们平时写apk所用的到就是这种形式,网上也能方便的找到。而apk中的.9图,是经过编译处理后的图。

"源码"形式的.9图,带有透明的边框,而编译后的.9图,不再存在这种透明边框,编译后的图存在一种叫做 npTc 数据块的结构中。你不能方便的查看和修改它,但是Android系统可以更快的读取和使用它。

以上的情况就会导致,apktool不能直接去修改.9图,而需要依赖谷歌官方的工具 -- aapt进行处理。

6、Options

    常用的配置

(1)-version, --version

    输出当前工具版本

(2)-v, --verbose

    输出所有log,此参数必须放在第一位

(3)-q, --quiet

    静默模式,与 -v, --verbose 相反,此参数必须放在第一位

(4)-advance, --advanced

    进行每一步操作前,打印相应log。默认开启。


    清空framework的配置

(1)-f, --force

    强制清除目标目录

(2)-p, --frame-path <DIR>

    指定加载framework的目录

    反编译的配置

(1)-api, --api-level <API>

    指定生成smali文件所用的api等级,默认使用targetSdkVersion版本

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

    防止baksmali写出调试信息(.local,.param,.line等)。如果您要比较来自不同版本的同一APK的smali,则首选使用。

(3)-f, --force

    如果反编译的目标目录存在,将会被强制清空

(4)--force-manifest 

    强制反编译 AndroidManifest.xml文件,优先级高于 -s, --no-src 配置。

(5)--keep-broken-res

    如果出现 "Invalid Config Flags Detected. Dropping Resources..." 错误,这表示apk中有apktool不能识别的结构。可能是apktool不支持的更新的api版本,亦或者是该apk为不规则的apk。你可以添加此配置,以跳过错误,但后续你需要手动修复这些错误。

(6)-m, --match-original

    将各文件处理为最接近原生的形式,将会导致不能备重新打包。

    Ps:我试了下,格式确实更接近原生,但是我重新打包也是成功了(打包成功,但并未签名安装)。

(7)--no-assets

    不处理和拷贝属于 unknown 的资源文件。

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

    指定输出目录

(9)--only-main-classes

    只反编译apk根目录下的dex文件,如:classes[0-9].dex

    通过阅读源码发现,此配置的作用为:反编译根目录下的以 classes 开头,并以 .dex 结尾的dex文件,不仅限于0-9

(10)-p, --frame-path <DIR>

    指定存储和加载framework的目录

(11)-r, --no-res

    不反编译资源,保留 resources.arsc 为原来的样子,如果你只是需要修改代码,此配置会加快反编译和重新打包的速度。

(12)-s, --no-src

    不反编译代码,即不处理 dex文件。如果你只是需要修改资源,此配置会加快反编译和重新打包的速度。

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

    使用指定的framework进行反编译,前文有述。

    重新打包配置

(1)-a, --aapt <FILE>

    指定使用的aapt,当指定目录未找到aapt时,会使用apktool自带的aapt进行处理。

(2)-api, --api-level <API>

    指定处理smali文件的api版本,默认使用minSdkVersion版本

(3)-c, --copy-original

     拷贝原始 AndroidManifest.xml and META-INF 到apk包体中。将会在2.5.0版本移除此功能。

(4)-d, --debug

     在 AndroidManifest 加入 debuggable="true" 配置

        此配置,不会覆盖已经存在的debuggable配置。

(5)-f, --force-all

    当生成的文件存在时,进行强制覆盖

(6)-nc,--no-crunch

    此配置会传递给aapt,参阅:

    Expose the aapt --no-crunch option by Novex · Pull Request #1849 · iBotPeaches/Apktool · GitHub

    aapt build in apktool is not support new options · Issue #1232 · iBotPeaches/Apktool · GitHub

    禁止对资源文件的处理

(7)-o, --output <FILE>

    指定apk的输出目录

(8)-p, --frame-path <DIR>

    指定加载framework的路径

(9)--use-aapt2

    使用aapt2进行打包


以上就是apktool目前支持的所有配置,下一篇文章,将会进一步深入源码,去看看apktool到底都做了些什么。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容