Một nhóm dev vừa làm được thứ mà nhiều người nghĩ chỉ có trong video concept: chạy userland iOS 16 thật trên một chiếc điện thoại Android. Repo dipa-studio/ios-sweet port nhân XNU mã nguồn mở (bản xnu-8796, thế hệ iOS 16) lên Xiaomi Redmi Note 10 Pro, mã máy `sweet`, chip Qualcomm SM7150 / Snapdragon 732G. Trên nhân đó là userland iOS 16.7.16 (build 20H392) nguyên bản lấy từ iPhone X, gồm launchd, các system daemon, backboardd, SpringBoard và đám app stock.
Tính đến 2026-10-18, máy đã boot được tới màn hình home của iOS. Mở khóa được, vào Settings, kéo Control Center và notification center, chạm cảm ứng và bấm phím cứng đều ăn. Toàn bộ phần render chạy bằng CPU, không có GPU driver nào. Tác giả ghi rõ ngay trong README: đây là thử nghiệm bring-up, chưa phải hệ điều hành dùng được hàng ngày.
Nó làm gì, cụ thể
Bài toán ở đây không liên quan gì tới giả lập iOS. Họ chạy nhân XNU thật, với driver thật, trên phần cứng Snapdragon thật, rồi nạp lên đó root filesystem của iPhone X. Chuỗi boot trông như sau:
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
Chi tiết đáng nói: không flash gì vào partition boot. Bootloader stock của Xiaomi (đã unlock) nạp một shim qua `fastboot boot`, shim này tự set MMU, đọc FDT đang sống, rồi load XNU kèm Apple Device Tree sinh tự động. XNU chạy driver UFS tự viết, mount volume HFS+ journaled nằm trong partition `userdata`, và từ đó dyld + shared cache + launchd khởi động dây chuyền daemon y như trên iPhone.
Phần cứng đã lên được: 6 trong 8 nhân (sáu Cortex-A55) qua PSCI, page size 16K, ngắt GICv3, timer. Bộ nhớ dùng khoảng 3.95 GiB bank DDR phía trên. Màn hình hiển thị qua kernel IOSurface + IOMobileFramebuffer (`AppleCLCD`), CoreAnimation render bằng software rồi copy frame vào framebuffer mà bootloader để lại, và iOS nhìn thấy panel như iPhone X (1125×2436). Cảm ứng là Goodix GT9896 qua I²C (GENI), phím nguồn và volume đi qua PMIC/SPMI thành HID consumer key. Máy nhận mình là iPhone X (`iPhone10,3` / `D22AP`), nên UI là gesture, không có nút Home. Activation dùng đường “Hactivation” nội bộ của mobileactivationd, không đụng server Apple.
Vì sao repo này đang được chú ý
522 sao sau 5 ngày (tạo 2026-10-14, cập nhật 2026-10-19) là con số không tệ cho một repo không có topics, license không rõ, và chủ yếu là Python trong khi phần lõi là C/Objective-C. Người ta bấm star vì bằng chứng chứ chẳng phải code đẹp: ảnh chụp màn hình home screen iOS thật trên máy Xiaomi, boot được, chạm được, khóa máy được.
Cộng đồng hack iOS từng có những dự án kiểu này (iPorting, các thử nghiệm XNU trên ARM board), nhưng đa số dừng ở mức kernel panic hoặc boot tới console. Việc lên được SpringBoard, mở Settings, kéo Control Center là một mốc khác hẳn. Và nó làm trên một mẫu máy phổ thông, mua được ngoài chợ, không phải dev kit đắt tiền.
Thử nhanh: cần gì và làm gì
Yêu cầu: Redmi Note 10 Pro (`sweet`, bản global hoặc Indian, SM7150), bootloader đã unlock, một máy Linux, và tài khoản GitHub để build kernel trên CI. Toàn bộ dữ liệu trên `userdata` sẽ mất. Bootloader, recovery, modem, persist không bị đụng.
Bước 0 là backup. Boot tạm OrangeFox (hoặc recovery nào có adb root) và pull tối thiểu `persist`, `modemst1`, `modemst2`, `fsg`, `fsc`, `boot`, `dtbo`, `vbmeta`. Đây là calibration riêng của từng máy, mất là khó cứu. Shim cần DTB stock, unpack từ `boot.img`:
python3 tools/unpack_bootv2.py backup/boot.img dtb/boot_unpacked # -> dtb/boot_unpacked/dtb
Bước 1, build kernel. Kernel build trên macOS runner của GitHub với blacktop/darwin-xnu-build. Workflow fetch xnu-8796, áp các patch trong `xnu/patches/` theo thứ tự, và stage thêm libpthread, HFS, BearSSL bản open source đã pin. Fork repo (repo public được free macOS minutes) rồi chạy:
gh workflow run xnu.yml -R YOU/ios-sweet
gh run download RUN_ID -R YOU/ios-sweet -n xnu-kernel -D xnu/out
Muốn test patch trước khi tốn một lượt CI thì dùng `tools/xnu-cc.py`, nó replay lại lệnh compile từ log CI cũ cho từng file đơn lẻ.
Bước 2, dựng root image iOS. Tải IPSW iPhone X (iPhone10,3) iOS 16.7.16 (20H392) từ Apple. Trên Linux cần `apfs-fuse`, `hfsprogs` và sudo:
# 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` gộp volume OS và hai cryptex vào một volume HFS+ case-sensitive journaled, thêm link dyld cache, keybag hệ thống dạng plain và các thư mục log mà daemon chờ đợi. `sweet-root-tweaks.py` áp các thay đổi bring-up: bỏ qua Setup, seed trạng thái activation, v.v.
Một chi tiết thực dụng: board này không có serial port (debug UART đi dây như SPI), nên kernel vẽ console vào framebuffer mà ABL để ở `0x9c000000`, đồng thời giữ một log ring 4 MiB ở cuối `userdata`. Đọc log bằng `tools/sweet-log-pull.sh` từ OrangeFox recovery, khỏi phải quay phim màn hình.
Ai nên quan tâm, dùng vào việc gì
Đừng ai lấy máy này làm máy chính. Thứ này hợp với người làm kernel, người viết driver ARM, người nghiên cứu porting giữa hai thế giới nhân. Cụ thể hơn: dev muốn có một môi trường XNU thật để test driver UFS, test interrupt controller, test cơ chế boot chain, mà không cần mua iPhone hay Mac. Sinh viên học hệ điều hành có thể đọc patch, đọc shim, hiểu cách một bootloader stock nạp được một nhân lạ. Người làm security research có một bàn thử nghiệm để xem AMFI hay sandbox hoạt động thế nào khi bị “tắt bớt” có chủ đích.
Còn nếu bạn tò mò muốn cài lên máy cá nhân để “dùng iOS giá rẻ” thì bỏ đi. Không có Wi-Fi, không Bluetooth, không sóng, không âm thanh, không camera, không cảm biến, không GPS, không SEP/Face ID. Không App Store, không Apple ID, nhiều trang Settings trống. Boot mất khoảng 4 phút ở logo Apple. Và bạn không thoát ra khỏi app được, vì gesture home với AssistiveTouch Home chưa hoạt động.
Ưu, nhược, và mấy điều phải biết
Ưu điểm thật: tài liệu trong README chi tiết đến mức hiếm gặp, có bảng what works / what does not, có mô tả chuỗi boot, có hướng dẫn backup trước khi nghịch, có tool kéo log. Code Python đóng gói phần build và xử lý root image, nên quy trình tái lập được thay vì “làm theo video 30 phút”. Việc không flash boot partition là quyết định thiết kế đúng, giảm rủi ro brick.
Nhược điểm: license không rõ, đây là vấn đề lớn nếu bạn định dùng lại code trong dự án khác. Repo mới 5 ngày tuổi, chưa có API ổn định, patch có thể đổi bất cứ lúc nào. Tài liệu đủ để làm theo đúng một cấu hình máy, biến thể khác hoặc firmware khác có thể phải sửa. Hai nhân Cortex-A76 chưa dùng, GPU chưa có, framerate 20-30 fps hoàn toàn bằng CPU. Bảo mật gần như tắt hết: code signing (AMFI) permissive, sandbox nới, AppleKeyStore chỉ là stub, không data protection. Tác giả nói thẳng: đừng bỏ dữ liệu cá nhân lên đó.
Một lo ngại cá nhân: việc dùng userland iOS lấy từ IPSW của Apple đặt repo vào vùng xám pháp lý, dù repo chỉ phân phối tool và patch, không ship file Apple. Ai định fork hay đóng gói lại nên đọc kỹ phần này trước.
Kết luận thực dụng
Nếu bạn là dev kernel hoặc người mê porting hệ điều hành, repo này đáng để clone, đọc shim và đọc mấy file patch trong `xnu/patches/`. Còn nếu bạn chỉ muốn một chiếc điện thoại chạy được, 522 sao và màn hình home iOS trên Redmi Note 10 Pro chỉ là điểm khởi đầu của một thử nghiệm bring-up, chưa phải sản phẩm. Link: dipa-studio/ios-sweet.
