iOS 测试 [腾讯 TMQ] iOS 测试利器-idb

匿名 · 2018年01月16日 · 最后由 蓝蓝 回复于 2020年08月27日 · 4432 次阅读

作者:樊林

团队:腾讯移动品质中心 TMQ

导读

对于 android 的开发以及测试人员,对 adb 命令一定会很熟悉,adb 工具可谓 android 测试的入门神器,安装、卸载、抓 log、截图等等一应俱全。很多自动化以及性能工具都一定程度上要依赖 adb 工具。

刚开始接触 iOS 时,一直希望 iOS 有一套类似 adb 工具的东西,结果都被告知要用 itools、ituns 类的图形化界面工具。后来经过研究,要在 iOS 上实现一套类 adb 工具理论上是没有问题,有很多开源库可以使用,所以就做了一套 idb 出来(目前适用于 windows 平台),作为 iOS 的测试的基础工具,主要实现了两个功能。

1、让用户可以使用 idb 对 iOS 手机进行基础的操作,就如同使用 adb 操作 android 手机;

2、封装好了一键抓取网络包(生成 pcap 文件)以及 log 的方式,提高相应的效率。

完整 idb 工具下载地址(仅供交流学习):
https://share.weiyun.com/f28c0e8f6fbd240cdb3006da7fc56699

原理

iTunes 是如何连接手机的?

第一步:首先通过 usbmux 技术,和手机建立连接。usbmux 是一种可以通过 usb 管道(也就是一个 usb 端口)建立多路复用连接的系统。这是一个类 TCP 系统,通过这种系统,主机的端口号可以和手机中的特定端口号建立连接并通信。

第二步:连接手机的 lockdown 服务,对应的端口号为 62708,然后通过和 lockdown 服务传输数据,实现相应的功能。这个服务通常只能通过 usb 端口建立相应的 tcp 连接(也就是第一步说的 usbmux 系统)。Lockdown 服务可以用来做很多事情,安装应用、查看文件、重启等等。

通信协议从低到高如下:

1、USB 协议:通过 usb 端口传输多个连接的数据,类似于网络中的数据链路层;

2、usbmuxd 协议:打开设备上 TCP 端口连接,类型于网络中的运输层;

3、lockdownd 协议:用于和 lockdown 服务传输数据,类似于网络中的应用层。

idb 原理介绍

了解到 iTunes 的原理后,很多人便开始自己开发一些库,实现一样的功能,最有名的就是 libimobiledevice 是基于 C 语言实现的,编译配置比较麻烦,学习成本也较高。后来也出了对应的 python 库,即 pymobiledevice。idb 就是基于这个 python 库实现的。

idb 架构设计上分为 5 层:

1、usbmux 层:usb 驱动层;

2、PlistService 层:连接建立层,调用 usbmux 层,完成连接的建立,示例代码如下:

self.s = mux.connect(dev, 62708);

3、Locdown 封装层:封装好基本的 lockdwon 服务,并完成和手机的配对验证;

4、功能实现层:通过 lockdown 实现对应的功能,核心示例代码如下:

实现安装功能
self.lockdown.startService("com.apple.mobile.installation_proxy")

实现文件相关功能
self.lockdown.startService("com.apple.mobile.house_arrest")

5、命令行工具封装层:工具的初衷是为了开发一套类似 android 的 adb 的工具,这一层主要仿照 adb,实现对应命令行参数的解析并调用功能实现层,完成对应的功能。

遇到的问题及解决方案

工具交互方式的选择以及如何实现?

1、模仿 adb 的交互方式:adb 的便利性以及高效已经得到了大家的广泛认可,所以 idb 的用法要和 adb 保持一致,做到在命令行中直接输入 idb+ 对应的命令即可实现对应的功能;

2、具体的实现:工具使用的是 python 语言开发实现的,而 python 的运行方式最常见的是 python+ 脚本文件名,要做到在命令行中直接输入 idb 实现对应脚本 python 脚本的运行并实现参数的传递;

最初想到的方案:将 python 打包成可执行的 exe 文件,这个操作比较重,而且之后改起来又比较麻烦,同时也不符合 python 脚本语言的特性,最终抛弃了这种方案。

最终方案:简洁的 bat 封装(bat 是 windows 自带的批处理语言)。

A、新建一个 idb.bat 文件,将 idb.bat 文件所在目录加入 Path 环境变量后,命令行中输入 idb,即可运行对应的 idb.bat 文件;

B、Python 脚本路径设置:最终需要调用相应的 python 脚本实现相应的功能,为了保证在任意目录下,都能正常运行。

在 idb.bat 中设置对应 python 脚本的绝对路径:目前 python 脚本和 bat 脚本在同一个目录下,所以可以用 “%~dp0%mypy%” 来表示 python 脚本的绝对路径,“mypy” 变量代表对应的 python 脚本的名称。

C、Bat 到 python 的参数传递:bat 脚本中可以用 “%*” 表示在命令行中收到的参数,可以用这种方式传递参数给 python。

具体的实现如下:

复杂功能的封装

在 iOS 日常测试过程中,会有一些抓包、抓 log 的需求,这些在 android 测试中也比较麻烦,所以在 idb 开发过程中,希望能够将抓网络包、抓 log 操作尽最大可能简化。

1、交互设计:一条命令开始抓取、Ctrl+C 结束、当前目录生成 pcap 文件以及 log 文件 。

2、具体实现:

A、命令封装:idb pcap。

B、网络包和 log 的抓取实现通用的封装:核心实现 start 和 stop 两个函数。

start:启动工作线程实现对应的功能,并在工作线程中时刻检测对应的标志位,看是否要结束;

stop:修改标志位为结束,触发工作线程的停止;处理并存储生成的文件。

C、入口函数对 Ctrl+C 的捕获:当运行 python 程序时,使用键盘输入 Ctrl+C,python 程序内部会抛出一个 KeyboardInterrupt 异常,我们可以通过捕获对应的异常实现相应的功能。

D、为了方便查看,对应的文件统一以当前的时间命令,并存在在命令行所在的路径。

核心代码实现:

工具介绍

下载地址(仅供交流学习):https://share.weiyun.com/f28c0e8f6fbd240cdb3006da7fc56699

目录结构:

下载对应的 zip 包,然后解压。

“.” 开头的是 eclipse 工程文件,不用管(可以直接作为 pydev 工程导入 eclipse,仅供交流学习)。

“idb.py” 实现 idb 所有功能的脚本。

“idb.bat” 入口函数,方便在命令行中直接通过 “idb” 命令调用相应功能。

“pymobiledevice_sheldonfan” 调用的类库,所有需要的 python 库都已经放在里面了。

主要功能:

1、支持手机基本操作:重启、锁屏、休眠;

2、支持应用的安装、卸载、查看;

3、支持沙盒目录的查看以及基本的文件操作(iOS10 之后出现限制,暂无法完美支持);

4、支持 log、网络 pcap 包的一键抓取。

环境依赖

1、安装 python2.7(32 位版),并设置环境变量。设置方法如下:

依次打开:计算机——》右键——》属性——》左上角"高级系统设置"——》右下角 “环境变量”——》系统变量——》选中 “Path”——》点击 “编辑”——》将 python 的目录加进去用";"分割,其他不要变——》点击确定。

Python 目录指的是 python 的安装目录,默认安装在 C:\Python27 目录下。Python 目录需要包含 python 的可执行文件,如下图:

2、Windows 7,安装 iPhone 驱动(检验标准,各种 iPhone 手机助手能够识别并连接手机);

3、下载完后可以将目录添加到 PC 的环境变量中,方便在任何地方调用。

用法详解

如果已经添加了环境变量,直接打开 cmd 即可。

1.重启手机:输入命令 idb reboot。

后面输入的是调用 python 脚本时打印出来的内容。

2、关机:idb shutdown。

3、让手机休眠:idb sleep //这个命令会让手机进入深度睡眠,usb 连接也会断掉;按电源键点亮屏幕,又会正常连接 。

4.安装 app(ipa 文件):idb install “ipa 文件路径”。

5、卸载 app:idb uninstall “app 的 id”(类似于 android 中的包名)。

6、显示所有的 APP:idb listapps //默认显示所有的 APP。

7、显示用户安装的 APP:idb listapps user。

8、显示系统自带的 APP:idb listapps sys。

9、查看系统级文件列表:idb shell //ios 使用沙盒环境,默认进入的是系统的图片、书籍音乐,也只能显示这些文件:

进入后支持简单的 ls、cd、pwd 等命令。进入后可以使用 exit 命令退出。

10、获取系统文件到本机:idb pull 手机目录 pc 目录

手机目录可以通过 idb shell 命令来查看(就是上一条命令)。

示例:idb pull /DCIM .

将手机中的 DCIM 目录抓到当前目录(当前目录用 “.” 表示)。

可以 pull 单个文件,也可以 pull 整个目录。

11、push 文件到系统目录 idb push “pc 文件路径”“手机目录”。

手机目录也是通过 idb shell 来确定的(push 图片后,手机无法识别,后续会继续优化)。
12、获取 APP 沙盒中的文件:idb -p “应用 id” pull “ 手机目录”“pc 目录”。

示例如下:

idb -p com.tencent.mlife.dailybuild pull Documents .
将应用 id 为 com.tencent.mlife.dailybuild 的应用的 Documents 目录,拉到当前目录(用 “.” 表示)

13、push 文件到 app 沙盒中:idb -p “应用 id” push“pc 文件路径”“手机目录”。

14、idb logcat 抓系统日志,也可以通过 idb logcat >mylog.txt 重定向到文件。

15、idb screenshot 截图,这个需要手机装了开发者功能,如果没装的话,可以考虑在手机上按电源键以及 home 键,然后 pull 到电脑上。

16、idb pcap 抓包,开始抓包,按 Ctrl+C 结束,会在当前的 cmd 所在的目录生成对应的 pcap 文件以及 log 文件。

按 Ctrl+C 结束抓取,提示总流量并在当前目录生成 pcap 文件以及日志文件(系统日志)。

注意事项

1、驱动一定要先装好,如果电脑识别不了手机,所有的命令都无法执行;

2、有时候连接不上手机,可能是驱动加载问题,可以尝试启动 itunes 重新安装驱动、重启电脑、重启手机;

3、部分 APP 的沙盒环境是不能访问的,这个和 APP 设置有关。一般日常测试的 APP(非正式发布的)都允许访问沙盒目录,方便获取相应的文件。但是 iOS10 增加了对沙盒目录的限制,无法完美支持;

4、目前支持 python2.7 32 位版,其他版本暂时无法支持(因为有些引用类库的限制)。

关注腾讯移动品质中心 TMQ,获取更多测试干货!

共收到 28 条回复 时间 点赞

学习了,终于可以摆脱 iTunes 了;不过好像图都裂了

有 ios 的版本么

有 github 地址吗

半年前听 TMQ 的线上分享看过这工具,在 windows 对 ios 带来的作用的还是挺大的,推荐!!!!

晚上再看看,感觉是福音

这个厉害了

这个是不是相当于绕开了 ios 的环境限制?之前不是说做 ios 测试,首先要有个 Mac 么?

Libimobiledevice 也有 windows 版的

一直在用着,挺好用。但好像还不支持 IOS11,在 TMQ 的沙龙课群里也跟小编反馈过了。

问下是否有杀掉 app 进程的功能

僅樓主可見
12楼 已删除
匿名 #13 · 2018年03月08日
土豆 回复

这个没有做 mac 的哈

有考虑做 mac 版本的么,我是想用你这个工具来获取,ios 沙盒里的文件,希望跟自动化连起来,因为自动化是在 mac 下运行的。刚才试了下 mac 上运行,主要就是 python 的库依赖有问题。

匿名 #15 · 2018年03月09日
土豆 回复

暂时没有收到相关消息

我去催饭 回复

mac 环境还是要的,单一个 xcode 你就绕不过去

准备试下了,刚看完。

您好,有工具使用教程文档吗? 因为这款工具目前还没使用开;可能还存在一些未知问题,当出现问题后在哪交流呢?

想问下 ,“环境依赖” 中一定要使用 python2 吗? 使用 python 3 是不是也可以?

今天弄了一下午, 没弄明白。

John windows 电脑怎么去抓去 ios 手机 app 异常 log? 中提及了此贴 05月22日 10:30
匿名 #22 · 2018年05月24日

有一期该主题的沙龙分享,在微信公众号的往期沙龙里面,你可以参考一下。

各位大佬,跪求 python2.7(32 位版)安装包链接??

图片裂了,文字内容还是不错的。

我去催饭 回复

这个只是管理 ios 系统 和测试还是不一样的

AttributeError: 'LockdownClient' object has no attribute 'c'
syslog_del
Exception AttributeError: "'Syslog' object has no attribute 'c'" in > ignored
我这边使用 idb 命令的时候一直在报这个 error,请问怎么处理呢?

Snow 回复

任何一个 python 都可以吧

叶子 回复

意思是只支持 ios11 以下的系统吗?

所以这个工具怎样了?有新版出来么?

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册