浅谈移动客户端效率工具——透镜

349 阅读9分钟

1

背景

移动客户端的产品研发基本上分为开发,测试,设计,产品4个主要角色。在迭代开发过程中,从开发到测试再到产品验收,每个版本都会有很多相似的工作和问题困扰着技术人员。\

在团队协作开发时,iOS开发同学不太可能熟悉所有的代码逻辑,而修改代码或者定位问题时又经常需要查找代码在哪个类或库。无论是在开发阶段还是改bug阶段都会不断地查找代码,或者需要获取视图和相关数据的基本信息,因此开发同学可能常常会问 “Hi 小A同学,这个代码在哪里写的?是什么逻辑?”

测试或者产品同学很多时候想强制运行某些逻辑从而达到测试和产品验收的目的,因此会问:“某某开发同学,这个怎么连接测试环境?如何测试这个功能?”

而设计可能需要快速测量页面上的颜色或者间距是否满足设计要求。

随着团队的扩大和项目的复杂,这一系列的问题也会随之增加,是否有更简单快捷的方法定位到对应的类,快速获取视图和数据的信息,降低代码调试和查找的成本?如何切到测试环境?如何切换A/B方案?如何知道是前端开发错误还是后端接口错误?这些问题无法避免,但处理起来非常耗时间,降低了整个团队的效率,因此我们希望可以消除重复的工作或降低其成本。在这样的背景下,透镜系统诞生了。

2

宗旨

以最低的成本提高整个移动端团队的效率,及时发现问题,降低错误率,减少线上事故。

3

透镜系统简介

透镜是iOSApp在debug模式下集成在客户端上的一个工具集。它提供统一入口,为整个团队的不同角色提供服务,以提高其工作效率,降低一些操作的成本。透镜也吸纳了一些有益的开源库的部分功能,比如 FlexDoraemonKit,并针对业务做了优化调整,以满足团队需求。\

整个App页面众多,需要尽可能地做到实时唤起,以满足大部分的需求。透镜以UIWindow浮窗方式提供了统一入口,并且浮窗可以提供报警功能和滚动消息通知功能,点击后会显示工具集菜单项。如下图所示。

4

功能及原理

透镜可以通过功能管理层不同的功能组以插拔的形式进行功能注册和删除,注册的功能项会显示在菜单项供用户使用,其基本功能按组分类,以便查找使用,整体结构如下。\

主要功能:

视图检查

视图检查可以快速获取到当前选中视图及其父视图的一些基本信息和扩展信息。相比flex和lookin,本系统只抓取关心的数据,因此使用起来更便捷,定位更精准,速度也更快。\

例如下图可以看到类的名称、图片的名称、大小和背景色等。将信息显示在信息窗口可以给开发提供辅助信息,以降低查找代码和调试带来的成本。开发同学将不需要为了查找某个类而询问身边的同学,既提高了自己的效率,也节约了别人的时间。

原理:当选中屏幕上某个点,可以从window层级依次向子视图查找视图,直到找到最上层的视图信息,然后从最上层的子视图反向获取其ResponseChain里每个类的基本信息和附加信息,输出在信息窗口。附加信息可以是使用者自定义,只要ResponseChain里的类满足某个协议,就可以将其附加信息输出到信息窗口,以满足更多的业务相关的需求。协议大概如下:

- (NSAttributedString *Nullable)qyDebugCheckViewInfoForView:(UIView *Nullable)view;  

网络错误实时监控

当网络错误时,透镜的浮窗会发出出错报警,并将错误信息写入log日志中,打开网络log选项可以查看错误信息。

如下图可以看出请求失败时间,请求失败的URL已经返回的错误信息等,帮助开发和测试同学及时发现问题,并可以将问题快速定位到客户端或者服务器。

原理:hook网络层的请求失败回掉,并获取相关信息写入本地log,同时在透镜浮层上发出出错报警。

模拟内存警告

在模拟器上很容易模拟内存警告,但是真机却没有这个功能。系统私有api提供了模拟内存警告的方法,调用系统私有api可以模拟内存警告从而调试一些异常情况。庆幸的是不需要把这部分代码带到Appstore,以免App被拒。\

代码如下:

DNS Spoofing

DNS Spoofing 是产品和设计同学的福音,模拟Charles 的DNS Spoofing功能,将URL重新定向,当没有Charles等工具,或者不熟悉Charles工具的时候,可以提供一种快速的、傻瓜式的方式切换到测试环境。产品或者测试同学将不再需要学习高门槛的Charles工具。

如下图,当URL请求Test.a.com的时候,将重连接到10.10.10.10的测试环境中。

原理:利用swizzling技术,Hook NSURL的方法,当发现URL的Host是需要重定向的URL,便生成新的URL,从而使URL连接到测试环境。主要代码如下:

显示fps

利用CADisplayLink可以检查当前页面的帧率。很多情况需要监测当前页面的帧率问题,fps显示可以实时监控当前页面的帧率,及时发现页面卡顿。\

测量工具和颜色吸管

测量工具通过移动屏幕上的选中点实时获取当前点的坐标位置,同时向屏幕上添加2个可移动点,便可以测量出2个点组成的矩形大小。颜色吸管是通过截取屏幕上的图片,实时获取像素点的色值。这2个功能可以参考开源库 DoraemonKit。

开关组\

开关组添加了一系列和业务相关的开关选项,打开或者关闭的时候会强制走到程序逻辑的不同逻辑分支上,从而方便开发测试,产品验收。比如有些网络接口请求为了提高性能或者减少不必要的请求,不会每次都请求server数据,这会在开发或者测试阶段造成困难,而开关打开时可以强制请求这些接口,从而提高效率。\

可修改项组

可修改项和开关很相似,基本上是和业务逻辑相关的,有时候需要修改某些值才能达到某些效果,比如修改网络请求的某些参数,从而达到测试不同请求的返回结果。在业务中可以修改类似用户id的值以方便测试不同的场景。\

关闭功能

辅助工具不能影响正常逻辑功能的运行。但是作为一个由代码组成的工具,很难主观上要求其不对主App造成影响,因此提供一个关闭选项,当遇到问题,并怀疑是工具造成的影响时,可关闭整个工具以排查是否对主App的表现造成了影响。

另外还有很多业务相关的功能,这里不一一赘述,部分功能会随着业务的变化而被删除,也会有新的功能增加,这些并不会影响核心功能的变化。

5

总结

正所谓磨刀不误砍柴工,整个透镜工具并没有花费很多的人力时间,它的目的是以最小的投入获得最大产出,尽可能地提高团队里每个人的工作效率,及时检查出问题,所以我们没有在页面上做过多的“雕刻”,而是更注重工具提供的有价值的功能,便捷的使用方式。\

在功能集成方式上我们采取了插拔的形式,以便快速地集成和卸载功能,方便不同的团队和业务进行业务相关的功能集成,以满足其特定的需求。

总之一个辅助的效率工具还是有必要的,尤其是对于大型团队,这样才能以低投入的成本获得高产出的回报。\

6

未来规划

随着透镜继续深入发展,希望它能健康持续发展,可以提供更好的功能,监测更多的异常,为更多需求提供服务,最大限度提高团队效率。未来很多功能仍需要打磨使其更加好用,同时很多功能我们也在规划中,如下:

  • 增加内测泄漏检测功能,实时检测内测泄漏避免线上问题;
  • 展示网络请求的全部信息来检测数据的正确行;
  • 增加崩溃日志导出功能,降低导出设备崩溃日志的成本;
  • 开发PC版的连调工具,开发出更多有价值的功能等等。

end

也许你还想看

海量数据实时分析服务技术架构演进

代码质量提升之道——代码覆盖率原理与移动端工程实践

扫一扫下方二维码,更多精彩内容陪伴你!

爱奇艺技术产品团队

简单想,简单做