滴滴DoKit一机多控,代码零侵入框架

2024-02-08 22:40

本文主要是介绍滴滴DoKit一机多控,代码零侵入框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

桔妹导读:当前业界各种跨端方案的推出极大推动了研发效率的提升,但这却无形地给相关质量部门带来了压力。各个公司的质量保障部门急需一款能够提升功能回归以及机型兼容测试的效率框架。在这样的背景下,一机多控的解决方案被提出,DoKit作为一款受众以及口碑都较好的开源效率工具平台也开始进入到该领域。我们团队经过多方调研和努力,终于在一机多控领域有了一定的突破,不管是在框架集成还是使用体验上都有了极大的提升。

1. 

项目背景

前不久,滴滴城运服(原滴滴普惠)泛前端终端技术部开源了一个跨端方案Hummer&Tenon,一套代码可以同时支持开发 Android 和 iOS 应用,极大提高了研发效率。但研发效率的提升却给质量部门带来了压力。研发同学缩短研发周期就意味着单位时间内质量部门的同事需要做更多的版本功能回归以及兼容性测试。

基于此背景,滴滴代驾质量部门一位同事给我们提出了一个需求,希望DoKit团队能帮忙输出一套解决方案:帮他们提升功能回归以及兼容性的效率。本着技术驱动业务发展的企业精神,DoKit团队开展了深入研究。功夫不负有心人,目前针对该问题解决方案,DoKit团队有了一定的阶段性成果。  

 

2. 

阶段性成果

一机多控阶段效果如下:

备注: DoKit Android的一机多控相对于其他的解决方案来说不需多余的系统权限,无需PC端配合。此外,我们也保证了业务代码零侵入的原则,唯一的要求就是主机和从机要在同一局域网内,然后你只需和平时一样随心所欲地操作主机App即可,剩下的都交给DoKit。

前段时间,我在DoKit开源社区群与大家聊起近期DoKit规划话题。收到一些反馈,比如:最近DoKit都没有发布什么新的功能。

于是我将近期研究的DoKit一机多控演示Demo视频在社群内同步了一下。超出预料的是:大家看完视频后都表现出强烈的兴趣,并在社群内开展一定的讨论。除此之外,很多社区及集团内的朋友都私聊我问我该技术原理是什么、应用场景有哪些、准备时候开源等等。

思考良久,既然大家对于DoKit的一机多控如此感兴趣,不如我直接写一篇文章来统一更新一下DoKit近期的成果,同时也统一回答一下大家较为感兴趣的问题。

3. 

问题解答

这里我选取了几个比较有代表性的问题。


问题1:一机多控的技术原理是什么?

受限于篇幅的原因,我这里就不展开讲相应的源码实现了。只是大致的提一下相应的原理,主要分为三步:

  • Android主机控件相对于window的路径获取

  • 基于局域网长连接的控件信息传递

  • 从机控件定位以及手势模拟。

对于一机多控的技术实现我尝试过好几套方案,但始终不能很好的解决如何在主机上精确的获取到具体是哪个控件消费了此次手势事件。直到有一天我在浏览Android Framework源码的发现了一个API,由此扣开了一条通往一机多控新世界的大门。这里顺便分享给大家:View#sendAccessibilityEventUnchecked

问题2:一机多控的使用场景是什么?

最近我一直在思考这个问题:一机多控除了能够帮助质量部门的同事提升功能回归的效率和兼容性测试以外,能不能有更多的挖掘与探索?

通过我和团队成员深入交流,我发现一机多控本身的价值已经显而易见,但是我们在实现一机多控过程中涉及到众多知识点其实能够帮助我们实现更多特别有想象力的功能。比如:

全局用户行为路径无痕埋点

这点其实和一机多控的原理一样。一机多控就是基于事件驱动在主机上定位控件然后在从机上针对具体的手势行为进行模拟,所以我们对于用户的操作行为的获取肯定是十分准确的。

用户行为录制和回放

相对于埋点的文字描述形式,基于DoKit的用户行为录制和回放对于业务方来说其实特别友好和直观,因为那是最真实的用户操作行为。可能很多人会问,对于C端用户来说,每个人的页面UI表现形式大部分是通过接口返回的数据来决定的,这就可能导致有些运营页面的UI表现形式是不一样的,那DoKit拿什么来保证我的回放是准确的?

如果你是DoKit的深度用户或者对DoKit很感兴趣的话,你应该知道DoKit是有接口抓包和接口Mock功能的,当我们把用户的行为录制和接口抓包、接口Mock打通,我们应该能保证90%以上的页面表现形式是一致。

具体的操作:当用户在平时的操作过程中遇到问题的时候,我们可以要求用户打开我们隐藏的用户行为录制开关,然后我们会记录下这段时间内用户的所有手势行为以及相关的接口数据,然后将两者统一打包上传到后台。此时,我们可以在另一台手机上将相应的用例数据包下载并解压,再去执行相应的手势行为并配合数据Mock来保证页面的一致性。

问题3:一机多控什么时候开源?

当前DoKit Android端的一机多控基础功能已经走通,我正在协调相关部门同事进行业务落地,当我们的一机多控在业务中得到验证以后我们会着手准备开源的事项并第一时间告知大家。

当然哪怕最后一机多控在业务落地中并没有创造出属于它的价值,我们团队也会争取将它作为一个学习实践项目开源给大家,因为整个一机多控项目中涉及到的众多知识点还是具有较大研究价值的。DoKit一直都秉持滴滴的开源精神,希望给大家输出最优秀的解决方案。所以请敬请期待我们的官方消息。

问题4:DoKit是如何做到持续创新的?

DoKit团队对于DoKit的定义是:DoKit是一个创意密集型的效率工具平台

所以我们平时决定做什么(包括功能调研、价值评估、技术验证等等)的时间占了整个功能研发周期的大部分,真正的编码时间反而并没有那么多。那么我们是怎么保证我们输出的每一个功能都是有价值的呢?我们平时在工作之余一直和集团业务方以及社区保持充分的沟通,积极听取大家的意见和建议,深入理解研发过程中的各种痛点,主动去思考相应的解决方案。

同时我们不提倡重复造轮子,如果开源社区有中已经有了相应的解决方案,我们也会积极的在他人基础上进行优化和迭代,这也是开源的精神。目前为止,DoKit在终端上已经有了超过30+的功能,同时也在Android和iOS两端保持功能同步,这些功能都得到了集团和社区的验证。

随着用户和影响力越来越大,我们的压力也越来越大,我们希望能不辜负大家的期待。DoKit团队知道现阶段的DoKit并不完美,感谢大家对DoKit的包容,也希望大家可以为DoKit提出宝贵建议,我们渴望听到大家的声音。

问题5:DoKit接下来的规划是什么样的?

现阶段DoKit在终端上的探索已经慢慢趋于稳定,但我们希望DoKit能在不同的领域上有所突破,比如:DoKit For Flutter、DoKit For Web等等。假如你对此有特别好的想法,欢迎联系DoKit团队。你的创意将有可能为整个社区做出巨大的贡献。

4. 

总结

DoKit一直追求给开发者提供最便捷和最直观的开发体验,同时我们也十分欢迎开源社区中能有更多的人参与到DoKit的建设中来,为我们提出宝贵的意见或PR。DoKit的未来需要大家共同的努力。 

DoKit项目Github网址: 

https://github.com/didi/DoraemonKit

本文作者

延伸阅读


内容编辑 | Mango联系我们 | DiDiTech@didiglobal.com

这篇关于滴滴DoKit一机多控,代码零侵入框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/692419

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实