Skill: killgfat/apktool (version 0.0.2)

--- name: apktool description: 反向工程 Android APK 文件的命令行工具 homepage: https://apktool.org metadata: { "openclaw": { "requires": { "bins": ["apktool", "java", "jadx"] }, "install": [ { "id": "apt", "kind": "apt", "package": "apktool", "label": "安装 Apktool (Debian/Ubuntu)", "platforms": ["linux-debian", "linux-ubuntu"], }, { "id": "brew", "kind": "brew", "package": "apktool", "label": "安装 Apktool (macOS Homebrew)", "platforms": ["macos"], }, { "id": "jadx", "kind": "manual", "package": "jadx", "label": "安装 JADX (Android dex 反编译器)", "script": "cd /tmp && curl -L -o jadx.zip https://github.com/skylot/jadx/releases/download/v1.5.0/jadx-1.5.0.zip && unzip -o jadx.zip && mkdir -p /opt/jadx && cp -r lib /opt/jadx/ && cp bin/jadx /opt/jadx/ && sed -i 's|APP_HOME=\".*\"|APP_HOME=\"/opt/jadx\"|g' /opt/jadx/jadx && ln -sf /opt/jadx/jadx /usr/local/bin/jadx", }, ], }, } --- # Apktool 技能 🔧 **反向工程 Android APK 文件的命令行工具** --- ## 📦 依赖声明 ### 必需二进制文件 - `apktool` - Android APK 反向工程工具 - `java` - Java 运行时（Apktool 基于 Java） ### 检查依赖 ```bash # 检查 apktool 是否已安装 which apktool apktool --version # 检查 Java 是否已安装 java -version ``` ### 安装指引 如未安装，请阅读 [`references/install.md`](./references/install.md) 获取详细安装步骤。 --- ## 🎯 核心功能 - **反编译（Disassemble）** - 将 APK 解码为近乎原始形式（smali 代码、资源文件） - **编译（Assemble）** - 将修改后的代码和资源重新打包为 APK - **分析（Analyze）** - 快速检查资源清单和配置文件，无需重建 --- ## 🚀 快速开始 ### 反编译 APK ```bash # 基本反编译 apktool d app.apk # 指定输出目录 apktool d app.apk -o output_folder # 仅分析不生成文件（-m 模式） apktool d app.apk -m ``` ### 重新编译 APK ```bash # 编译反编译后的文件夹 apktool b app_folder # 指定输出 APK 路径 apktool b app_folder -o modified_app.apk ``` ### 典型工作流 ```bash # 1. 反编译 apktool d target.apk -o target_decompiled # 2. 修改资源或代码 # 编辑 target_decompiled/ 中的文件 # 3. 重新编译 apktool b target_decompiled -o target_modified.apk # 4. 签名 APK（需要额外工具） # apksigner 或 jarsigner ``` --- ## 📚 详细文档 | 主题 | 文档 | |------|------| | 🔧 安装指南 | [`references/install.md`](./references/install.md) | | 📖 完整用法 | [`references/usage.md`](./references/usage.md) | | 🛠️ 常见问题 | [`references/troubleshooting.md`](./references/troubleshooting.md) | --- ## 🔐 安全提示 - **合法使用** - 仅对您拥有权限的 APK 进行反向工程 - **学习研究** - 适用于安全研究、应用分析、本地化翻译等合法用途 - **遵守法律** - 请勿用于侵犯版权或绕过软件保护 --- ## 🤝 使用示例 ### 示例 1：查看 APK 结构 ```bash # 快速分析 APK 结构（不生成文件） apktool d app.apk -m # 查看 AndroidManifest.xml cat apktool.yml ``` ### 示例 2：修改应用资源 ```bash # 反编译 apktool d myapp.apk # 修改 res/values/strings.xml 进行本地化 # 编辑文件... # 重新编译 apktool b myapp -o myapp_localized.apk ``` ### 示例 3：分析权限配置 ```bash # 反编译并查看 AndroidManifest.xml apktool d target.apk -m cat target/AndroidManifest.xml | grep permission ``` --- ## 💡 提示 - 反编译后的代码为 **smali** 格式（Android 的汇编语言） - 如需 Java 源代码，可配合 **jadx** 工具使用 - 修改后的 APK 需要**重新签名**才能安装到设备 - 大型 APK 反编译可能需要数分钟 --- **版本**: 0.0.2 **最后更新**: 2026-02-28

path: references/install.md
content: # Apktool 安装指南

📦 **完整安装步骤和配置说明**

---

## 🎯 概述

Apktool 是一个用于反向工程 Android APK 文件的工具。它需要 Java 运行时环境。

### 系统要求

- Java 8 或更高版本
- 50MB 可用磁盘空间
- Linux / macOS / Windows

---

## 📋 安装方法

### 方法一：包管理器安装（推荐 ⭐）

#### Debian/Ubuntu

```bash
# 安装 Java（如未安装）
sudo apt-get update
sudo apt-get install -y openjdk-11-jdk

# 安装 Apktool
sudo apt-get install -y apktool

# 验证安装
apktool --version
```

#### Arch Linux

```bash
sudo pacman -S apktool
```

#### macOS (Homebrew)

```bash
# 安装 Java
brew install openjdk

# 安装 Apktool
brew install apktool

# 验证安装
apktool --version
```

---

### 方法二：手动安装（最新稳定版）

#### 步骤 1：下载 Apktool

```bash
# 创建安装目录
sudo mkdir -p /opt/apktool
cd /opt/apktool

# 下载最新版本的 wrapper 脚本和 jar 文件
# 从官方 GitHub releases 获取
sudo wget -O apktool.jar https://github.com/iBotPeaches/Apktool/releases/download/v3.0.1/apktool_3.0.1.jar
sudo wget -O apktool https://github.com/iBotPeaches/Apktool/releases/download/v3.0.1/apktool_3.0.1
```

#### 步骤 2：设置执行权限

```bash
sudo chmod +x /opt/apktool/apktool
```

#### 步骤 3：创建符号链接

```bash
# 添加到系统路径
sudo ln -sf /opt/apktool/apktool /usr/local/bin/apktool

# 验证
which apktool
apktool --version
```

---

### 方法三：使用脚本自动安装

```bash
#!/bin/bash
# install-apktool.sh

set -e

INSTALL_DIR="/opt/apktool"
APKTOOL_VERSION="3.0.1"

echo "🔧 开始安装 Apktool ${APKTOOL_VERSION}..."

# 检查 Java
if ! command -v java &> /dev/null; then
    echo "❌ Java 未安装，请先安装 Java"
    exit 1
fi

# 创建目录
sudo mkdir -p ${INSTALL_DIR}
cd ${INSTALL_DIR}

# 下载文件
echo "📥 下载 Apktool..."
sudo wget -q --show-progress -O apktool.jar \
    https://github.com/iBotPeaches/Apktool/releases/download/v${APKTOOL_VERSION}/apktool_${APKTOOL_VERSION}.jar
sudo wget -q --show-progress -O apktool \
    https://github.com/iBotPeaches/Apktool/releases/download/v${APKTOOL_VERSION}/apktool_${APKTOOL_VERSION}

# 设置权限
sudo chmod +x apktool

# 创建链接
sudo ln -sf ${INSTALL_DIR}/apktool /usr/local/bin/apktool

echo "✅ Apktool 安装完成！"
apktool --version
```

保存为 `install-apktool.sh`，然后运行：

```bash
chmod +x install-apktool.sh
sudo ./install-apktool.sh
```

---

## 🔍 验证安装

### 检查版本

```bash
apktool --version
```

预期输出：`3.0.1`（或安装的版本）

### 测试基本功能

```bash
# 创建一个测试目录
mkdir -p /tmp/apktool-test

# 查看帮助
apktool --help

# 应该显示使用说明
```

---

## ⚙️ 配置（可选）

### 设置框架目录

Apktool 需要框架文件来解码某些 APK：

```bash
# 查看框架目录
apktool --framework

# 默认框架目录：~/.local/share/apktool/framework
```

### 设置 Java 内存限制

对于大型 APK，可能需要增加 Java 堆内存：

```bash
# 编辑 wrapper 脚本（如果手动安装）
sudo nano /opt/apktool/apktool

# 找到 java 命令行，添加内存参数：
java -Xmx1024M -jar /opt/apktool/apktool.jar "$@"
```

---

## 🐛 常见问题

### 问题 1：`command not found: apktool`

**原因**: Apktool 未添加到 PATH

**解决方案**:

```bash
# 检查安装位置
which apktool

# 如果返回空，创建符号链接
sudo ln -sf /opt/apktool/apktool /usr/local/bin/apktool
```

### 问题 2：`Error: Unable to access jarfile`

**原因**: jar 文件路径不正确或权限问题

**解决方案**:

```bash
# 检查 jar 文件是否存在
ls -la /opt/apktool/apktool.jar

# 重新下载
sudo wget -O /opt/apktool/apktool.jar \
    https://github.com/iBotPeaches/Apktool/releases/download/v3.0.1/apktool_3.0.1.jar
```

### 问题 3：Java 版本不兼容

**原因**: 需要 Java 8 或更高版本

**解决方案**:

```bash
# 检查 Java 版本
java -version

# 如版本过低，升级 Java
sudo apt-get install -y openjdk-11-jdk  # Debian/Ubuntu
brew install openjdk                    # macOS
```

### 问题 4：反编译失败 "Unsupported class file major version"

**原因**: Java 版本与 APK 编译版本不匹配

**解决方案**:

```bash
# 尝试使用不同 Java 版本
sudo update-alternatives --config java

# 或使用更高版本 Java
sudo apt-get install -y openjdk-17-jdk
```

---

## 📚 相关资源

- **官方网站**: https://apktool.org
- **GitHub**: https://github.com/iBotPeaches/Apktool
- **文档**: https://apktool.org/docs
- **Issue 追踪**: https://github.com/iBotPeaches/Apktool/issues

---

## 🔗 下一步

安装完成后，返回 [`../SKILL.md`](../SKILL.md) 查看使用指南。

---

**最后更新**: 2026-02-28


path: references/troubleshooting.md
content: # Apktool 常见问题解答

🔧 **故障排除和解决方案**

---

## 📋 目录

- [安装问题](#安装问题)
- [反编译问题](#反编译问题)
- [编译问题](#编译问题)
- [框架问题](#框架问题)
- [签名问题](#签名问题)
- [性能问题](#性能问题)

---

## 安装问题

### ❌ 问题：`command not found: apktool`

**症状**:
```bash
$ apktool --version
bash: apktool: command not found
```

**原因**: Apktool 未安装或未添加到 PATH

**解决方案**:

```bash
# 1. 检查是否已安装
ls -la /opt/apktool/apktool

# 2. 如果存在，创建符号链接
sudo ln -sf /opt/apktool/apktool /usr/local/bin/apktool

# 3. 如果不存在，重新安装
# 参考 install.md 进行安装

# 4. 刷新 PATH
hash -r

# 5. 验证
which apktool
apktool --version
```

---

### ❌ 问题：Java 版本不兼容

**症状**:
```bash
$ apktool --version
Error: LinkageError occurred while loading main class
java.lang.UnsupportedClassVersionError: brut/apktool/Main has been compiled by a more recent version of Java
```

**原因**: Apktool 需要更高版本的 Java

**解决方案**:

```bash
# 1. 检查当前 Java 版本
java -version

# 2. 安装更新的 Java
sudo apt-get install -y openjdk-11-jdk  # Debian/Ubuntu
# 或
sudo apt-get install -y openjdk-17-jdk

# 3. 切换 Java 版本（如有多个版本）
sudo update-alternatives --config java

# 4. 验证
java -version
# 应显示 11 或更高版本

# 5. 重试
apktool --version
```

---

### ❌ 问题：权限不足

**症状**:
```bash
$ apktool d app.apk
Error: Unable to create directory
```

**原因**: 输出目录权限不足

**解决方案**:

```bash
# 1. 使用有权限的目录
apktool d app.apk -o ~/tmp/app_decompiled

# 2. 或修改目录权限
sudo chown -R $USER:$USER /opt/apktool

# 3. 或在用户目录安装
mkdir -p ~/bin/apktool
cp apktool.jar ~/bin/apktool/
echo 'alias apktool="java -jar ~/bin/apktool/apktool.jar"' >> ~/.bashrc
source ~/.bashrc
```

---

## 反编译问题

### ❌ 问题：反编译失败 "Unknown version"

**症状**:
```bash
$ apktool d app.apk
I: Using Apktool 3.0.1 on app.apk
W: Unknown version. Code might not work properly.
Exception in thread "main" brut.androlib.AndrolibException
```

**原因**: APK 使用了较新版本的资源表格式

**解决方案**:

```bash
# 1. 更新 Apktool 到最新版本
# 参考 install.md 更新

# 2. 尝试不使用资源解码
apktool d app.apk -r -o app_output

# 3. 安装框架文件
adb pull /system/framework/framework-res.apk
apktool if framework-res.apk
apktool d app.apk -o app_output

# 4. 使用最新测试版
# 从 GitHub Actions 下载最新构建
```

---

### ❌ 问题：解码 dex 文件失败

**症状**:
```bash
$ apktool d app.apk
I: Baksmaling classes.dex...
Exception in thread "main" org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile
```

**原因**: 
- APK 已混淆或加密
- 使用了多 dex 文件
- dex 文件损坏

**解决方案**:

```bash
# 1. 检查 APK 是否损坏
unzip -t app.apk

# 2. 仅解码资源，不解码 dex
apktool d app.apk -s -o app_output

# 3. 使用 jadx 反编译 dex
jadx -d output_jadx app.apk

# 4. 如果 APK 已加固，需要先脱壳
# 使用 FRIDA、Unpacker 等工具
```

---

### ❌ 问题：资源解码错误

**症状**:
```bash
$ apktool d app.apk
I: Decoding file-resources...
W: Could not decode attr value
```

**原因**: 资源文件使用了未知的属性或格式

**解决方案**:

```bash
# 1. 跳过资源解码
apktool d app.apk -r -o app_output

# 2. 安装最新框架文件
apktool empty-framework-dir -f
adb pull /system/framework/framework-res.apk
apktool if framework-res.apk

# 3. 使用分析模式
apktool d app.apk -m -o app_analysis

# 4. 忽略错误继续
apktool d app.apk --no-res -o app_output
```

---

## 编译问题

### ❌ 问题：编译失败 "Unable to rebuild"

**症状**:
```bash
$ apktool b app_folder -o app.apk
I: Building resources...
exception: android:attr/style
```

**原因**: 资源文件修改导致编译失败

**解决方案**:

```bash
# 1. 检查修改的文件
cd app_folder
git diff  # 如果使用版本控制

# 2. 使用 aapt2 编译
apktool b app_folder -a -o app.apk

# 3. 恢复原始资源文件
# 从备份恢复未修改的资源

# 4. 清理后重新编译
rm -rf app_folder/build
apktool b app_folder -o app.apk

# 5. 检查 AndroidManifest.xml 格式
# 确保 XML 格式正确
```

---

### ❌ 问题：签名验证失败

**症状**:
```bash
$ adb install app.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]
```

**原因**: APK 未签名或签名无效

**解决方案**:

```bash
# 1. 使用 apksigner 签名
apksigner sign --ks mykey.jks app.apk

# 2. 使用 jarsigner 签名
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
    -keystore mykey.jks app.apk alias_name

# 3. 验证签名
apksigner verify app.apk

# 4. 使用测试密钥（仅开发）
apksigner sign --ks /path/to/testkey.jks app.apk
```

### 创建测试密钥

```bash
keytool -genkey -v -keystore testkey.jks -keyalg RSA -keysize 2048 \
    -validity 10000 -alias test
```

---

## 框架问题

### ❌ 问题：框架文件缺失

**症状**:
```bash
$ apktool d app.apk
W: Could not find framework
```

**原因**: 缺少必要的框架文件

**解决方案**:

```bash
# 1. 清空框架目录
apktool empty-framework-dir -f

# 2. 从设备提取框架
adb pull /system/framework/framework-res.apk
adb pull /system/framework/services.jar

# 3. 安装框架文件
apktool if framework-res.apk
apktool if services.jar

# 4. 检查框架目录
ls -la ~/.local/share/apktool/framework/

# 5. 重试反编译
apktool d app.apk
```

---

### ❌ 问题：框架 ID 冲突

**症状**:
```bash
$ apktool if framework-res.apk
I: Installing framework files...
W: Framework already installed
```

**原因**: 框架文件已安装或 ID 冲突

**解决方案**:

```bash
# 1. 查看已安装框架
ls -la ~/.local/share/apktool/framework/

# 2. 清空框架目录
apktool empty-framework-dir -f

# 3. 或手动删除
rm ~/.local/share/apktool/framework/*.apk

# 4. 重新安装
apktool if framework-res.apk
```

---

## 签名问题

### ❌ 问题：APK 无法安装

**症状**:
```bash
$ adb install app.apk
Failure [INSTALL_PARSE_FAILED_BAD_MANIFEST]
```

**原因**: Manifest 格式错误或签名问题

**解决方案**:

```bash
# 1. 检查 AndroidManifest.xml
cat app/AndroidManifest.xml

# 2. 确保正确编译
apktool b app/ -f -o app.apk

# 3. 使用正确方式签名
apksigner sign --v1-signing-enabled true --v2-signing-enabled true \
    --ks mykey.jks app.apk

# 4. 验证签名完整性
apksigner verify --verbose app.apk

# 5. 检查 APK 结构
unzip -l app.apk
```

---

### ❌ 问题：应用闪退

**症状**: 修改后的 APK 安装后立即崩溃

**原因**: 
- 代码修改错误
- 签名校验失败
- 完整性校验

**解决方案**:

```bash
# 1. 检查日志
adb logcat | grep -i "exception\|crash\|your.package.name"

# 2. 回滚修改
# 确定导致问题的修改

# 3. 绕过签名校验（高级）
# 需要修改 smali 代码

# 4. 检查原生库兼容性
# 确保 lib/ 目录完整

# 5. 使用原始 APK 作为基准
# 逐步应用修改，定位问题
```

---

## 性能问题

### ❌ 问题：反编译速度慢

**症状**: 反编译大型 APK 耗时过长（>30 分钟）

**解决方案**:

```bash
# 1. 仅解码资源
apktool d app.apk -s -o app_output

# 2. 仅分析模式
apktool d app.apk -m -o app_analysis

# 3. 增加 Java 内存
# 编辑 apktool wrapper 脚本
sudo nano /usr/local/bin/apktool
# 添加：java -Xmx2048M -jar ...

# 4. 使用 SSD 存储
# 避免在网络驱动器上操作

# 5. 仅反编译主 dex
apktool d app.apk --only-main-classes
```

---

### ❌ 问题：内存不足

**症状**:
```bash
$ apktool d large_app.apk
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
```

**原因**: Java 堆内存不足

**解决方案**:

```bash
# 1. 增加 Java 内存限制
# 编辑 apktool wrapper 脚本
sudo nano /usr/local/bin/apktool

# 找到 java 命令行，修改为：
java -Xmx4096M -jar /opt/apktool/apktool.jar "$@"

# 2. 使用环境变量
export _JAVA_OPTIONS="-Xmx4096M"
apktool d large_app.apk

# 3. 仅反编译部分代码
apktool d large_app.apk --only-main-classes
```

---

## 🔍 调试技巧

### 启用详细日志

```bash
# 使用 -v 参数
apktool -v d app.apk

# 或使用 DEBUG 模式
export DEBUG=true
apktool d app.apk
```

### 查看 Apktool 日志

```bash
# Apktool 日志通常输出到控制台
# 如需保存到文件：
apktool d app.apk 2>&1 | tee apktool_log.txt
```

### 使用分析工具

```bash
# 1. 检查 APK 结构
unzip -l app.apk | head -50

# 2. 查看 Manifest
aapt dump badging app.apk

# 3. 检查签名
apksigner verify --verbose app.apk

# 4. 分析 dex 文件
baksmali disassemble classes.dex
```

---

## 📚 获取帮助

### 官方资源

- **GitHub Issues**: https://github.com/iBotPeaches/Apktool/issues
- **Stack Overflow**: https://stackoverflow.com/questions/tagged/apktool
- **XDA 开发者论坛**: https://forum.xda-developers.com/

### 报告问题

在 GitHub 报告问题时，请提供：

1. Apktool 版本：`apktool --version`
2. Java 版本：`java -version`
3. 完整错误信息
4. APK 样本（如可能）
5. 重现步骤

---

## ⚠️ 常见问题

### Q: 可以反编译微信、QQ 等应用吗？

A: 技术上可以，但这些应用通常：
- 使用了加固保护
- 有完整性校验
- 反调试机制
- 法律风险较高

建议仅用于学习研究，不要用于非法用途。

### Q: 反编译后的代码能转回 Java 吗？

A: Apktool 输出的是 **smali** 代码（汇编级别）。如需 Java 代码：
- 使用 **jadx**：`jadx -d output app.apk`
- 使用 **bytecode-viewer**
- 使用 **IDA Pro**（付费）

### Q: 修改后的应用能发布到应用商店吗？

A: **绝对不可以**！
- 侵犯版权
- 违反开发者协议
- 可能导致法律后果

修改仅用于学习、研究、本地化等合法用途。

---

**最后更新**: 2026-02-28


path: references/usage.md
content: # Apktool 使用指南

📖 **详细使用说明和命令参考**

---

## 🎯 命令概览

Apktool 有两个主要操作模式：

| 命令 | 简写 | 功能 |
|------|------|------|
| `decode` | `d` | 反编译 APK 文件 |
| `build` | `b` | 重新编译 APK |
| `install-framework` | `if` | 安装框架文件 |
| `empty-framework-dir` | `efd` | 清空框架目录 |

---

## 📥 反编译 APK (decode)

### 基本语法

```bash
apktool d [选项] <file.apk> [输出目录]
```

### 常用选项

| 选项 | 说明 |
|------|------|
| `-o <dir>` | 指定输出目录 |
| `-f` | 强制覆盖已存在的目录 |
| `-s` | 只解码 resources.arsc，不解码 dex 文件 |
| `-d` | 解码时包含调试信息 |
| `-k` | 保留原始签名文件 |
| `-m` | 仅分析模式，不生成文件 |
| `-r` | 不使用资源解码（快速模式） |
| `--no-src` | 不反编译源代码 |
| `--only-main-classes` | 仅反编译主 classes.dex |

### 使用示例

#### 示例 1：基本反编译

```bash
apktool d myapp.apk
# 输出到 myapp/ 目录
```

#### 示例 2：指定输出目录

```bash
apktool d myapp.apk -o output_folder
# 输出到 output_folder/ 目录
```

#### 示例 3：强制覆盖

```bash
apktool d myapp.apk -f
# 如果 output_folder 已存在则覆盖
```

#### 示例 4：快速分析（不生成文件）

```bash
apktool d myapp.apk -m
# 仅生成 apktool.yml 和 AndroidManifest.xml
```

#### 示例 5：不解码 dex 文件

```bash
apktool d myapp.apk -s
# 保留 classes.dex 不反编译，仅解码资源
```

#### 示例 6：仅反编译资源

```bash
apktool d myapp.apk --no-src
# 不解码代码，仅解码资源文件
```

---

## 📤 重新编译 APK (build)

### 基本语法

```bash
apktool b [选项] <文件夹> [输出 APK]
```

### 常用选项

| 选项 | 说明 |
|------|------|
| `-o <file>` | 指定输出 APK 路径 |
| `-f` | 强制覆盖已存在的 APK |
| `-c` | 使用压缩资源 |
| `-d` | 包含调试信息 |
| `-a` | 使用 aapt2（替代 aapt） |
| `--force-manifest` | 强制重新编译 AndroidManifest.xml |

### 使用示例

#### 示例 1：基本编译

```bash
apktool b myapp/
# 输出到 myapp/dist/myapp.apk
```

#### 示例 2：指定输出路径

```bash
apktool b myapp/ -o modified.apk
# 输出到 modified.apk
```

#### 示例 3：强制覆盖

```bash
apktool b myapp/ -o modified.apk -f
# 如果 modified.apk 已存在则覆盖
```

#### 示例 4：使用 aapt2

```bash
apktool b myapp/ -a -o modified.apk
# 使用 aapt2 构建资源（支持新特性）
```

---

## 🔧 框架管理 (Framework)

### 安装框架文件

```bash
# 从设备提取并安装框架
adb pull /system/framework/framework-res.apk
apktool if framework-res.apk

# 输出：
# I: Installing framework files...
# I: Framework installed to ~/.local/share/apktool/framework/1.apk
```

### 查看已安装框架

```bash
ls -la ~/.local/share/apktool/framework/
```

### 清空框架目录

```bash
apktool efd
# 或
apktool empty-framework-dir
```

---

## 📊 输出文件结构

### 反编译后的目录结构

```
myapp/
├── AndroidManifest.xml       # 清单文件（已解码）
├── apktool.yml               # Apktool 配置信息
├── apktool.id
├── res/                      # 资源文件
│   ├── drawable/            # 图片资源
│   ├── layout/              # 布局文件
│   ├── values/              # 字符串、颜色等
│   └── ...
├── smali/                    # 反编译的代码（smali 格式）
│   └── com/
│       └── example/
│           └── app/
│               └── MainActivity.smali
├── smali_classes2/          # 多 dex 文件的额外代码
├── assets/                   # 原始资源文件
├── lib/                      # 原生库（.so 文件）
├── unknown/                  # 无法识别的文件
└── original/                 # 原始文件的备份
```

### apktool.yml 文件格式

```yaml
version: 3.0.1
apkFileName: myapp.apk
isFrameworkApk: false
usesFramework:
  ids:
  - 1
sdkInfo:
  minSdkVersion: '21'
  targetSdkVersion: '30'
packageInfo:
  forcedPackageId: '127'
  renamesManifestPackage: null
versionInfo:
  versionCode: '10'
  versionName: '1.0.0'
sharedLibrary: false
doNotCompress:
- resources.arsc
- png
```

---

## 🛠️ 高级用法

### 多 DEX 文件处理

某些大型 APK 包含多个 dex 文件：

```bash
# 反编译所有 dex 文件
apktool d large_app.apk -o large_app

# 仅反编译主 dex 文件
apktool d large_app.apk --only-main-classes -o large_app_main
```

### 跳过资源解码

如果只关心代码：

```bash
apktool d myapp.apk -r -o myapp_code
# 资源文件保持编码状态，速度更快
```

### 保留原始签名

```bash
apktool d myapp.apk -k -o myapp_signed
# 保留原始签名文件（用于分析）
```

### 调试模式

```bash
apktool d myapp.apk -d -o myapp_debug
# 解码时包含调试信息
```

---

## 🔄 典型工作流

### 工作流 1：修改应用资源

```bash
# 1. 反编译
apktool d myapp.apk -o myapp_mod

# 2. 修改资源
cd myapp_mod/res/values/
# 编辑 strings.xml 等文件

# 3. 重新编译
apktool b myapp_mod -o myapp_modified.apk

# 4. 签名 APK（需要 apksigner）
apksigner sign --ks mykey.jks myapp_modified.apk

# 5. 安装到设备
adb install myapp_modified.apk
```

### 工作流 2：分析权限

```bash
# 1. 快速分析模式
apktool d suspicious.apk -m -o analysis

# 2. 查看权限
cat analysis/AndroidManifest.xml | grep -A 1 "uses-permission"

# 3. 查看网络配置
cat analysis/res/values/strings.xml | grep -i "http\|url\|api"
```

### 工作流 3：本地化翻译

```bash
# 1. 反编译
apktool d myapp.apk -o myapp_i18n

# 2. 翻译字符串
cd myapp_i18n/res/values/
cp strings.xml strings.xml.bak
# 编辑 strings.xml 进行翻译

# 3. 创建其他语言的资源目录
mkdir -p values-zh-rCN
cp values/strings.xml values-zh-rCN/strings.xml
# 翻译中文版本

# 4. 重新编译
apktool b myapp_i18n -o myapp_chinese.apk

# 5. 签名并安装
apksigner sign --ks mykey.jks myapp_chinese.apk
adb install myapp_chinese.apk
```

---

## 📝 Smali 基础

### Smali 文件结构

```smali
.class public Lcom/example/MainActivity;
.super Landroid/app/Activity;
.source "MainActivity.java"

# 字段
.field private myValue:I

# 直接方法
.method public constructor <init>()V
    .locals 0
    invoke-direct {p0}, Landroid/app/Activity;-><init>()V
    return-void
.end method

# 虚方法
.method public onCreate(Landroid/os/Bundle;)V
    .locals 1
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    const/4 v0, 0x0
    return-void
.end method
```

### 常用 Smali 指令

| 指令 | 说明 |
|------|------|
| `const/4` | 设置 4 位常量 |
| `move-result` | 移动方法返回值 |
| `invoke-virtual` | 调用虚方法 |
| `invoke-direct` | 调用直接方法 |
| `return-void` | 返回空值 |
| `if-eq` | 条件跳转（相等） |
| `goto` | 无条件跳转 |

---

## ⚠️ 注意事项

### 签名验证

修改后的 APK 无法直接安装，需要重新签名：

```bash
# 使用 apksigner（Android SDK）
apksigner sign --ks mykey.jks modified.apk

# 使用 jarsigner（JDK）
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 \
    -keystore mykey.jks modified.apk alias_name
```

### 完整性校验

某些应用有完整性校验机制：

- **签名校验** - 应用会检查签名是否改变
- **校验和校验** - 检查 APK 哈希值
- **安全校验** - 使用 SafetyNet 等

### 法律风险

- 仅对您拥有权限的 APK 进行反向工程
- 不要分发修改后的商业应用
- 遵守当地法律法规

---

## 🔗 相关资源

- **Smali 语法**: https://github.com/JesusFreli/smali
- **AndroidManifest.xml 格式**: https://developer.android.com/guide/topics/manifest/manifest-intro
- **apksigner 工具**: https://developer.android.com/studio/command-line/apksigner

---

**最后更新**: 2026-02-28


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)