您的位置:首页 > 其它

Apktool 命令大全,不全你来打我

2020-08-11 16:46 239 查看

一 .番外篇Apktool作用

各位看官们,在上一篇blog中Apktool 手动构建源码需要了解的事情略微提及了Apktool是干嘛的,那么我先给大家详细介绍下。

1.apktool是什么

Apk本质上是一个包含资源和汇编Java代码的压缩(.zip)包,把xx.apk后缀改成xx.zip
解压后会看到classes.dex和resources.arsc等文件。

但这些文件对我们来说没有什么用处完全看不懂,你可以尝试打开AndroidManifest.xml:可以看到如下内容,完全是一脸懵逼 都是什么东西?

此时就是apktool发挥用处的时候了,apktool开源库提供了一系列的命令帮助我们解决这个懵逼的事情

使用apktool d 解码命令后,再次看AndroidManifest.xml 发现清单文件可读性变高,无限接近源码

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通用命令

  1. 查看apktool 当前版本

    -version ,–version

    apktool  --version
  2. 详细输出apktool 命令,该参数必须作为第一个参数

    -v,–verbose

    apktool  -v
  3. 静默输出,即输出是不显示详细信息,该参数必须作为第一个参数

    -q,–quiet

    apktool  -q
  4. 命令行每一步操作前,打印详细信息

    -advance,–advanced

    apktool  -advance

三 .清除framework目录时的所有命令。

  1. 强制删除目标目录

    -f,–force

  2. 指定framework文件储存的位置。

    -p,–frame–path


四.反编译(Decode)时所有命令选项

反编译是什么:即解码 将apk文件拆解成若干文件夹

反编译命令 :apktool d apk路径

例如:apktool d C:\Users\Administrator\Desktop\app.apk

反编译后的生成的文件如下,original \ apktool.yml是apktool生成的临时文件,可忽略

  1. 生成所用smali文件的api等级(默认为 targetSdkVersion)

    -api,–api-level

    apktool  d   -api  21   C:\Users\Administrator\Desktop\demo.apk
  2. 防止baksmali打印出调试信息

    -b ,–no–debug-info

    apktool   d    -b  C:\Users\Administrator\Desktop\demo.apk
  3. 强制删除目标文件目录,执行反编译命令时,强制覆盖存在。

    -f, --force

    apktool  d  -f   C:\Users\Administrator\Desktop\demo.apk

如果当前apk已经反编译过了,在执行apktool d xxx.apk就会出现下图所示,加上-f 命令即可解决

  1. 强制反编译AndroidManifest.xml文件 (v2.3.1新增)

    –force-manifest

    apktool   d    --force-manifest      C:\Users\Administrator\Desktop\demo.apk
  2. 如果出现"Invalid Config Flags Detected. Dropping Resources…" 错误,你可以添加此命令,可以跳过此错误,但后续你需要手动修复这些错误。

    –keep-broken-res

    apktool   d    --keep-broken-res    C:\Users\Administrator\Desktop\demo.apk
  3. 将各文件处理为最接近原生的形式,将会导致不能备重新打包。

    -m ,–match-original

    apktool   d    -m      C:\Users\Administrator\Desktop\demo.apk

备注:针对这个命令有点迷,前半句说的没错反编译后文件更接近原生的形式,重点在后半句,官网描述这个命令会导致无法重新打包,然而我亲自试了一下重新打包签名后一切正常,一脸懵逼。

demo 2.png这张图片是正常反编译后的清单文件

demo.png这张图片是-m 命令反编译后的清单文件,可以清晰的看出执行-m命令后,
的确更接近原生编译器的内容。

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

    –no-assets

    apktool   d    --no-assets   C:\Users\Administrator\Desktop\demo.apk
  2. 将反编译后的文件写入到指定的文件路径下(这个命令比较常用)

    -o, --output

    apktool   d    -f   C:\Users\Administrator\Desktop\demo.apk  -o    C:\Users\Administrator\Desktop\decode
  3. 反编译根目录中的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 文件

  1. 指定framework文件储存的位置。

    -p, --frame-path

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

    -r, --no-res

    apktool   d    -r   C:\Users\Administrator\Desktop\demo.apk
  3. 不反编译代码,即不处理 dex文件。如果你只是需要修改资源,此配置会加快反编译和重新打包的速度。

    -s, --no-src

    apktool   d    -s   C:\Users\Administrator\Desktop\demo.apk
  4. 给生成的framework文件打上标识

    -t, --frame-tag


五. 回编(Rebuild)时所有命令

回编是什么:即将解包后的文件重新生成未签名的APK文件(需要重新签名才可被安装使用)

回编命令:apktool b 反编译后的apk文件夹

例如:apktool b C:\Users\Administrator\Desktop\demo

回编后未签名的apk,如果没有用 -o命令 指定新路径,会在默认路径下dist文件

  1. 从指定的路径加载aapt,指定目录未找到aapt时,会使用apktool自带的aapt进行处理。

    -a, --aapt

    apktool  b  -a   C:\Windows\System32\aapt.exe     C:\Users\Administrator\Desktop\demo
  2. 要建立的smali文件的数字api级别(默认为minSdkVersion) -v2.4.0添加

    -api, --api-level

    apktool  b    -api     10   C:\Users\Administrator\Desktop\demo
  3. 复制原始的AndroidManifest.xml 和 META-INF文件到内置的apk中 (v2.5.0-将弃用)

    -c, --copy-origina

    apktool  b   -c     C:\Users\Administrator\Desktop\demo
  4. 添加debuggable="true"到AndroidManifest文件。

    -d ,–debug

    apktool  b     -d    C:\Users\Administrator\Desktop\demo
  5. 回编时候强制覆盖存在的文件

    -f ,–force-all

    apktool  b    -f     C:\Users\Administrator\Desktop\demo
  6. 回编时禁止对资源文件进行处理 (v2.4.0新增)

    -nc ,–no-crunch

    apktool  b   -nc   C:\Users\Administrator\Desktop\demo
  7. 回编时指定生成apk生成路径

    -o ,–output

    apktool  b    C:\Users\Administrator\Desktop\demo  -o C:\Users\Administrator\Desktop\demo_unsigned.apk
  8. 从指定位置加载 framework的路径

    -p ,–frame-path

  9. 使用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,不用每次去翻别人的博客,也不用去官网去查英文文档。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: