Hacker News 中文摘要

RSS订阅

Show HN:在 Android 设备上运行完整 iOS 16.5 固件 -- Show HN: Run full iOS 16.5 firmware on Android Devices

HackiOS 在安卓(Android)手机硬件上启动苹果(Apple)开源的 XNU 内核(XNU kernel,版本 xnu-8796.121.2,即 iOS 16.5 的内核),并在其上运行未经修改的 iOS 16.5 用户空间:launchd → backboardd → SpringBoard → apps。自研的 EFI 加载器(EFI loader)、对苹果闭源驱动的替代、UEFI 移植(UEFI port)以及兼容层上的 Linux Wi-Fi 驱动(Linux Wi-Fi driver)使之成为可能。它运行在两处:POCO X5 Pro 5G(redwood),搭载高通骁龙 778G(Snapdragon 778G),不刷机,用 fastboot boot 启动 UEFI,整个系统常驻内存,重启后回到安卓;QEMU(virt,aarch64)则可在任意 Linux 电脑上实现同样效果,无需手机。

正文

HackiOS 在 Android 手机硬件上启动 Apple 开源的 XNU 内核(xnu-8796.121.2,即 iOS 16.5 的内核),并在其上运行未经修改的 iOS 16.5 用户空间:launchd → backboardd → SpringBoard → 应用。实现这一点依靠我们自己的 EFI 加载器、对 Apple 闭源驱动的替代、一个 UEFI 移植,以及运行在兼容层上的 Linux Wi-Fi 驱动。

它可在两处运行:

  • POCO X5 Pro 5G(redwood,骁龙 778G):不刷写任何内容,UEFI 通过 fastboot boot 启动,整个系统位于 RAM 中,重启后手机回到 Android;
  • QEMU(virt,aarch64):在任何 Linux 电脑上同样运行,不需要手机。

本仓库是项目的一半:

| 仓库 | 内容 | | --- | --- | | hackios-xnu-kernel(本仓库) | XNU 补丁、EFI 加载器、UEFI 移植、Wi-Fi、QEMU 脚本、xl、预构建的内核/加载器/UEFI、common/ 脚本 | | hackios-xnu-userland | 我们的 init、注入的库、launchd 任务、APFS 映像构建器、从 Apple IPSW 中提取 iOS 的脚本、Metal/Mesa 工作 |

两个仓库中都没有任何 Apple 文件。ios165/fetch.sh 会从 Apple 自己的 CDN 把 iOS 16.5 IPSW 下载到你的机器上,并在本地提取所需内容。HackiOS 是 OOSEX GANG 的独立研究项目,与 Apple Inc. 无关,也未获其授权或认可。iOS、iPhone 和 Apple 是 Apple Inc. 的商标。

锁屏

主屏幕

控制中心

设置

以上截图在手机上拍摄,由 Adreno GPU 绘制(gpu=1)。更多见后文“截图”一节。

可用功能

| 可用 | 尚不可用 | | --- | --- | | 锁屏、滑动解锁、包含所有图标(两页)的主屏幕、iOS 16 原生壁纸 | 蜂窝网络、蓝牙 | | 系统手势:上滑(回到主屏、应用切换器)、边缘滑动(返回)、控制中心 | 在我们的内核下充电(手机只会放电) | | 应用:设置、时钟、日历、照片、备忘录、Safari 等;手机上的小组件(天气、日历) | 应用的 Metal(进行中:456 个系统着色器中已有 293 个能在 Adreno 上运行,见 hackios-xnu-userland 中的 docs/air.md) | | 手机触摸屏(Goodix GT9916)、多点触控、触摸唤醒;真实的电源键和音量键 | App Store 内容与 Apple ID 登录(没有 Secure Enclave;FairPlay 守护进程退出) | | 最多 8 个 CPU 核心(cpus=8),大核 2.4 GHz,约 20 秒进入锁屏 | 视频和实况照片录制 | | 通过 Mesa/freedreno 使用 Adreno 642L GPU(gpu=1,为 CoreAnimation 提供 OpenGL ES) | | | Wi-Fi(WCN6750,ath11k):可在设置中连接,Safari 通过 Wi-Fi 上网,速度 55–90 Mbit/s | | | 声音(扬声器、主麦克风),相机应用中的摄像头(前/后、预览、对焦、HEIC 照片) | | | iOS 写入的数据在重启后保留(var_store=1 ufs_write=1);iOS 根卷位于手机闪存 | | | Sileo + Procursus(dpkg、apt)、各类 tweaks、SSH | |

这是一个研究平台,不是 ROM:一次会话持续设定的秒数,随后内核返回加载器并交出日志。

快速开始:QEMU,无需编译内核

prebuilt/ 包含根据这些仓库构建好的内核、加载器和我们的程序,因此你只需要系统映像,而系统映像是在你的机器上用 Apple 的 IPSW 制作的。

需求:Linux x86-64,约 12 GB 可用磁盘,4 GB 可用内存。Arch 所需软件包:

sudo pacman -S --needed git python 7zip lz4 gcc qemu-system-aarch64 qemu-ui-gtk edk2-aarch64

(Debian/Ubuntu:git python3 7zip liblz4-dev gcc qemu-system-arm qemu-efi-aarch64;7-Zip 必须为 23 或更高版本——它能读取 APFS。)

git clone https://github.com/oosexgang/hackios-xnu-kernel.git hackios

cd hackios

common/setup.sh # 把 hackios-xnu-userland 放入同一目录树,并检查主机

ios165/fetch.sh # 从 Apple CDN 下载 7.4 GB 并提取所需内容(5–15 分钟)

common/build.sh qemu-virt # 构建 APFS 映像(若有工具链也会构建内核)

common/run.sh qemu-virt # 在 QEMU 窗口中进行 20 分钟会话

锁屏界面会在 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。
  • SpringBoard 刚出现时,系统仍在注册应用:给它 30–40 秒。
  • Debian/Ubuntu 的 UEFI 固件:QEMU_EFI=/usr/share/AAVMF/AAVMF_CODE.fd QEMU_VARS=/usr/share/AAVMF/AAVMF_VARS.fd。

在手机上运行(POCO X5 Pro 5G)

你需要一台已解锁 bootloader 的 POCO X5 Pro 5G(redwood),并准备好 adb、fastboot,以及上一节中的映像。不会向手机存储写入任何内容。

手机自身的固件不在仓库中,也不能在仓库中:它属于厂商,需从将要运行它的那台手机的 Android 中提取:

adb pull /vendor/firmware/a660_{gmu.bin,sqe.fw,zap.mdt,zap.b00,zap.b01,zap.b02} fw-gpu/ # GPU(gpu=1)

adb pull /vendor/firmware_mnt/image/wpss.{mdt,b02,b03,b04,b05,b06,b07} fw-wifi/ # Wi-Fi(wifi=1)

adb pull /vendor/firmware_mnt/image/adsp.{mdt,b02,...,b36} fw-audio/ # 声音(adsp=1)

adb pull /vendor/firmware/aw8697_haptic.bin fw-haptic/ # 触觉反馈

(把 fw-* 目录放在工作区旁边。Wi-Fi 还需要 fw-wifi/mac——一行填写无线电地址——和 fw-wifi/network——网络名称和密码。userland/build.sh 会打印哪些固件被打包进去。)

common/build.sh redwood GL=1 # 生成映像以及 out/redwood-boot.img

common/run.sh redwood 900 # 把加载器和系统映像载入 RAM,进行 15 分钟会话

或者用 xl 分步执行:

./xl enter # Android -> fastboot -> 我们的加载器进入 RAM(fastboot boot);它会建立自己的 USB 链路

./xl ramdisk # 把系统映像上传到手机 RAM(2.5 GB,约 80 秒),每次加载器会话只需一次

XLSECS=900 XLCMDLINE="touchscreen=1 cpufreq=1 bootcpu=7 cpus=8 gpu=1 wifi=1 adsp=1" ./xl run

./xl screenshot shot.png

./xl reboot # 回到 Android

./xl 不带参数时会列出所有命令(日志、屏幕和声音录制、相机帧、停止、状态……)。

预编译启动映像

每个发布版本都附带 hackios-redwood-boot.img:内含我们加载器的 redwood UEFI,可直接用于 fastboot boot。它不包含任何 Apple 文件;系统映像仍需按上文在你自己机器上制作。

从源码构建

common/build.sh <设备> 会运行这台机器能运行的每个步骤,其余部分使用 prebuilt/。

  • 内核 — 需要 ~/theos 中的 theos(含 cctools 和 iPhoneOS16.5.sdk)以及 clang lld python perl。详见 xnu/README.md。命令:xnu/apply.sh && xnu-deps/setup.sh && ./xnu-build.sh -j8 -k
  • 加载器 — xnuloader/build.sh(clang + lld-link,不依赖 EDK2 的 EFI 应用)。
  • 映像 — REST=1 userland/build.sh(变量说明见该文件顶部)。
  • UEFI — uefi/README.md(Project Silicium 移植);运行非必需,prebuilt/uefi 中已有。
  • 重新构建后:tools/update-prebuilt.sh 会刷新 prebuilt/。

移植到其他设备

运行 common/new-device.sh <代号> path/to/device.dtb,可根据手机的设备树生成配置文件和加载器平台。然后按照 docs/PORTING.md 操作:UEFI 移植、加载器的平台描述、内核驱动、固件。设备配置文件位于 common/devices/(redwood.conf、qemu-virt.conf、_template.conf)。

工作原理

启动流程为:fastboot boot 进入 UEFI(Mu-Silicium),再进入 xnuloader(EFI 应用)。xnuloader 常驻内存,提供 USB 链路(fastboot 协议)、看门狗,并接收内核日志。随后启动 XNU(以 BCM2837 配置为基础,加上我们的平台):包含 GICv3、定时器、视频控制台并可返回加载器;APFS(映像在 RAM,iOS 卷在闪存)与 ramfs(/private/var、/tmp);用 minicrypto 替代 corecrypto,以及 AMFI 和 Sandbox 的替代(MAC 策略);驱动替换包括 IOSurface、IOMobileFramebuffer、AppleKeyStore、网络栈;输入为 /dev/redwood-touch,来自手机上的 Goodix GT9916 或 QEMU 的 virtio-input;GPU 为 Adreno 642L,Wi-Fi 为 WCN6750(通过 LinuxKPI 使用 ath11k),声音为 ADSP 或 virtio-sound。接着运行 iOS 16.5 的 launchd,再依次到 logd、notifyd、cfprefsd、runningboardd、backboardd、SpringBoard 和应用。我们的库被注入 backboardd、SpringBoard 和 mediaserverd(提供虚拟 HID 服务、少量 ObjC 方法替换,仅存在于内存中),mediaserverd 获得我们的 CoreAudio 输出设备(RedwoodAudio.driver)。

iOS 的程序、框架和 dyld 共享缓存一个字节都没有改动:它们缺少的功能由内核(驱动替换)或内核通过 DYLD_INSERT_LIBRARIES(kern.exec_inject)注入的库来提供。

目录结构

| 路径 | 内容 | | --- | --- | | common/ | setup.sh(工作区)、build.sh / run.sh(按设备)、new-device.sh、devices/*.conf、ugit | | xl | 通过 USB 驱动手机:加载器、内核运行、日志、截图、屏幕和声音录制 | | xnuloader/ | 加载器:loader.c(UEFI 应用)、mkpayload.py(内核 + 映像 + 参数容器) | | xnu/ | 我们对 XNU 的改动:补丁、新文件、apply.sh / export.sh | | xnu-deps/ | 在 Linux 上构建 XNU 所需的一切:setup.sh、工具包装、桩代码 | | xnu-build.sh、xnu-env.sh | 内核构建 | | uefi/、mkxnuimg.py | UEFI 移植,以及为 fastboot boot 打包启动映像 | | wifi/lx/ | Linux Wi-Fi 驱动为我们的内核所依赖的兼容层 | | qemu/ | QEMU 运行、触摸输入、截图、堆栈符号化 | | tools/ | 录制(recording.py、sound.py)、UFS/闪存工具、mk-ath11k.sh、new-workspace.sh、主机测试 | | prebuilt/ | 构建好的内核、加载器和 UEFI 组件(内核中第三方代码见 NOTICES.md) | | docs/ | 截图、checks.md、PORTING.md |

调试

  • 会话日志:QEMU 的 stdout,或手机上的 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。

截图

以下为手机屏幕一次会话中的截图(GL=1 REST=1、gpu=1):

主屏幕第二页

搜索

设置 > 通用

日历

时钟

钱包

信息

音乐

地图

App Store

许可证

  • 仓库中没有 iOS 文件:ios165/fetch.sh 会从 Apple 的 CDN 下载到你的机器。
  • xnu/ 是 XNU 的衍生作品,像 XNU 本身一样按 APSL 2.0 分发;prebuilt/mach.* 是由它构建出的内核。它还包含 ath11k(BSD-3-Clause-Clear)和 FreeBSD LinuxKPI 代码(BSD-2-Clause):见 prebuilt/NOTICES.md。
  • xnu/files/bsd/miscfs/apfs/libzbitmap/ 和 xnu-deps/build/lzbitmap/ —— libzbitmap(Corellium LLC,此处为 MIT);xnu/files/bsd/miscfs/apfs/libdeflate/ —— libdeflate 1.24(Eric Biggers,MIT,见其中的 COPYING)。
  • ath11k、Linux 和 FreeBSD 源码不在仓库中:tools/mk-ath11k.sh 会获取固定版本。wifi/lx/patches/*.patch 是我们对 FreeBSD 头文件的改动;wifi/lx/ 的其余部分为我们自己编写。
  • uefi/files/Binaries/redwood 和 prebuilt/uefi/SILICIUM_UEFI.fd 包含来自手机小米固件的 UEFI 驱动,按 Project Silicium 为其他设备分发的方式分发;prebuilt/uefi/mkbootimg.py —— AOSP,Apache-2.0。
  • 本仓库采用 Apple Public Source License 2.0 授权:我们对 XNU 的改动是 XNU 的衍生作品,因此必须如此;我们在此的其他代码(加载器、脚本)也以同一许可证发布。第三方代码保留其自身许可证,如上所列。

团队

OOSEX GANG —— @oodze(创始人)、@netusd、@wannqn、@hxfuxyyXD。动态见 t.me/oosexgangdevs。

评论

多数人惊叹于把 iOS/XNU 移植到 Android 设备的技术成果,并将其类比成移动端 Hackintosh;但讨论主轴很快转向「这有什么用」以及随之而来的风险。不少人认为真正该做的是让 GrapheneOS 这类自由 Android 跑在苹果硬件上、或解锁被 Google 深度控制的手机,同时也有大量声音追问版本限制、充电失效、山寨 iPhone、代币募资和 AI 参与安全等隐患。

认为这是移动端 Hackintosh 式的技术壮举

  • 多名读者惊呼“终于有人做到了”,项目能在 QEMU、POCO X5 Pro 5G 和部分 Xiaomi 设备上运行让人印象深刻;有人把它和早年给 Mac 装 macOS 的 Hackintosh 相提并论,还有人联想到老款小 iPhone 也许会因此更容易被“复活”。(认可度:较多人)
  • 需要引用时,只用一句中文意译: > 这活儿很棒,就像早年给 Mac 做 Hackintosh 一样,现在轮到 iOS 了。(@dj_io)

认为真正该做的是让自由 Android 跑在苹果硬件上

  • 不少人认为把 iOS 装到 Android 设备上属于需求错位;更理想的方向是让 GrapheneOS 这类注重隐私与自由的 Android 发行版跑在苹果硬件上,或者干脆解锁被 Google 控制的手机、换掉原有系统。也有人直说“苹果软件糟糕、硬件出色”,想要的是相反的 Android 装在苹果硬件上。(认可度:较多人)
  • 需要引用时,只用一句中文意译: > 这能做到很有意思,但为什么要让 iOS 跑在 Android 设备上?更理想的是让 GrapheneOS 这类自由 Android 跑在苹果硬件上,或者解锁被 Google 控制的手机、换掉系统。(@drnick1)

认为它没有明确用例,酷但无意义

  • 有人觉得概念很酷却想不出实际用途,提议叫它“phockintosh”,并以“上场踢足球前先砍掉一条腿”调侃这种惊艳但自损的炫技;也就是说,技术值得惊叹,但实用性被看衰。(认可度:少数人)
  • 需要引用时,只用一句中文意译: > 应该叫 phockintosh!我看不出它有什么用例,但概念很酷。(@tamimio)

关注当前工程限制与兼容性疑问

  • 较多人追问落地细节:演示为什么停在 iOS 16/16.5,iOS 17 之后到底改了什么;能否做出通用于任意 Android 手机的 GSI 镜像;能否绕开 Mac,在 CI 里用 xcodebuild 做 iOS 应用质量管控;App Store 可能因 Android 缺少唯一标识符而无法使用;当前内核下充电完全无效、手机只会掉电。(认可度:较多人)
  • 需要引用时,只用一句中文意译: > 有个小问题:在我们自己的内核下充电还不能用,手机只会掉电。(@1f60c)

认为可借机做出 iOS 版的类 GrapheneOS 系统

  • 有人从这种把 XNU/iOS 跑到非苹果硬件上的思路里嗅到机会,认为可以做出一个类 GrapheneOS 的 iOS 对应物,也就是更注重隐私与自由的 iOS 形态。(认可度:少数人)
  • 需要引用时,只用一句中文意译: > 我好像嗅到了机会:能不能基于这种思路做出 iOS 版的 GrapheneOS?(@hollowonepl)

对 AI 辅助移植感到惊叹并质疑其安全性

  • 少数人提到 Claude 正在通过 adb 操控手机、启动候选内核并检查结果,有人借机调侃 Anthropic 的安全审查已放宽到允许 Claude 帮忙把 iOS 移植到 Android;也有人直接怀疑这类 AI 项目夹带恶意软件。(认可度:少数人)
  • 需要引用时,只用一句中文意译: > 我正用 OnePlus 6T 做同样的事,让 Claude 通过 adb 操控手机、启动候选内核并检查结果。(@nullpoint420)

警惕山寨 iPhone 扰乱二手市场

  • 少数人担心这会让安卓套壳成 iOS 的假旗舰机更泛滥,未来买二手老 iPhone 必须反复验机,以免买到外观像 iOS、实为安卓的复制品;也有人附和说这打开了山寨 iPhone 的大门,大家要非常小心。(认可度:少数人)
  • 需要引用时,只用一句中文意译: > 已经有用安卓套壳成 iOS 的假旗舰机,现在买二手老 iPhone 必须三倍仔细检查了。(@sanid)

质疑项目代币募资模式的动机

  • 有读者注意到项目在 BNB Chain 上发了社区代币,每笔交易抽 1% 费用来支持团队和开发,认为这种“发币募资”模式让项目动机显得可疑。(认可度:少数人)
  • 需要引用时,只用一句中文意译: > 它有个“有趣”的募资模式:项目在 BNB Chain 上发了社区代币,每笔交易抽 1% 费用支持团队和开发。(@jrmg)

有价值的补充

  • 有人(@diimdeep)补充:硬件性能已过剩到未来可以“用任何设备运行任何系统”,唯一拿不到所需访问权限的情况,只剩内容来自云端串流或受硬件加密保护;换言之,跨平台运行的真正边界不在算力,而在云与加密。