苹果有个usbmux 协议会给自己macOS 程序和设备进行通信,场景有备份iPhone 还有真机调试。macOS 对应的是/System/Library/PrivateFrameworks/MobileDevice.framework/ Versions/A/Resources/ 下的usbmuxd 程序,usbmuxd 是IPC socket 和TCP socket 用来进行进程间通信,这里有他的一个开源实现。对于在手机端是lockdown 来起服务。因此利用usbmuxd 的协议,就可以自建和设备通信的应用比如lookin,实现方式可以参考这个demo 。使用usbmux 协议的libimobiledevice(相当于Android 的adb)提供了更多能力,可以获取设备的信息、搭载ifuse 访问设备文件系统(没越狱可访问照片媒体、沙盒、日志)、与调试服务器连接远程调试。无侵入的库还有gamebench 也用到了libimobiledevice。
instruments 可以导出.trace 文件,以前只能用instruments 打开,Xcode12 提供了xctrace 命令行工具可以导出可分析的数据。Xcode12 之前的时候是能使用TraceUtility 这个库,TraceUtility 的做法是链上Xcode 里instruments 用的那些库,比如DVTFoundation 和InstrumentsKit 等,调用对应的方法去获取.trace 文件。使用libimobiledevice 能构造操作instruments 的应用,将instruments 的能力自动化。 perfdog 就是使用了libimobiledevice 调用了instruments 的接口,实现代码来实现instruments 的一些功能,并进行了扩展定制,无侵入的构建本地性能监控并集成到自动测试中出数据,减少人工成本。无侵入的另一个好处就是可以方便用同一套标准看到其他APP 的表现情况。
要到具体场景去跑case 还需要流程自动化。APPium 使用的是Facebook 开发的一套基于W3C 标准交互协议WebDriver 的库WebDriverAgent,Python 版可以看这个,不过后来Facebook 开发了新的一套命令行工具idb(iOS Development Bridge),归档了WebDriverAgent。
idb 可以对iOS 模拟器和设备跑自动化测试,idb 主要有两个基于macOS 系统库CoreSimulator.framework、MobileDevice.framework,包装的FBSimulatorControl 和FBDeviceControl 库。 FBSimulatorControl 包含了iOS 模拟器的所有功能,Xcode 和simctl 都是用的CoreSimulator,自动化中输入事件是逆向了iOS 模拟器Indigo 服务的协议,Indigo 是模拟器通过machIPC 通道mach_msg_send 接受触摸等输入事件的协议。破解后就可以模拟输入事件了。
MobileDevice.framework 也是macOS 的私有库,macOS 上的Finder、Xcode、Photos 这些会使用iOS 设备的应用都是用了MobileDevice,文件读写用的是包装了AMDServiceConnection协议的AFC 文件操作API,idb 的instruments 相关功能是在这里实现了DTXConnectionServices 服务协议。
libmobiledevice 可以看作是重新实现了MobileDevice.framework。pymobiledevice、MobileDevice、C 编写的SDMMobileDevice , 还有Objective-C 编写的MobileDeviceAccess,这些库也是用的MobileDevice.framework。
以上内容摘自《高德技术2020年刊合集》电子书,点击https://developer.aliyun.com/topic/download?id=1135可下载完成版
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。