在设备上的行为
检查一个 App 不应改变它的行为。这一页准确说明 CutawayServer 在你的 App 里做了什么。
网络
- 它只在回环地址
127.0.0.1上监听 TCP,从不在其他网络接口上监听。网络上的其他设备连不上它。 - 在模拟器里,Cutaway 经 Mac 的回环地址连到它。在设备上,Mac 经 USB 连接、借助 macOS 的
usbmuxd连到它;服务端自己对 USB 一无所知。 - 它用 48160 至 48167 中第一个空闲的端口。如果全都被占用,它就不监听,等 App 下一次变为活跃时再试。
- 如果运行中监听失败(例如 App 从挂起中恢复之后),它在 App 活跃时 0.5 秒后重新监听,优先用原来的端口。再失败时间隔加倍,最长 30 秒。
- 它一次只服务一个客户端。第一个连着时,第二个会被拒绝。
- 连接使用 TCP keepalive:约 25 秒不回应的对端会被断开,服务端随即可以接受下一个客户端。
线程与内存
- 只有必须接触 UIKit 和 Core Animation 的工作在主线程上运行,一次一个图层,所以 App 在图层之间能处理事件。压缩、编码和网络都在后台队列上运行。
- Cutaway 跟不上时,内存保持在上限之内:一旦还没发出的数据加上等待压缩的图像超过 32 MiB,服务端就不再开始新的图像和下一个请求,直到 Cutaway 赶上来。有 64 个请求在等待时,它停止读取。
- 图层和视图都是弱引用,连接关闭时它持有的一切都会释放。
- 格式错误的数据和极端的请求以错误回答,不会让 App 崩溃。
实测的数字见性能一页。
截取
- 层级。 成员变量名(例如
titleLabel)是通过比较持有者内存里的地址找到的,不调用任何 getter。限制列出了这样找不到的引用。 - 图像。 每个图层单独渲染。渲染一个图层时,服务端临时把它的不透明度设为 1 并让它可见;拍不含子图层的图像时,临时隐藏子图层。这些都在同一段主线程代码里恢复,没有动画,也不触发布局。
- 属性。 读取属性不会触发布局。颜色以 sRGB 发送,所以广色域的颜色会被截断;动态颜色按视图当前的外观(浅色或深色)解析,CutawayServer 1.2 起两种外观都解析。
Cutaway 断开之后还留下什么
| 连接关闭之后 | |
|---|---|
| 你对属性做的修改 | 保留。服务端既不记录也不还原它们;它们是对 App 运行状态的修改,和别的修改一样。 |
| 环境的改写(外观、文字大小、布局方向、尺寸类别) | 被去掉。无论连接因何关闭,服务端都会恢复 App 自己的值。App 因特征变化而做的事属于 App 自己,不会被撤销。 |
