在 Apple Silicon 的 Mac 上同时跑几个移动模拟器,本质上是个内存问题。压力有一部分来自默认镜像,而不是被测应用本身。 iOS 模拟器用的是消费级设备镜像,里面包含 QA 会话可能永远碰不到的后台服务。Android 模拟器则捆绑了开机自启的 Google 应用,不管测试有没有打开它们。 这些默认设置对一台“像消费设备一样行为”的镜像来说合理。但在跑多个测试会话的开发 Mac 上,它们基本就是纯成本。 tapflow 的 Lean 模式就是冲着这部分后台负载去的。它没有把一切都关掉,而是保留了一部分镜像内容——这个选择,代价是放弃了大部分本可节省的内存。 对比对象是 simslim 的默认行为:全部禁用,保留什么由用户自己决定。全部禁用能让每台设备少用 50% 的内存。 保留壁纸和小组件会改变这笔账。它们是 simslim 节省总量中的 675 MB,占了其测得总量的绝大部分。把它们留着,就等于放弃了这一块。 simslim 清单上有一个标签停不掉。com.apple.siri.context.service 不是 launchd 守护进程,覆盖存储停不了它。加了一条覆盖规则并实测后,该服务仍在运行,所以这个标签被有意排除在 tapflow 的清单之外。 壁纸和小组件是测试者能看到的东西。一些常见的应用依赖也应该继续工作。一个打开相册选择器、调用 StoreKit、接收推送或使用通用链接的测试,不该因为开了某个内存选项而失败。 Lean 模式改用一份固定清单,逐条从 simslim 的分类里挑选。在 iOS 上,它禁用 99 个 launchd 标签,覆盖 Siri、遥测、健康、照片分析等后台工作,也包括 iMessage 和 FaceTime 组。壁纸和小组件保持启用,CloudKit、StoreKit、推送、HealthKit、相册选择器、通讯录、日历和通用链接等服务同样保留。 这套选择在 iOS 27 上实测每台 iOS 模拟器少用约 25% 内存,大约 0.5 GB。Lean 模式需要 iOS 18.5 或更高版本的运行时,默认关闭,在 tapflow.config.json 里启用: { "agent": { "lean": true } } 也可以用 TAPFLOW_LEAN=on,或者让 tapflow init 来问。如果某个应用需要被禁用的服务之一,就关掉 Lean 模式跑。 计数背后还有个细节:99 个标签里有两个在实测环境中本来就是关的。这是 2026 年 9 月 25 日在 macOS 26.5 和 27.0 上的测量结果,不是每个运行时的永久属性。随着 Apple 改动模拟器,这份清单和它的内存结果可能还需要再看。 Android 这边机制不一样。Android 的 Lean 模式禁用模拟器里四个捆绑 Google 应用:Google、YouTube、YouTube Music 和 Digital Wellbeing。在 API 34 模拟器上,这让 Mac 的内存占用减少约 350 MB,而 guest 总共触及的内存约 2 GB。 机制和 iOS 不同。Android 在模拟器退出时才把内存还给 Mac,所以在已经运行的模拟器里禁用包,无法立刻产生节省。tapflow 把 Lean 状态记录在模拟器里,在启动时应用包变更。内存下降从第二次通过 tapflow 启动开始。 这个区别在核对结果时很重要。会话请求时已经在运行的 Android 模拟器,就按原样使用,它会在下一次通过 tapflow 启动时变 lean。Lean 模式开启期间,即使从 Android Studio 打开模拟器,这些包也保持禁用。关掉 Lean 模式,它们会在下一次 tapflow 启动时恢复。 主屏会失去 Google 搜索栏,助手也没了。发送 ACTION_WEB_SEARCH 的应用找不到处理者。语音输入仍然可用,因为由其他应用提供。Photos、Messages、Gmail 和 Maps 保留,因为应用要通过它们打开图片、短信、邮件和地图。 Lean 模式适用于 tapflow 通过其 agent 启动的设备。已经运行的模拟器或仿真器保持当前状态,直到下一次通过 tapflow 启动。tapflow boot 启动模拟器时不经过 agent,所以不会应用 Lean 设置。 在 iOS 上,tapflow 在启动前写入覆盖,并在关闭模拟器时移除它们。之后从 Xcode 或 Simulator.app 打开该模拟器,服务会重新运行。Android 把包状态保存在模拟器里,所以 Lean 模式开启时,从别处打开模拟器,被禁用的应用仍保持禁用。 iOS 的内存结果能帮一台 Mac 在开始交换之前多撑几个模拟器。我没有对 Android 做这个断言。Android 的测量描述的是内存减少,并不能证明并发设备数更高。 Lean 模式也不会让模拟器更快。它移除了后台工作,并在上述条件下降低内存压力。当替代方案是交换时,更低的内存占用是有用的,但这和启动时间更短或测试执行更快是不同的说法。 99 个标签的 iOS 清单放弃了全部关闭所能节省的大约一半。这个代价换来的是一台仍然接近应用所期望环境的模拟器。壁纸和小组件还在,常见的应用服务也仍然可用。tapflow 自身的流式传输、输入、UI 树、剪贴板、音频、安装、深链接和网络控制都在 lean 模拟器上检查过。 Lean 模式是主机层面的选择,带一份固定的关闭服务清单。它无法推断应用需要什么。如果某个测试依赖被禁用的服务,正确的做法是用 Lean 模式关掉来跑那个会话。 npm install -g tapflow tapflow init tapflow start 在 tapflow init 询问时把 agent.lean 设为 true,或者自己加到 tapflow.config.json 里。用 tapflow doctor ios 查看 Lea

打开网易新闻 查看精彩图片