Skip Setup
全新的 Data 种子首次启动会进入 Setup。负载可以在写镜像前把 Setup 标记为完成,让设备直接进入 SpringBoard。
命令
./unixnu build payload \
--data-ramdisk data.dbr \
--skip-setup \
--trust-cache trustcache.img \
--unique-chip-id <hex>--skip-setup 需要 --data-ramdisk。负载步骤读取板级文件中的 [payload] skip_setup_tool,并在种子副本上运行。
[payload]
skip_setup_tool = "scripts/seed-data-skip-setup.py"原始种子保持不变。负载使用修改后的副本作为 Payloads/scratch-data.img。
工具修改的内容
scripts/seed-data-skip-setup.py 展开打包的 APFS Data 种子,以读写方式挂载,把偏好合入 /private/var/mobile/Library/Preferences,然后重新打包。
| 偏好文件 | 值 |
|---|---|
com.apple.purplebuddy | SetupDone = true、SetupFinishedAllSteps = true、SetupVersion = 11、daemonizeNeedsToRun = false |
com.apple.purplebuddy.notbackedup | 所有 mini-buddy 标志设为 false:diagnostics、HSA2、keychain sync、Mesa、payment、standard、silent ICDP |
com.apple.managedconfiguration.notbackedup | LockdownActivationIndicatesCloudConfigurationAvailable = false |
com.apple.springboard | BKNoWatchdogs = true、FBLaunchWatchdogExceptions = { com.apple.purplebuddy: 100 }、MCForceShowCloudConfigurationUI = false |
com.apple.migration | LastSystemVersion = 21H461、DMUserDataDisposition = { SyntheticDidUpgrade = false, buildVersion = 21H461 } |
工具还会在 /private/var/containers 下创建目录:
Bundle
Data/System
Shared/SystemGroup
Temp卷 UUID 保持不变。修改后再次检查 APFS 容器 magic。
构建版本
脚本设置:
BUILD, VERSION = '21H461', '17.7.11'板级目标换成其他 iOS build 时,同时更新这两个值。LastSystemVersion 和 DMUserDataDisposition.buildVersion 必须与 IPSW 一致。
设备树
使用 --ipad-identity 时,ADT 会加入四个 /chosen 属性:
| 属性 | 值 |
|---|---|
certificate-production-status | 0 |
effective-production-status-ap | 0 |
certificate-security-mode | 1 |
effective-security-mode-sep | 1 |
这些属性描述一个 dev-fused、未 demote 的板子。mobileactivationd 通过 MobileGestalt 读取它们,在没有激活记录时走原生激活路径。
任务
Setup 依赖的服务在这个平台上不运行。板级文件用启动参数停掉它们:
sheng-disable-jobs=com.apple.identityservicesd,com.apple.locationd,com.apple.CommCenter,com.apple.iconservices.iconservicesagentcom.apple.CommCenter 是蜂窝服务。列表是板级配置。保留用户态需要的服务,移除阻塞首次启动的服务。
输出
负载目录包含:
out/<board>/payload/data-skip-setup-<hash>.dbr
out/<board>/payload/payload.img
out/<board>/payload/payload.jsonpayload.json 记录:
| 字段 | 含义 |
|---|---|
data_ramdisk_sha256 | 修改后种子的哈希 |
skip_setup | true |
payload_sha256 | 负载镜像哈希 |
修改后的种子按原始种子的哈希缓存。换一个种子会生成新文件。
验证
- 用
--skip-setup构建负载。 - 检查
payload.json的"skip_setup": true。 - 启动镜像。
- 日志到达 SpringBoard,不再停留在 Setup 页面。
参考实现是本仓库的 scripts/seed-data-skip-setup.py。sheng 移植在 blu-sharky/sheng-ipados 的提交 5eba9f5 中记录了使用这些改动的首次硬件启动。