在Apple Silicon Mac上同时跑几个移动模拟器,本质上是内存问题。而其中一部分压力,来自模拟器默认镜像,而不是被测应用本身。

iOS模拟器用的是消费级设备镜像,里面带着QA会话可能永远碰不到的后台服务。Android模拟器则捆绑了开机就启动的Google应用,不管测试有没有打开它们。这些默认设置对一台"像消费设备一样工作"的镜像来说是合理的,但在跑多个测试会话的开发Mac上,它们基本就是纯成本。

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

tapflow的Lean模式想削减的就是这部分后台负载。它没有把一切都关掉,而是保留了一部分镜像原样——这个选择,代价是放弃了大部分本可省下的内存。

基准线:全部关掉能省多少

对比的基准是simslim的默认行为:全部禁用,保留什么交给用户自己决定。全部关掉,每台设备少用50%的内存。

但保留壁纸和小组件会改变这笔账。它们是simslim所节省内存中的675 MB,占了其测量总量的大部分。把它们留着,就等于把这部分省下的内存让了出去。

simslim清单上有一个标签停不掉。com.apple.siri.context.service不是launchd守护进程,所以override存储无法停止它。加一条override再测,服务照旧运行,于是这个标签被有意排除在tapflow的清单之外。

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在启动前写入override,关闭模拟器时移除。之后从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。