不越狱,在 iOS 上能走多远?
搜“怎么在 iPhone 上看某某东西”,第三条结果多半会让你先越狱。有时候那确实是唯一的路,但更多时候,那是从“当年确实如此”的年代继承下来的建议,在系统早已开放了受支持的通道之后,仍然被反复转述。
值得搞清楚这条线到底在哪,因为越狱设备是一个糟糕的测量仪器:它跑的不是用户跑的那套软件、过不了完整性校验、内存行为不同,而且它再也回不到发布流程里去了。
一台受信任的电脑本来就能拿到什么
当设备解锁并信任了一台电脑,iOS 会通过这条连接开放一组服务。这些服务和“电脑给手机做备份”、“给它装包”、“在访达里显示它”用的是同一批。通过它们你能拿到:
- 性能计数器 —— 每进程的 CPU、内存、GPU、帧呈现、网络字节数、能耗归因
- 系统与应用的实时日志
- 崩溃报告,包括 jetsam 和看门狗终止
- 应用沙盒 —— App 自己的 Documents、Library、tmp
- 已安装应用 —— 列出、安装、卸载、启动、终止
- 设备信息 —— UDID、存储、电池健康与循环次数、各类序列号
- 配置描述文件 —— 列出、安装、删除
- 屏幕截图
- 虚拟定位
- 备份,完整或部分
- 使用与耗电记录,可回溯数月
这是一个相当大的面,而且没有一项需要改动设备。
墙到底在哪
越狱真正买到的东西,比传说中窄得多,而且大部分不是“测量”:
- 读另一个 App 的沙盒。 沙盒由内核强制执行。这就是那堵墙,而且是应该存在的墙。
- 对任意进程做 hook 或打补丁。 对你不掌握的代码做运行时改写。
- 绕过平台安全校验 —— 证书绑定、完整性证明、越狱检测。
- 超出设备开放范围的完整文件系统访问。
- 内核级插桩。
注意这份清单上没有的东西:几乎所有一个开发者理解自己的 App 为什么慢、为什么漏、为什么崩、为什么往磁盘写错东西所需要的一切。
为什么“先越狱”的说法一直在
三个原因,都属于历史遗留。
设备服务多年缺少像样的文档,所以用它们的工具很少,用越狱的工具遍地都是。那条建议写下来的时候是对的,而搜索结果的寿命很长。再者,“越狱”是一个让人满意的答案 —— 它听起来像解锁,而“系统本来就开放了这个”听起来像限制。
没人提的代价
越狱设备是一个很差的下结论的地方:
- 它不是用户手上的东西。 运行时不同、保护机制不同,有时性能特征也不同。在上面量到的内存数字,不是用户拿到的那个。
- 它没法进发布流程。 这台设备永久出局。
- 每次系统更新都会坏。 你的测试机被钉在越狱工具支持的那个 iOS 版本上,而那通常不是用户在用的版本。
- 完整性校验会失败。 任何做校验的东西 —— 支付、DRM、企业策略 —— 行为都会不同或者直接拒绝运行,于是你 App 里的一整类功能变得不可测。
- 它是一个安全决策,而做决策的那台设备可能并不属于你。
老实的结论
如果你的问题是我的 App 为什么会这样,受支持的通道几乎肯定覆盖得了,而且是在一台事后还能还给测试同事的原装设备上。
如果你的问题是别人的 App 在干什么,答案就是沙盒 —— 而且这是设计使然:拦住你读别人沙盒的那道边界,同时也拦住了所有人读你的。
有意思的是,第二个问题通常本来就问错了。多数时候它其实是某个可以直接测的东西的替代问法:竞品 App 的性能表现(可测)、网络上发生了什么(抓包的活)、某件事耗多少电(在历史记录里)。为了回答它去越狱,是给一个本来有更好仪器的问题,选了一个更差的仪器。
