XNU 内核移植红米 Note 10 Pro,成功运行 iOS 16
开发者将苹果开源 XNU 内核移植到红米 Note 10 Pro(骁龙 732G),运行未经修改的 iPhone X 版 iOS 16.7.16 用户空间,10 月 18 日已可启动至 iOS 主屏,支持触摸与实体按键操作。
目前画面全靠 CPU 渲染(约 20–30 帧/秒),尚无 GPU 驱动,Wi-Fi、相机等暂不可用;代码已开源在 GitHub。
github:https://github.com/dipa-studio/ios-sweet

苹果iOS 16系统运行在Redmi Note 10 Pro上。
本项目将苹果开源的 XNU 内核(xnu-8796,iOS 16 版本)移植到小米 Redmi Note 10 Pro(sweet高通骁龙 732G/SM7150)上。在此基础上,运行未经修改的 iPhone X iOS 16.7.16 (20H392) 用户空间:包括 launchd、系统守护进程、backboardd、SpringBoard 和系统自带应用。
截至2026 年 10 月 18 日,手机启动后直接进入iOS 主屏幕。您可以解锁手机、打开“设置”、下拉控制中心和通知中心,并使用触摸屏和硬件按键。渲染完全由 CPU 完成;没有 GPU 驱动程序。
这只是实验性的启动版本,并非可用的手机操作系统。许多功能缺失或仅为占位符(详见下文),并且苹果的安全模型大部分已被关闭。它会安装到userdata分区中,因此会擦除安卓用户的数据。
哪些功能(目前)还无法正常工作?
导航:您无法离开应用程序(主屏幕手势和辅助触控主屏幕目前还没有任何作用)。
无法使用 Wi-Fi、蓝牙、蜂窝网络、音频、摄像头、传感器、GPS 或 SEP/Face ID。这些功能的守护进程启动后会失败或不断重新启动。
没有独立显卡。所有画面都由CPU绘制,帧率大约在20-30帧。两个Cortex-A76核心目前尚未被使用。
应用很少。镜像中只包含系统卷上的应用。没有 App Store,没有 Apple ID,部分设置页面也是空的。
启动速度慢:停留在苹果标志界面约 4 分钟。
安全设置已关闭:采用宽松的代码签名(AMFI)和沙盒策略,仅提供简易的 AppleKeyStore,不提供任何数据保护。请勿在其中存储任何个人信息。
启动方式
ABL (stock Xiaomi bootloader, unlocked)
-> fastboot boot shim-boot.img (temporary; nothing is flashed to boot)
-> shim: own MMU setup, reads the live FDT, loads the payload from the ramdisk
-> XNU Mach-O + generated Apple Device Tree (ADT) + boot-args
-> XNU -> UFS driver -> HFS+ root in the userdata partition
-> dyld + shared cache -> launchd -> daemons -> backboardd + SpringBoard
此板卡上没有串口(调试 UART 接口通过 SPI 连接)。内核会将控制台内容绘制到 ABL 留下的帧缓冲区中0x9c000000,并在末尾保留一个 4 MiB 的持久日志环userdata。您可以使用 OrangeFox Recovery 读取该日志tools/sweet-log-pull.sh,因此无需录制屏幕。
如何自己动手
你需要一台已解锁引导程序的Redmi Note 10 Pro(sweet全球版或印度版,SM7150)、一台 Linux 电脑以及一个用于内核构建的 GitHub 账号。以上截图中使用的路径与此完全相同;其他版本或固件可能需要更改。所有数据都将丢失。引导程序、恢复分区、调制解调器分区和持久分区均不会被修改。userdata
0. 备份手机
暂时启动 OrangeFox(或任何带有 adb root 权限的恢复模式) ,并拉取至少persist、modemst1、modemst2、fsg和、。它们包含每个设备的校准数据。不要将它们添加到 git 仓库;已经排除了、和。fscbootdtbovbmeta.gitignorebackup/dtb/recovery/
该垫片需要原厂 DTB 文件。请解压手机的原厂 DTB 文件boot.img:
python3 tools/unpack_bootv2.py backup/boot.img dtb/boot_unpacked # -> dtb/boot_unpacked/dtb
1. 构建内核
该内核在 GitHub 的 macOS 运行器上使用blacktop/darwin-xnu-build构建。工作流程会获取 xnu-8796,xnu/patches/按顺序应用,并预先加载所需的已锁定的开源 libpthread、HFS 和 BearSSL 源代码。fork 此仓库(公共仓库可获得免费的 macOS 使用时长)并运行:
gh workflow run xnu.yml -R YOU/ios-sweet
gh run download RUN_ID -R YOU/ios-sweet -n xnu-kernel -D xnu/out
为了在 CI 运行之前在本地检查补丁,tools/xnu-cc.py它会重放先前 CI 日志中单个文件的编译命令。
2. 构建 iOS 根镜像
从 Apple 下载 iPhone X (iPhone10,3) iOS 16.7.16 (20H392) IPSW 文件。然后在 Linux 系统上,使用apfs-fusesudohfsprogs命令:
# OS, SystemOS and AppOS disk images from the IPSW (see BuildManifest.plist for their names)
tools/mkiosroot.sh OS.dmg SystemOS.dmg AppOS.dmg ios16-root.img 16G
sudo fsck.hfsplus -fy ios16-root.img
sudo mount -t hfsplus -o loop,force ios16-root.img /mnt/iosroot
sudo python3 tools/sweet-root-tweaks.py /mnt/iosroot
sudo umount /mnt/iosroot
img2simg ios16-root.img ios16-root.simg
mkiosroot.sh将操作系统卷和两个加密文件复制到一个区分大小写的带日志的 HFS+ 卷中。它添加了 dyld 缓存链接、纯系统密钥包以及守护进程所需的日志目录。sweet-root-tweaks.py应用启动更改:跳过设置过程,初始化激活状态,移除基带守护进程,禁用用于终止运行缓慢的应用程序和导致崩溃循环的媒体路径的监视程序等等。脚本的头部解释了每一项更改。
设备树构建器会复制/product真实的 iPhone X 设备树,这是 MobileGestalt 所需要的。只需提取一次,无需下载整个 IPSW 文件:
python3 tools/remotezip.py IPSW_URL DeviceTree.d22ap.im4p research/ipsw-x/dt
ipsw img4 im4p extract research/ipsw-x/dt/Firmware/all_flash/DeviceTree.d22ap.im4p -o research/ipsw-x/d22ap.adt
3. 构建启动镜像
需求aarch64-linux-gnu-gcc和mkbootimg。
python3 tools/mkadt.py shim/out/sweet.adt --highmem
python3 tools/mkpayload.py xnu/out/kernel.development.sweet shim/out/sweet.adt shim/out/payload.bin \
--cmdline 'debug=0xc serial=3 cpus=6 keepsyms=1 -enable_kprintf_spam -noprogress rd=ufsroot0 unentitled_ios_sim_launch=1 ignition_level=1 wdt_test=no_user_checkin ufsrw=1 rootrw=1 launchd_unsecure_cache=1 wdt=-1 sweetfb_noconsole=1 sweetfb_hz=30'
shim/build.sh ../shim/out/payload.bin # -> shim/out/shim-boot.img
不太明显的启动参数的作用:
启动参数 影响
rd=ufsroot0 ufsrw=1 rootrw=1 分区上的根目录userdata,可写
cpus=6 启动六个 A55 核心;cpus=1这是安全备用方案。
launchd_unsecure_cache=1 launchd 接受其作业缓存,而无需 AMFI。
wdt=-1 wdt_test=no_user_checkin 没有硬件看门狗
sweetfb_noconsole=1 停止在图形用户界面上绘制内核文本。内核文本仍然会写入持久日志;内核崩溃信息仍然会显示在图形用户界面上。
sweetfb_hz=30 CPU副本面板刷新率
sweettouch=0,sweetkeys=0 禁用触摸或按钮驱动程序
4. 刷入root文件并启动
fastboot -S 512M flash userdata ios16-root.simg # ~7 minutes; do not unplug
# Xiaomi's fastboot often hangs after a large flash: re-enter fastboot with Power + Volume down
fastboot boot shim/out/shim-boot.img
首次启动时,屏幕会停留在苹果标志界面约 4-5 分钟,然后出现锁屏界面。向上滑动即可解锁。要返回 Fastboot 模式,请同时按住电源键和音量减键。
5. 阅读内核日志
fastboot boot recovery/recovery.img # OrangeFox, temporary
tools/sweet-log-pull.sh logs/boot.txt # 4 MiB console ring from the end of userdata
adb reboot bootloader
日志包含崩溃报告及回溯信息(CRASH name ...)、backboardd 和 SpringBoard 的 IOKit 跟踪信息以及驱动程序的SWEET ...行。tools/sweet-crash.py它们与共享缓存进行符号化。
QEMU
tools/qemu-sweet.py在 QEMU 上使用测试 RAM 磁盘根目录启动相同的内核virt。它适用于仅修改内核的情况;请参阅NOTES.md。





