当前位置: 首页 > news >正文

如何用 Apktool 解包并重建 APK:从解码到签名的实用实操教程

如何用 Apktool 解包并重建 APK:从解码到签名的实用实操教程

【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool

Apktool 是一款逆向 Android APK 的命令行工具:它能把 APK 里的代码和资源解码成你能直接阅读和修改的形态,再重新打包成可安装的新 APK。本文带你在一条完整流程上走完「解码 → 修改 → 重建 → 签名」。

它解决什么问题

想改一个 App 的某句文案,或者查看它到底申请了哪些权限时,会卡在两道坎上。其一,APK 是个密封的二进制包:里面的 AndroidManifest.xml 是二进制格式,文本编辑器打开就是一堆乱码;程序逻辑则以 .dex 字节码形式存在,人眼读不动。其二,就算你改到了文件,手工把它重新装回一个可安装的 APK(资源重编译、打包、签名、对齐)很容易漏步骤,最后往往装不上。

Apktool 把这两件事一次解决:它负责解码,也负责重建,你只需要改中间那些文本。

五分钟上手

Mac 用户用 Homebrew 直接装;其他系统克隆源码构建(需要 JDK 17 及以上):

brew install apktool

这条命令从 Homebrew 源安装 apktool,装完终端里就能直接调用。

git clone https://gitcode.com/GitHub_Trending/ap/Apktool cd Apktool ./gradlew build shadowJar

第一条把仓库克隆到本地;第二条进入项目目录;第三条构建出一个包含全部依赖的单 jar,产物在 brut.apktool/apktool-cli/build/libs/apktool-cli-all.jar。你可以用java -jar运行它,也可以把 scripts/linux/apktool 这个启动脚本拷到 jar 旁边,之后直接敲apktool即可。

最后验证环境,并解码第一个 APK:

apktool v apktool d sample.apk -o sample_out

第一条打印已安装的版本号,确认环境没问题;第二条把 sample.apk 解码到 sample_out 目录,从此里面都是能直接打开的文本文件。

核心工作流

第一步:如何解包 APK(apktool d)

解码是每次任务的第一步,基本形态:

apktool d <apk文件路径> -o <输出目录> # 示例 apktool d /path/to/app-release.apk -o app_decoded

这条命令把 apk 里的资源和代码反编译回磁盘;不指定输出目录时,默认在与 apk 同名(去掉 .apk 后缀)的目录下生成。常用参数:

参数什么时候用
-s只想看资源,不解码代码(更快)
-r不解码资源,只要 Smali 代码
--only-manifest只解包清单文件,速度最快
-f输出目录已存在,强制清空后重新解码

表里的 Smali 是 Android 的文本化字节码:类似 Java 字节码,但人可以直接阅读和编辑,apktool 把 .dex 还原成 .sm 文件用的就是它。

第二步:读懂解码出来的目录

解码后目录结构是固定的,记住一次就够用:

  • AndroidManifest.xml:App 的「户口本」,权限、组件、版本都写在这里。
  • res/:布局、图片、字符串等资源,全部文本化。
  • smali/(还可能有 smali_classes2/ 等):Smali 代码,一个 dex 对应一个目录。
  • apktool.yml:解码记录,写着包 ID、密度等信息,重建时必需,别删。

第三步:改哪里:文案、权限、Smali

按需挑一处修改:

  • 改文案:打开 res/values/strings.xml,搜到对应字符串直接改。
  • 改权限:打开 AndroidManifest.xml,删掉或修改对应的<uses-permission>行。
  • 改逻辑:打开 smali/ 下目标类的 .sm 文件。Smali 偏汇编级,需要先定位到具体类和方法(配合下文提到的工具定位会快很多)。

解码目录和原始 APK 是两回事,改坏也不影响原始包,删掉重来即可。

第四步:如何完成重建(apktool b)

apktool b <解码目录> -o <输出.apk> # 示例 apktool b app_decoded -o app_rebuilt.apk

这条命令重新编译资源、把 Smali 装配回 .dex,再打包成新 APK。它默认按 apktool.yml 做增量构建,只重建你改动的文件;想强制全量重建就加 -f:

apktool b app_decoded -o app_rebuilt.apk -f

此时 APK 还是「裸包」,没有签名,不能直接安装。

第五步:如何完成签名打包(apksigner)

Android 只认带签名的 APK。先生成一个 keystore(可以理解为存着「私章」的文件),再用 apksigner 签名:

keytool -genkeypair -v -keystore my.keystore -alias mykey -keyalg RSA -validity 10000 apksigner sign --ks my.keystore --ks-key-alias mykey app_rebuilt.apk adb install app_rebuilt.apk

第一条生成 keystore(中途会让你设密码);第二条为 APK 签名;第三条把它装到已连接的手机上。注意重建包与原应用签名不同,需要先卸载原应用,否则安装会报签名冲突。

典型场景实战

场景一:本地化或修正应用文案

场景描述:你想改 App 里的某句提示语,或把部分文案翻译成另一种语言,官方又没提供入口。

具体做法:解码后在 res/values/strings.xml(其他语言在对应 values-xx 目录)里搜到目标句子改掉,再重建签名:

apktool d app.apk -o app_l10n apktool b app_l10n -o app_l10n.apk

实际效果:App 内文案变成你的版本,不用等官方发版;想回滚就删掉解码目录重新解码一次。

场景二:调整应用权限

场景描述:App 申请了一个你不想要的权限(比如读取电话状态),你希望去掉它。

具体做法:解码后打开 AndroidManifest.xml,删除或修改目标<uses-permission android:name="..."/>行,再重建签名。

实际效果:系统权限弹窗里不再出现该权限。但要注意,如果 App 功能依赖这个权限,对应功能可能不可用,所以建议先备份解码目录再动手。

场景三:排查 Smali 代码

场景描述:App 在某个场景崩溃,或你想在某处注入调试输出,需要定位到问题类。

具体做法:先用能生成 Java 视图的反编译工具找到「哪个类哪个方法」,再打开 smali/ 下对应的 .sm 文件做细改。想上真机调试的话,重建时加 --debuggable:

apktool b app_decoded -o app_debug.apk --debuggable

这条命令会在清单里写入 android:debuggable="true",让应用可以被调试器连接。

实际效果:不需要原始源码,也能逐步阅读和修改程序逻辑;代价是 Smali 语法接近汇编,改动要格外小心。

避坑与最佳实践

💡 几条来自真实踩坑的经验:

  • 改之前备份原始 APK 和解码目录,用独立工作目录存放,别和原包混在一起。
  • 别手工删改 apktool.yml,重建靠它找回原始资源 ID,动它等于给重建埋雷。
  • 加了壳、加密的应用别硬解:加固过的包可能直接解码失败,或重建后装上是白屏。
  • 改完资源重建后没生效,先试 -f 强制全量重建,增量构建默认只重编它认为有变化的文件。
  • 3.x 版本不支持 32 位系统,装 64 位 JDK 再构建。

配套工具与延伸阅读

  • apksigner(随 Android SDK 提供):Apktool 只管重建,签名这最后一棒交给它,支持 v2/v3 签名方案。
  • jadx:能把 .dex 读成 Java 层视图,先用它定位要改哪个类,再回到 Smali 细看,效率会高很多。
  • zipalign(同在 build-tools 里):给重建后的 APK 做对齐,部分系统上能改善内存映射效率。

想看全部参数说明,随时在终端敲 apktool h;所有命令行参数都定义在源码 brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java 里,遇到不认识的参数,翻这个文件最直接。

【免费下载链接】ApktoolA tool for reverse engineering Android apk files项目地址: https://gitcode.com/GitHub_Trending/ap/Apktool

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4161110.html

相关文章:

  • 130、双摄/多摄外参标定——视差校正与产线标定工位设计在手机/车载平台的量产实践
  • 利用UU远程实现《我的世界》Java版零门槛联机:无需公网IP与端口映射
  • vue-webtopo-svgeditor:用 3 步把网络拓扑图搬进浏览器的 Vue3 SVG 图形编辑器
  • Git 提交备注修改与合并、回退版本
  • Companion:免费把 700+ 设备塞进一块按键面板
  • AI旅游谁在买单?4类B端用户付费率超35%的ROI分析
  • 计算机考研408虚拟存储器真题精讲:从地址转换到实战解析
  • 从TCP三次握手到守护进程:Linux网络编程实战与日志分析
  • Python的weekday()一出手,星期几立马现原形
  • Java大厂面试通关:核心备战与实战策略
  • Meta Muse视频生成模型:从扩散模型原理到实践上手指南
  • 3 步给 GitHub 界面装中文:GitHub 汉化插件新手完整指南
  • 蓝桥杯国赛真题解析:和与乘积问题的O(n)算法与双指针技巧
  • 如何在手机上畅玩深海舰队 HTML5 版:GotoBrowser 完整功能与上手指南
  • 三步把 NCM 转成 MP3:ncmdump 免费本地无损转换教程
  • 智能汽车软件安全设计1
  • 病媒防控新利器:蚊子种类检测数据集(含YOLOv11n实战)
  • 2026 LLM大模型权威排行榜评测网站指南(持续更新)
  • 【AI接入大模型SDK】云端接入和本地部署模型的区别
  • K-Means、KNN、SVM三大算法原理与实战:从黑盒到白盒的建模指南
  • Win10网速优化全攻略:从诊断到硬件排查的完整解决方案
  • 24V3A欧规电源适配器选型指南:GS认证、纹波与工程实践
  • Linux学习19-moosefs部署与SBD共享磁盘
  • 美赛实战解题逻辑链:从题目翻译到代码实现的五维建模方法论
  • 免训练AI模型Nori:表格数据缺失值填充与预测实战指南
  • 数学建模国赛零基础冲省二:策略、流程与三天实战指南
  • 3 分钟跑通 NBA 官方数据:nba_api 从查到用全解
  • 如何用 PyVISA 让 Python 自动操控 GPIB / USB / TCP/IP 测量仪器
  • untrunc:不重新编码修复损坏 MP4/MOV 视频文件
  • LlamaIndex 系列【4】入门案例(阿里云百炼适配)