ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

simslim作为Go库集成到你的工具链:零依赖iOS模拟器管理API详解

simslim作为Go库集成到你的工具链:零依赖iOS模拟器管理API详解 simslim作为Go库集成到你的工具链零依赖iOS模拟器管理API详解【免费下载链接】simslimRun more iOS simulators on one Mac by disabling background daemons a simulator doesnt need项目地址: https://gitcode.com/gh_mirrors/si/simslimsimslim 是一个 macOS 上的 iOS 模拟器瘦身工具新启动的模拟器默认拉起约 180 个后台服务simslim 把开发测试用不到的守护进程关掉单台模拟器的内存占用大约降至原来的 1/4。更实用的是仓库根目录本身就是一个可导入的 Go 包——零外部依赖、仅用标准库实现——你可以在自己的 CI 脚本、监控工具或 Agent 框架里直接调用它的 API而不必 shell 出去调用命令行。 为什么把 simslim 当库用而不是调用 CLIsimslim 提供的是双形态CLIcmd/simslim/面向人带交互式 TUI依赖 bubbletea 等终端渲染库库仓库根包simslim面向程序go.mod 中的第三方依赖全部服务于 CLI根包本身只导入 Go 标准库。作为库使用时你能获得 CLI 给不了的能力能力说明返回值代替文本流所有 API 返回结构体Device、Status、Measurement等天然带 JSON 标签可直接落库或推给前端Reporter进度回调包从不写 stdout多分钟的重配置过程通过你传入的回调逐行上报slim.go#L12-L20context全程贯穿取消 ctx 即可中止正在进行的瘦身超时可单独调节BootTimeout、SpawnTimeout均为可写变量与业务逻辑同进程无需解析 CLI 输出也避免了simctl别名误用等文本层风险导入只需一行go get github.com/mobai-app/simslim官方示例可直接参考 README.md 的 “Use as a Go library” 一节。 快速开始列出设备并批量瘦身最小可用的接入代码只有三步列出设备 → 构建档案 → 逐台应用。package main import ( context fmt github.com/mobai-app/simslim ) func main() { ctx : context.Background() devices, err : simslim.ListDevices(ctx) if err ! nil { panic(err) } // 保留 siri 与 search 类别其余全部关闭 profile, err : simslim.BuildProfile(, siri,search, ) if err ! nil { panic(err) } for _, d : range devices { if d.State ! Booted { continue } changed, err : simslim.EnableSlim(ctx, d.Set, d.UDID, profile, func(msg string) { fmt.Println(d.UDID, msg) }) fmt.Println(d.UDID, changed:, changed, err:, err) } }三个值得记住的设计约定set参数设备分属default、testing或自定义设备集ListDevices返回的Device.Set要原样传回写操作simctl.go#L164-L177幂等EnableSlim会先读回当前禁用状态再计算差量目标状态已达成时只花一次读取、不做任何重启changed返回值为false表示状态已正确你的工具链可据此跳过后续步骤。 核心 API 速查表按使用频率整理均位于仓库根包API用途源码位置ListDevices/FindDevice枚举全部模拟器 / 按 UDID 定位simctl.go#L164EnableSlim应用瘦身档案并重启持久化slim.go#L179EnableSlimNoReboot只瘦身当前启动会话不重启slim.go#L190DisableSlim恢复出厂服务状态slim.go#L232ReadStatus/DroppedCategories读取已禁用数量与分类明细slim.go#L246Categories/CategoryByID/SlimmableSet15 个可瘦身类别的完整允许清单profiles.go#L32BuildProfile/LoadSlimProfile/SplitList从参数或 JSON 档案文件构建Profileprofile_file.go#L75ResolveFeatures/DiagnoseFeatures把功能名push、storekit…映射到守护进程并体检features.go#L65VerifyProfile校验模拟器是否与档案完全一致漂移检测verify.go#L23Measure/MeasureProcesses/MeasureMany内存足迹phys_footprint汇总与逐进程下钻measure.go#L32DeviceDiskUsage/FleetSnapshot单机磁盘占用 / 全舰队资源快照disk.go#L15、fleet.go#L12Watch守护式瘦身克隆开机即自动瘦身watch.go#L27BootAndWait/Shutdown/WaitShutdown启动并等待服务就绪 / 关机 / 等关机完成simctl.go#L299RenameDevice/EraseDevice/DeleteDevice重命名 / 擦除 / 删除破坏性操作前自动关机simctl.go#L266PersistentOverridesSupported判断该 iOS 版本能否跨重启保留禁用状态slim.go#L168 场景一CI 里不动重启地瘦身已启动的模拟器CI 中模拟器往往已经带着用例跑起来了此时用EnableSlimNoReboot在当前启动会话内逐守护进程 bootout省掉整轮开关机profile, _ : simslim.BuildProfile(ci.json, , ) simslim.EnableSlimNoReboot(ctx, d.Set, d.UDID, profile, nil) // 可传 nil 静默注意iOS 18.5 之前的运行时无法持久化禁用状态重启后会回到出厂状态Status.Persistent字段会明确告知slim.go#L236-L242。 场景二用 JSON 档案文件锁定可复现配置Profile由“保留哪些类别 保留哪些单个守护进程”两个集合构成profiles.go#L388-L409。与项目一起提交档案文件即可让每次运行行为一致{ name: ci, description: UI test runs, except: [search, store], keep: [com.apple.apsd] }LoadSlimProfile会严格校验未知类别、不存在的守护进程标签、拼写错误一律报错失败宁可响亮地失败也不静默放过profile_file.go#L21-L33。 场景三漂移检测与自愈禁用覆盖是模拟器自身的状态删机重建或换运行时后会悄悄回退为出厂状态。把VerifyProfile放进流水线配合幂等的EnableSlim即可实现“检测 → 自愈”res, err : simslim.VerifyProfile(ctx, udid, profile) if err nil !res.OK { // res.Missing / res.Extra 列出具体漂移的标签 simslim.EnableSlim(ctx, d.Set, udid, profile, nil) }它只读不写适合做成独立的 preflight 步骤verify.go#L23-L38。 场景四功能体检——瘦身前确认测试所需能力仍在Features把 push、storekit、universal-links 等 26 项常用能力映射到具体守护进程。瘦身后的模拟器跑用例前先体检一遍feats, _ : simslim.ResolveFeatures(slimslim.SplitList(push,storekit,universal-links)) st, disabled, _ : simslim.ReadStatus(ctx, udid) out : simslim.DiagnoseFeatures(feats, disabled) // out.OK 为 false 即有 BROKEN 项这对应 CLI 的doctor语义让“误瘦掉的依赖”在分钟级发现而不是等测试全挂features.go#L79-L94。 场景五守护 xcodebuild 并行测试克隆xcodebuild -parallel-testing-enabled会为每个 worker 现场克隆一台出厂状态的模拟器克隆不会继承禁用状态。Watch每 3 秒DefaultWatchInterval扫描一次设备集谁开机就并发地给谁做 no-reboot 瘦身失败者下轮重试直到 ctx 取消才退出——这正是把它放进工具链而非脚本里最省事的部分go func() { simslim.Watch(ctx, profile, 0, reporter) // interval 传 0 用默认值 }() // 随后照常执行 xcodebuild ...每个克隆只在启动数秒内释放内存却能保持到整个多分钟测试跑完watch.go#L27-L50。 场景六内存与磁盘度量Measure汇总模拟器 launchd 进程树的全部phys_footprint——与活动监视器同口径、计入压缩与换出页的数值这才是决定“还能塞下几台模拟器”的数字m, _ : simslim.Measure(ctx, udid) // m.Processes, m.Bytes, m.CPU mMany, errs : simslim.MeasureMany(ctx, udids) // 一次 ps 快照服务多台 snap, _ : simslim.FleetSnapshot(ctx, true) // 全舰队内存瘦身状态磁盘适合在 CI 汇总报告或自建监控面板里直接渲染measure.go#L81-L116、fleet.go#L12-L72。⚠️ 工程化注意事项仅限 macOS所有操作经由xcrun simctl驱动需要完整 Xcode命令行工具包不含 simctl超时可调慢速 CI runner 上调大simslim.BootTimeout默认 10 分钟与simslim.SpawnTimeout默认 2 分钟两个包级变量即可设备集除default/testing外可用RegisterDeviceSet(token)注册自定义集ResetDeviceSets()用于测试隔离simctl.go#L50-L72安全边界只允许操作允许清单内的标签核心工作流服务如sharingd永远不会被触碰erase/delete后状态回退为出厂需要重新EnableSlim进度回调非交互场景传nil即可完全静默包本身不产生任何 stdout 输出。 延伸阅读完整 CLI 用法与档案格式README.md各类别内存开销的测量方法docs/category-memory.md磁盘清理的安全模型docs/disk-cleanup.md瘦身核心逻辑slim.go离线覆盖写入disabled_store.go【免费下载链接】simslimRun more iOS simulators on one Mac by disabling background daemons a simulator doesnt need项目地址: https://gitcode.com/gh_mirrors/si/simslim创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表