HackiOS 在 Android 设备和 QEMU 上运行完整的 iOS 16.5 固件

HackiOS 在 Android 和 QEMU 上启动 iOS 16.5

要点: HackiOS 项目成功在骁龙 778G Android 手机和 aarch64 QEMU 上运行了苹果开源 XNU 内核(版本 xnu-8796.121.2,iOS 16.5),提供了功能完整的 iOS 16.5 用户空间,无需刷机。


项目成果

  • 完整的 iOS 16.5 技术栈: XNU 内核启动 launchd → backboardd → SpringBoard → 应用,重现了完整的 iOS 体验。
  • 仓库中不包含任何 Apple 文件: 所有 iOS 二进制文件在构建时从 Apple 的 CDN 获取(ios165/fetch.sh)。
  • 两种部署模式:
    1. POCO X5 Pro 5G(redwood,骁龙 778G) – 通过 fastboot boot 启动;所有内容在 RAM 中运行,重启后手机恢复 Android。
    2. QEMU virt aarch64 – 可在任何 Linux 主机上运行,无需手机。
  • 研究级,而非 ROM: 会话有时间限制;内核在可配置的时间后返回加载器。

功能亮点

可用 尚未实现
锁屏、滑动解锁、带图标的主屏幕、iOS 16 壁纸 蜂窝网络、蓝牙
系统手势(主页、应用切换器、返回)、控制中心 自定义内核下的充电(手机会放电)
核心应用(设置、Safari、照片等)和小组件 大多数应用的 Metal 渲染(293/456 个着色器可用)
触摸屏(Goodix GT9916)、多点触控、电源/音量键 App Store 内容、Apple ID 登录(缺少 Secure Enclave)
最多 8 个 CPU 核心,约 20 秒进入锁屏 视频/实况照片拍摄
通过 Mesa/freedreno 的 Adreno 642L GPU(用于 CoreAnimation 的 OpenGL ES) –
Wi-Fi(WCN6750,ath11k)– 55–90 Mbit/s –
音频、麦克风、前置/后置摄像头(HEIC 照片) –
持久化 iOS 数据(var_store=1 ufs_write=1) –
Sileo + Procursus 包管理器、SSH、插件 –

在 QEMU 上快速开始(无需构建内核)

# 安装依赖(Arch 示例)
sudo pacman -S --needed git python 7zip lz4 gcc qemu-system-aarch64 qemu-ui-gtk edk2-aarch64

# 克隆仓库并设置工作区
git clone https://github.com/oosexgang/hackios-xnu-kernel.git hackios
cd hackios
common/setup.sh               # 拉取 hackios-xnu-userland,检查主机
ios165/fetch.sh               # 下载约 7.4 GB IPSW,提取所需部分
common/build.sh qemu-virt     # 构建 APFS 镜像(使用预构建内核)
common/run.sh qemu-virt       # 启动约 20 分钟的 QEMU 会话
  • 锁屏在 2–3 分钟后出现。
  • 按住鼠标左键模拟手指;H = 主页,L = 锁屏,方向键 = 音量,F11(按住)= 五指手势。
  • 脚本输入示例:
    qemu/touch.py swipe 0.5 0.985 0.5 0.3 250
    qemu/touch.py tap 0.615 0.71
    qemu/touch.py key home
    qemu/screendump.sh shot.png
    
  • 使用主机的 UEFI 固件:QEMU_EFI=/usr/share/AAVMF/AAVMF_CODE.fd QEMU_VARS=/usr/share/AAVMF/AAVMF_VARS.fd。

在 POCO X5 Pro 5G(redwood)上运行

  1. 解锁引导加载程序并安装 adb/fastboot。
  2. 按照 README 中的说明从手机提取供应商固件(GPU、Wi-Fi、音频、触觉),并将 fw-* 目录放在工作区旁边。
  3. 构建启动镜像并运行:
    common/build.sh redwood GL=1          # 生成 out/redwood-boot.img
    common/run.sh redwood 900             # 15 分钟会话
    
  4. 或使用 xl 助手进行精细控制:
    ./xl enter            # fastboot boot 自定义 UEFI 加载器
    ./xl ramdisk          # 上传 2.5 GB iOS 系统镜像到 RAM
    XL_SECS=900 XL_CMDLINE="touchscreen=1 cpufreq=1 bootcpu=7 cpus=8 gpu=1 wifi=1 adsp=1" ./xl run
    ./xl screenshot shot.png
    ./xl reboot           # 返回 Android
    
    加载器完全在 RAM 中运行;不会对手机存储进行任何持久更改。

预构建启动镜像

每个版本都附带 hackios-redwood-boot.img,这是一个包含自定义加载器的即用型 UEFI 镜像。它不包含任何 Apple 二进制文件;您仍然需要使用 ios165/fetch.sh 在本地生成 iOS 系统镜像。


从源码构建内核和加载器

  • 内核: 需要 theos(~/theos)、cctools、iPhoneOS16.5.sdk、clang、lld、python、perl。按照 xnu/README.md 并运行 xnu-build.sh。
  • 加载器: 使用 xnuloader/build.sh 构建(纯 clang + lld-link,无需 EDK2)。
  • UEFI: 从 Project Silicium 移植;预构建二进制文件位于 prebuilt/uefi。
  • 镜像: REST=1 userland/build.sh 创建 APFS 容器和 rootfs。
  • 重新构建后,运行 tools/update-prebuilt.sh 刷新 prebuilt/ 目录。

移植到其他 Android 设备

  1. 生成设备配置文件:common/new-device.sh <codename> path/to/device.dtb。
  2. 编辑生成的 common/devices/<codename>.conf 以描述 UEFI 平台、加载器参数和驱动替换。
  3. 按照 docs/PORTING.md 中的详细步骤(UEFI 移植、内核驱动补丁、固件提取)。

HackiOS 的工作原理

fastboot boot → UEFI (Mu-Silicium) → xnuloader (EFI 应用)
   │ 保持驻留,提供 USB 链接、看门狗、内核日志
   ▼
XNU(基于 BCM2837 配置,为 redwood/QEMU 打补丁)
   ├─ GICv3、定时器、视频控制台、返回加载器路径
   ├─ RAM 中的 APFS 镜像,用于 /private/var 和 /tmp 的 ramfs
   ├─ Mini-crypto、AMFI 和 Sandbox 存根(MAC 策略)
   ├─ 驱动替换:IOSurface、IOMobileFramebuffer、AppleKeyStore、网络栈
   ├─ 输入:/dev/redwood-touch(Goodix GT9916)或 virtio-input
   ├─ GPU:通过 Mesa/freedreno 的 Adreno 642L,Wi-Fi:ath11k(LinuxKPI),声音:ADSP/virtio-sound
   ▼
launchd → logd、notifyd、cfprefsd、runningboardd、backboardd、SpringBoard、应用
   └─ 使用 DYLD_INSERT_LIBRARIES 注入的库提供虚拟 HID 服务和 ObjC 方法交换。

iOS 二进制文件未被修改;缺失的功能由内核驱动垫片或注入的用户空间库提供。


调试和开发工作流

  • 会话日志: QEMU 标准输出或手机上的 logs/HHMMSS-run.log。
  • 自动启动应用: RC_JOBS=rc.jobs.tour REST=1 userland/build.sh 构建一个打开每个首屏应用的镜像。
  • 崩溃诊断: 查找 userabort:(进程调用 abort())或 usertrap:(使用 systrace=1)。
  • 实时堆栈跟踪(QEMU): qemu/touch.py stacks NAME 然后 qemu/symstack.py LOG NAME(需要 ipsw 工具)。
  • 检查可靠性: 参见 docs/checks.md 了解已知的误报。

社区反应(Hacker News 评论)

"我觉得这个网站看起来令人作呕,所以我决定改用 GitHub 链接。但它在 QEMU、POCO X5 Pro 5G 和一些小米设备上运行,这相当令人印象深刻。" – aghuang

"你能制作一个 GSI 在任何 Android 手机上运行吗?" – Velocifyer

"终于有人做到了,哇!2026 年真是越来越疯狂。" – pmkary

"为什么这些演示都停在 iOS 16?iOS 17 有什么变化?" – bigwheels

"干得好。这很酷,有点像旧 Mac 的 Hackintosh。有了这个,你能访问 App Store 吗?我认为 Android 缺少一个唯一标识符使其无法工作。" – dj_io

这些评论表达了兴奋、对更广泛设备支持的好奇,以及对 App Store 访问和未来 iOS 版本的疑问。


许可

  • 仓库本身采用 Apple Public Source License 2.0(APSL 2.0),因为它包含 XNU 的衍生作品。
  • 第三方组件保留其原始许可证(ath11k 的 BSD-3-Clause-Clear、FreeBSD LinuxKPI 的 BSD-2-Clause、libzbitmap 和 libdeflate 的 MIT、AOSP UEFI 助手的 Apache-2.0)。
  • 不分发任何 iOS 二进制文件;ios165/fetch.sh 直接从 Apple 的 CDN 下载它们。

更多信息


结论

HackiOS 证明了 iOS 16.5 内核和用户空间可以在非 Apple 硬件上运行,方法是用开源等价物替换闭源驱动,并通过自定义 UEFI 加载器启动。虽然仍是一个研究原型——缺少蜂窝网络、蓝牙、完整的 Metal 支持和 App Store 功能——它为 iOS 实验、跨平台测试和安全研究开辟了新的领域。

Sources