iOS 测试利器:idb

作者:樊林

导读

对于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:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云服务试衣间

三步瘦身,做名副其实的「小程序」

手把手教你使用微信小程序瘦身方案 WeCOS。腾讯云为小程序量身打造了小程序相关解决方案,帮助开发者解决小程序包超过大小限制的问题。仅需三步,即可快速使用 We...

1.2K0
来自专栏企鹅号快讯

PWA 那些事儿

一、背景 文章 2017 前端大事件和趋势回顾,2018 何去何从?中提到了 2017 年前端值得关注的十大事件,其中就提到了 PWA。 大家都知道 Nativ...

2330
来自专栏小白课代表

我不想用Windows了,所以要了解一下macOS 最新版吗?

对于一般人来说,Mac很贵,是真的很贵。贵到什么程度呢?几千块钱的低配版或者旧版,只能叫乞丐版。

1042
来自专栏Golang语言社区

golang基于redis lua封装的优先级去重队列

作者: 峰云 博客: http://xiaorui.cc 前言: 前两天由于某几个厂商的api出问题,导致后台任务大量堆积,又因为我这边任务流系统会重试超时任务...

3859
来自专栏北京马哥教育

Python微信后台开发--环境搭建与接入指南

0x00 背景及介绍 申请一个微信公众平台订阅号,将后台接入到服务器上,验证服务器地址的有效性,实现简单的业务逻辑,根据用户发送不同类型的消息做出不同的反应。 ...

3586
来自专栏葡萄城控件技术团队

如何通过预加载器提升网页加载速度

预加载器(Pre-loader)可以说是提高浏览器性能最重要的举措。Mozilla 官方发布数据,通过预加载器技术网页的加载性能提升了19%,Chrome测试了...

19710
来自专栏菩提树下的杨过

ruby on rails + mysql 开发环境搭建

ror对于初学者来讲,可能最大的困难莫过于开发环境的安装与搭建,今天折腾了大半天基本搞定了,把过程贴在这里,以便初学者少走弯路。 1.安装ruby 1.8.6 ...

2895
来自专栏一“技”之长

获取iOS应用的URL Schemes 原

3、打开iTunes,查看应用程序,选中相应的应用程序点击右键,选择在Finder中显示,然后解压ipa文件,得到一个文件夹。

773
来自专栏Golang语言社区

golang基于redis lua封装的优先级去重队列

前言: 前两天由于某几个厂商的api出问题,导致后台任务大量堆积,又因为我这边任务流系统会重试超时任务,所以导致队列中有大量的重复任务。这时候我们要临时解决两个...

34211
来自专栏有趣的django

微信小程序入门(二)

1253

扫码关注云+社区