一 .番外篇Apktool作用
各位看官们,在上一篇blog中Apktool 手动构建源码需要了解的事情略微提及了Apktool是干嘛的,那么我先给大家详细介绍下。
1.apktool是什么
Apk本质上是一个包含资源和汇编Java代码的压缩(.zip)包,把xx.apk后缀改成xx.zip
解压后会看到classes.dex和resources.arsc等文件。
但这些文件对我们来说没有什么用处完全看不懂,你可以尝试打开AndroidManifest.xml:可以看到如下内容,完全是一脸懵逼 都是什么东西?
AndroidManifest.xml.png此时就是apktool发挥用处的时候了,apktool开源库提供了一系列的命令帮助我们解决这个懵逼的事情
使用apktool d 解码命令后,再次看AndroidManifest.xml 发现清单文件可读性变高,无限接近源码。
同理除了xml,资源(例如.9图,图片,布局,字符串等)也已正确解码为源格式。
apktool d .png
2.framework是什么
安卓应用程序用到了安卓系统自身的代码和资源,这些资源被称为资源框架,Apktool依靠它们来编译和反编译apk操作.
每个Apktool版本在发布时内部都是包含最新的AOSP(安卓开源代码)框架,这样可以解决大部分apk编译与反编译的问题。但是除了一些常规的AOSP文件外,还有定制的系统框架 例如MIUI系统,要针对这些厂商apk使用apktool,必须首先安装厂商的系统框架。
例:你要反编译htc设备上的系统框架,会出现如下错误消息
$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: 1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
遇到这个错误我们需要找到HTC系统框架资源,取出并安装
$ apktool if com.htc.resources.apk
I: Framework installed to: 2.apk
再次尝试反编译命令,发现问题解决了
$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
I: Loading resource table from file: /home/brutall/apktool/framework/2.apk
I: Copying assets and libs...
2.1 如何找到 framework文件
正常情况下在/system/framework,在特殊的设备上可能存在/data/system-framework或者隐藏在/system/app或/system/priv-app中,通常它们命名格式是res或者framework。
示例:HTC有一个名为的框架com.htc.resources.apk,LG有一个名为lge-res.apk
找到系统框架文件后,可以通过adb pull 命令 将文件拉出,拉到本地后,请注意apktool安装方式,安装中框架的命名编号对应着应用程序的pkgId,取值范围1-30.
apktool自带安卓系统框架,该文件会被复制到$home/apktool/framentwork/1.apk路径下
注意::需要确保默认的framework是最新的,apktool会将自带的framework拷贝到默认路径下.
2.2 管理框架文件
根据所使用的操作系统,框架存储在不同位置
- Unix- $HOME/.local/share/apktool
- windows- %UserProfile%\AppData\Local\apktool
- mac os - $HOME/Library/apktool
如果这些目录不可用,则默认创建一个文件夹,也可以通过--frame-path为框架选择一个备用文件夹
由于这些位置可能存在隐藏目录中,这对框架的管理带来了麻烦,你可以执行apktool empty-framework-dir 达到清理framework的目的。
注意:apktool 一旦安装就无法控制框架,但是你可以自由的管理这些文件
二 .Apktool通用命令
- 查看apktool 当前版本
-version ,--version
apktool --version
- 详细输出apktool 命令,该参数必须作为第一个参数
-v,--verbose
apktool -v
- 静默输出,即输出是不显示详细信息,该参数必须作为第一个参数
-q,--quiet
apktool -q
- 命令行每一步操作前,打印详细信息
-advance,--advanced
apktool -advance
三 .清除framework目录时的所有命令。
- 强制删除目标目录
-f,--force
- 指定framework文件储存的位置。
-p,--frame--path <dir>
四.反编译(Decode)时所有命令选项
反编译是什么:即解码 将apk文件拆解成若干文件夹
反编译命令 :apktool d apk路径
例如:apktool d C:\Users\Administrator\Desktop\app.apk
反编译后的生成的文件如下,original \ apktool.yml是apktool生成的临时文件,可忽略
apktool d命令.png- 生成所用smali文件的api等级(默认为 targetSdkVersion)
-api,--api-level <api>
apktool d -api 21 C:\Users\Administrator\Desktop\demo.apk
- 防止baksmali打印出调试信息
-b ,--no--debug-info
apktool d -b C:\Users\Administrator\Desktop\demo.apk
- 强制删除目标文件目录,执行反编译命令时,强制覆盖存在。
-f, --force
apktool d -f C:\Users\Administrator\Desktop\demo.apk
如果当前apk已经反编译过了,在执行apktool d xxx.apk就会出现下图所示,加上-f 命令即可解决
apktool -f.png- 强制反编译AndroidManifest.xml文件 (v2.3.1新增)
--force-manifest
apktool d --force-manifest C:\Users\Administrator\Desktop\demo.apk
- 如果出现"Invalid Config Flags Detected. Dropping Resources..." 错误,你可以添加此命令,可以跳过此错误,但后续你需要手动修复这些错误。
--keep-broken-res
apktool d --keep-broken-res C:\Users\Administrator\Desktop\demo.apk
- 将各文件处理为最接近原生的形式,将会导致不能备重新打包。
-m ,--match-original
apktool d -m C:\Users\Administrator\Desktop\demo.apk
备注:针对这个命令有点迷,前半句说的没错反编译后文件更接近原生的形式,重点在后半句,官网描述这个命令会导致无法重新打包,然而我亲自试了一下重新打包签名后一切正常,一脸懵逼。
demo 2.png这张图片是正常反编译后的清单文件
demo 2.pngdemo.png这张图片是-m 命令反编译后的清单文件,可以清晰的看出执行-m命令后,
的确更接近原生编译器的内容。
- 不处理和拷贝属于 unknown 的资源文件
--no-assets
apktool d --no-assets C:\Users\Administrator\Desktop\demo.apk
- 将反编译后的文件写入到指定的文件路径下(这个命令比较常用)
-o, --output <DIR>
apktool d -f C:\Users\Administrator\Desktop\demo.apk -o C:\Users\Administrator\Desktop\decode
- 反编译根目录中的dex文件(v2.4.1新增)
--only-main-classes
apktool d --only-main-classes C:\Users\Administrator\Desktop\demo.apk
注意:此命令适用于apk 里有加密过后的 dex 文件,比如有些 apk 的 assets 目录下有加密后的 dex 文件,添加 –only-main-classes 参数即可(针对这个异常org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value)
备注:看了下源码这个命令的引用,if (file.startsWith("classes") && file.endsWith(".dex")) { }
反编译根目录下的以 classes 开头,并以 .dex 结尾的dex文件,不仅限于0-9。说白了就是反编译根目录的classes[0-9].dex 文件
- 指定framework文件储存的位置。
-p, --frame-path <DIR>
- 不反编译资源,保留 resources.arsc 为原来的样子,如果你只是需要修改代码,此配置会加快反编译和重新打包的速度。
-r, --no-res
apktool d -r C:\Users\Administrator\Desktop\demo.apk
- 不反编译代码,即不处理 dex文件。如果你只是需要修改资源,此配置会加快反编译和重新打包的速度。
-s, --no-src
apktool d -s C:\Users\Administrator\Desktop\demo.apk
- 给生成的framework文件打上标识
-t, --frame-tag <TAG>
五. 回编(Rebuild)时所有命令
回编是什么:即将解包后的文件重新生成未签名的APK文件(需要重新签名才可被安装使用)
回编命令:apktool b 反编译后的apk文件夹
例如:apktool b C:\Users\Administrator\Desktop\demo
回编后未签名的apk,如果没有用 -o命令 指定新路径,会在默认路径下dist文件
apktool b.png- 从指定的路径加载aapt,指定目录未找到aapt时,会使用apktool自带的aapt进行处理。
-a, --aapt <FILE>
apktool b -a C:\Windows\System32\aapt.exe C:\Users\Administrator\Desktop\demo
- 要建立的smali文件的数字api级别(默认为minSdkVersion) -v2.4.0添加
-api, --api-level <API>
apktool b -api 10 C:\Users\Administrator\Desktop\demo
- 复制原始的AndroidManifest.xml 和 META-INF文件到内置的apk中 (v2.5.0-将弃用)
-c, --copy-origina
apktool b -c C:\Users\Administrator\Desktop\demo
- 添加debuggable="true"到AndroidManifest文件。
-d ,--debug
apktool b -d C:\Users\Administrator\Desktop\demo
- 回编时候强制覆盖存在的文件
-f ,--force-all
apktool b -f C:\Users\Administrator\Desktop\demo
- 回编时禁止对资源文件进行处理 (v2.4.0新增)
-nc ,--no-crunch
apktool b -nc C:\Users\Administrator\Desktop\demo
- 回编时指定生成apk生成路径
-o ,--output<file>
apktool b C:\Users\Administrator\Desktop\demo -o C:\Users\Administrator\Desktop\demo_unsigned.apk
- 从指定位置加载 framework的路径
-p ,--frame-path<dir>
- 使用aapt2进行回编打包(v2.3.2版本新增)
--use-aapt2
apktool b C:\Users\Administrator\Desktop\demo --use-aapt2
声明:
参考文献均来自Apktool 官网文档: https://ibotpeaches.github.io/Apktool/documentation/
结语:
此blog只为记录下apktool常用命令,用到了查下自己blog,不用每次去翻别人的博客,也不用去官网去查英文文档。
网友评论