美文网首页
Apktool 命令大全,不全你来打我

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

作者: 北京朝阳区精神病院院长 | 来源:发表于2020-08-11 16:28 被阅读0次

    一 .番外篇Apktool作用

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

    1.apktool是什么

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

    apk.zip.png

    但这些文件对我们来说没有什么用处完全看不懂,你可以尝试打开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通用命令

    1. 查看apktool 当前版本

    -version ,--version

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

    -v,--verbose

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

    -q,--quiet

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

    -advance,--advanced

    apktool  -advance
    

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

    1. 强制删除目标目录

    -f,--force

    1. 指定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
    1. 生成所用smali文件的api等级(默认为 targetSdkVersion)

    -api,--api-level <api>

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

    -b ,--no--debug-info

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

    -f, --force

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

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

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

    --force-manifest

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

    --keep-broken-res

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

    -m ,--match-original

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

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

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

    demo 2.png

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

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

    --no-assets

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

    -o, --output <DIR>

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

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

    -r, --no-res

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

    -s, --no-src

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

    -t, --frame-tag <TAG>

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

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

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

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

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

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

    -a, --aapt <FILE>

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

    -api, --api-level <API>

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

    -c, --copy-origina

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

    -d ,--debug

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

    -f ,--force-all

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

    -nc ,--no-crunch

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

    -o ,--output<file>

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

    -p ,--frame-path<dir>

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

    相关文章

      网友评论

          本文标题:Apktool 命令大全,不全你来打我

          本文链接:https://www.haomeiwen.com/subject/vbckdktx.html