不越狱,在 iOS 上能做到哪一步?
搜索「如何在 iPhone 上查看某项信息」,靠前的结果往往会建议您先越狱。有时这确实是唯一的方法,但更多时候,这只是早年的经验之谈:系统早已开放了受支持的通道,这条建议却仍在被反复转述。
弄清这条界线很有必要,因为越狱设备并不适合用于测量:它运行的软件与用户不同,无法通过完整性校验,内存行为也不同,而且无法再回到发布流程中。
受信任的电脑能获取什么
当设备解锁并信任一台电脑后,iOS 会通过这条连接开放一组服务。电脑为设备备份、安装 App、在访达中显示设备,用的都是这些服务。通过它们,您可以获取:
- 性能计数器:每个进程的 CPU、内存、GPU、帧呈现、网络字节数、能耗归因
- 系统与应用的实时日志
- 崩溃报告,包括 jetsam 和看门狗终止
- 应用沙盒:App 自身的 Documents、Library、tmp 目录
- 已安装应用:列出、安装、卸载、启动、终止
- 设备信息:UDID、存储、电池健康度与循环次数、各类序列号
- 描述文件:列出、安装、删除
- 屏幕截图
- 虚拟定位
- 备份:完整备份或部分备份
- 使用与耗电记录,可回溯数月
覆盖范围相当广,且没有任何一项需要改动设备。
真正的限制在哪里
越狱实际带来的能力比通常认为的少得多,而且大多与「测量」无关:
- 读取其他 App 的沙盒。 沙盒由内核强制执行。这才是真正的限制,也是应当存在的限制。
- 对任意进程进行 hook 或打补丁。 即在运行时修改不属于您的代码。
- 绕过平台安全校验,例如证书绑定、完整性证明、越狱检测。
- 超出设备开放范围的完整文件系统访问。
- 内核级插桩。
请注意这份清单中没有的内容:开发者要理解自己的 App 为什么慢、为什么泄漏、为什么崩溃、为什么向磁盘写入了错误内容,所需的几乎一切都不在其中。
为什么「先越狱」的说法一直存在
原因有三,都属于历史遗留。
设备服务多年来缺少完善的文档,因此基于它们的工具很少,基于越狱的工具却随处可见。这条建议在写下时是正确的,而搜索结果会长期留存。此外,「越狱」听起来像是解锁,而「系统本来就开放了这项能力」听起来像是限制,前者更容易让人接受。
少有人提及的代价
越狱设备并不适合作为得出结论的依据:
- 它与用户的设备不同。 运行时环境、保护机制,有时连性能特征都不同。在上面测得的内存数据,并不是用户实际遇到的数据。
- 它无法进入发布流程。 这台设备将永久退出测试流程。
- 每次系统更新都会失效。 测试机被固定在越狱工具支持的 iOS 版本上,而这通常不是用户正在使用的版本。
- 完整性校验会失败。 所有进行校验的功能,例如支付、DRM、企业策略,都会表现异常或直接拒绝运行,导致 App 中的一整类功能无法测试。
- 这是一项安全决策,而做出决策的设备可能并不属于您。
结论
如果您的问题是我的 App 为什么会这样,受支持的通道几乎一定能够覆盖,而且可以在一台原装设备上完成,事后还能交还给测试同事。
如果您的问题是其他 App 在做什么,答案就是沙盒,这是有意为之的设计:阻止您读取他人沙盒的边界,同样阻止了所有人读取您的沙盒。
值得注意的是,第二个问题往往本身就问错了。多数时候,它是某个可以直接测量的问题的替代说法:竞品 App 的性能表现(可以测量)、网络上发生了什么(需要抓包)、某项操作耗电多少(可在历史记录中查看)。为了回答它而越狱,相当于放着更合适的工具不用,选择了一个更差的工具。
