环境:Ubuntu 20.04 + AOSP 12 + Pixel 4 XL (coral)
fart12 源码下载:fart12-lite.zip(提取码: vgcp)
编译 AOSP 12 准备
系统环境初始化
1 | # 更新并安装 AOSP 编译必须的依赖包 |
配置 Repo 工具
1 | mkdir ~/bin |
初始化并同步源码
在拉取 AOSP 源码之前,由于服务器位于国外,直接同步通常会失败。使用 proxychains4 配合代理软件(如 Clash/V2Ray)来保障同步成功。
安装与配置 Proxychains
1 | # 安装工具 |
针对 Pixel 4 XL,我们选择一个稳定的 Android 12 分支:
1 | # 创建工作目录 |
导入 Pixel 4 XL 官方驱动
在下载驱动之前,请务必核对以下“三位一体”的关系:
- 机型:Pixel 4 XL (coral)
- 源码分支:android-12.0.0_r28
- 驱动 Build ID:SQ1A.220205.002
对应关系查看 https://source.android.com/docs/setup/reference/build-numbers?hl=zh-cn
下载驱动放在aosp12的根目录:
- 去 Google Drivers 下载对应机型的驱动。
- 通过 tar -zxvf** **解压得到两个
.sh脚本,放入源码根目录。 - 执行脚本并**滑到最后输入 “I ACCEPT”**:
1 | ./extract-google_devices-coral.sh |
替换fart12代码
将本仓库中的文件按路径替换到 AOSP 源码对应位置。建议手动打开文件对比后再替换,避免 AOSP 小版本之间的差异导致问题,不要直接整个文件覆盖。
需要将其加入 boot classpath 白名单,否则编译会报错。在 build/soong/scripts/check_boot_jars/package_allowed_list.txt 最后一行添加:
1 | cn\.zskkk |
准备编译
编译模式选择
默认使用 aosp_coral-userdebug 即可正常脱壳,因为 fart 代码运行在 framework 层,有权限读取 /data/local/tmp/fart.config。
如果需要 eng 模式(adb shell 默认 root、关闭部分优化便于调试),可在 device/google/coral/AndroidProducts.mk 中添加:
1 | COMMON_LUNCH_CHOICES := \ |
1 | # 启用编译缓存提高二次编译速度 |
如果遇到编译报错内存不够的话:

看 free -h 的输出,物理内存只有 9.7Gi,Swap 也只有 2Gi,总共加起来也就 11.7Gi 左右。
1 | zsk@ubuntu:~/aosp12$ free -h |
增加物理内存或者增加交换分区
1 | # 1. 禁用当前的交换文件(如果有的话,通常是 /swap.img 或类似的) |
继续编译
看到 build completed successfully 就可以了
后续修改完成后如何只编译 ART 部分? 无需每次都全量 make。如果你只改了 art/ 目录,可以执行: m -j$(nproc) com.android.art 然后再执行 make snod 重新打包镜像,这样能极大节省调试时间。
镜像刷入
进入 Bootloader 模式:
1 | adb reboot bootloader |
确认 Fastboot 状态: 手机进入黑底红字的界面后,输入:
1 | fastboot devices |
如果这里依然显示 no permissions,请再次执行第二步的 _sudo udevadm trigger_ 即可。
开始全量刷机: 确保你处于 ~/aosp12 目录下,且之前已经执行过 lunch:
1 | # -w 代表清空所有数据(必须要,否则容易无限重启) |
使用
在 /data/local/tmp/下创建 fart.config文件,内容为 JSON 格式,一次只能指定一个目标应用:
1 | {"enabled": true, "packageName": "com.xxxxxx", "appName": "xxxxxx", "isTuoke": true, "isDeep": true} |
字段说明:
| 字段 | 说明 |
|---|---|
enabled |
是否启用,填 true |
packageName |
目标 APP 的包名 |
appName |
备注名,随意填写,勿用中文 |
isTuoke |
是否执行脱壳 |
isDeep |
是否深层主动调用(针对二代抽取壳) |
配置好后,通过 adb 监控日志:
1 | adb logcat -s "zskkk" |
然后打开目标应用,等待 60 秒后自动开始脱壳。当 logcat 中输出 run over 时代表脱壳完毕:

结束

脱壳后的 dex 和 bin 文件位于 /data/data/<packageName>/zskkk/ 目录下。
白名单功能
Fart12延续了Fart10的白名单功能,即在/data/local/tmp/
1 | La/a/a; |
黑名单功能
在 /data/local/tmp/<packageName>_blacklist 文件中指定不参与主动调用的类前缀,一行一个:
1 | androidx. |
黑名单的作用有两个:
- 应对反脱壳检测 — 部分加固方案会在 APP 中植入”垃圾类”,该类正常运行时不会被触发,一旦被主动调用就说明正在脱壳,随即杀死进程。通过监控脱壳流程定位到这类”垃圾类”,将其加入黑名单即可绕过。
- 提高效率 —
android、androidx、java等系统类无需主动调用,排除后可加快脱壳速度。
合并dex和bin文件
脱壳完成后,/data/data/<packageName>/zskkk/ 目录下会产生大量 dex 和 bin 文件,需要将 bin 中的方法指令回填到对应的 dex 中。使用dexfixer.jar 工具完成合并。
1 | import os |
用法:
1 | # 将 dexfixer.jar 和脚本放在同一目录,zskkk 文件夹为从手机 pull 下来的脱壳产物 |
合并后的 dex 文件输出在 zskkk/fix_dex/ 目录下,可直接用 jadx 打开分析。