阅读 7006

滴滴正式发布开源客户端研发助手 DoKit 3.0,新特性解读

工欲善其事,必先利其器。 --《论语·魏灵公》

DoraemonKit,简称 DoKit,中文名哆啦 A 梦,是滴滴开源的一款功能齐全的客户端( iOS 、Android )研发助手。今天,Dokit 3.0 版本正式发布,开发者朋友可以选择更新、试用,本文是 DoKit 团队对本次更新的技术解读。

一、DoKit3.0 - 不只是工具

首先我要代表团队对于大家一直以来对DoKit的支持表示感谢,DoKit的今天离不开大家共同的努力和贡献。所以为了更好的回馈社区,我们近期一直在努力的升级内部架构,同时我们还结合实际业务场景新增了两个重磅的功能:接口mock健康体检,配合平台端dokit.cn一起使用,让DoKit的能力得到延伸。当前,dokit 3.0.0版本已经发布,在这里非常欢迎大家的升级使用。同时也很希望大家能将使用过程中遇到的各种问题通过各种渠道(github issues、QQ群等等)反馈给我们,让我们大家一起努力把DoKit的生态建立的更加完善。

在这之前大家想起DoKit第一印象是什么?好像只是一个端上的工具,包括Android、iOS、小程序。功能丰富、好用,确实也大大得提高了大家的研发效率,同时也获得了社区包括我们滴滴内部业务的一致好评。但是我们团队在讨论DoKit的定位以及未来规划的时候在想:那在我们自己的心目中DoKit应该是什么样的? 简单的工具集合肯定不是我们想要的,我们希望将DoKit打造成一个平台,一个能够满足泛前端开发、测试、设计等等需求的功能丰富的通用型平台。这样当以后大家再想起或者向别人介绍DoKit的时候会说,DoKit是一个通用的研发平台,而不仅仅只是一个工具。为此我们推出了DoKit3.0,这也是我们实现目标的第一步。

DoKit 首页效果演示

二、3.0 新特性

2.1:优化点

1)DoKit 3.0相比于上一个版本一共解决了github上的issues 70多个,合并PR 30多个。

2)内部架构升级,其中性能和代码的健壮性都得到了显著的提升

3)工具优化用户体验优化

Android

Android端主要优化了网络拦截、悬浮窗、位置模拟、Aop解决方案等等

1)网络拦截统一了okhttp、urlconnection。

2)悬浮窗新增了普通模式,不再需要系统悬浮窗权限。

3)位置模拟现已支持百度、腾讯、高德、系统原生。

4)AOP的代码插装方案也由一开始的Aspectj改成了ASM方案,兼容性和性能也都有了明显的提升。

iOS

iOS端主要优化了多个工具的用户体验、加速代码安装速度、减少对于业务方的影响等等

1)NSLog监控、子线程UI、CocoaLumberjack日志日志监控等功能不需要重新启动App即可进行开关

2)pod 仓库多地备份(github、gitee、gitlab),解决pod install缓慢的问题

3)解决DoKit的window影响UIMenuController的吗,导致业务方在某些机型弹不出来的问题

4)减少代码hook对于全局的影响

5)全局支持中英文切换

2.2:新增工具

以下新增的大部分Kit在Android和iOS两端是对齐的,有些平台特有的功能我会进行标注

(1)数据Mock

提供一套基于App网络拦截的接口Mock方案,无需修改代码即可完成对于接口数据的Mock。

详细介绍

DoKit 首页效果演示

(2)健康体检

一键式操作,整合DoKit多项工具,数据可视化,快速准确定位问题,让你对app的性能了如指掌。

详细介绍

DoKit 首页效果演示

(3)DBView

主要能帮我们将db等本地数据在浏览器中进行操作,十分方便。 DBView和本地沙盒的主要区别在于本地数据库在端上的体验效果并不是很好,因为受限于屏幕的大小,所以我们引入这DBView,可以将我们的本地数据库和浏览器打通,在浏览器上进行增删改查等等操作,提升我们的效率。

详细介绍

DoKit 首页效果演示

(4)函数耗时

Android:函数耗时主要通过ASM代码插装的方式,会在指定的包名下进行代码插装,统计每个函数的耗时,默认情况下会在控制台中将执行时间大于200微妙的函数调用栈打印出来。后续我们计划将函数耗时和平台端打通,记录下每一个函数耗时操作。

iOS:iOS采用的额是Hook objc_msgSend, 会以树形结构打印出某一段操作中具体的函数耗时,比Xcode的TimeProfiler更加直观。

详细介绍

Android端效果图

DoKit 首页效果演示

(5)其他工具

  • 快速跳转到应用设置 : 避免手动去设置里面寻找App的麻烦;

  • NSUserDefalult(iOS) : 对于NSUserDefalult的数据方便进行增删改查;

  • UI层级检查 : 检查每一个UI界面的层级,层级太深的话,会影响一定的性能;

  • 启动耗时 : 检查每一次启动消耗的时间;

  • UI结构(IOS) :可以动态改变每一个UI元素的属性,感谢社区HDB-Li提供;

用户可以自行更新体验。

三、dokit.cn 平台介绍

为了让Dokit的端上能力得延伸和扩展,同时也是为了更好的服务好我们的每一个业务方,让DoKit成为一个能够满足泛前端开发、测试、设计等等各方都需要的功能丰富的通用型平台。我们组内经过讨论决定推出dokit.cn。 平台端主要包含以下几项内容:

1)用户登录

2)使用中心

3)产品中心: 包含接口Mock健康体检的功能详细介绍

4)控制台: 主要提供产品管理、用户管理、数据Mock、健康体检等功能。必须登录以后才能访问,你可以创建的每一个产品。然后需要将你的ProductId集成到Android和iOS中去。详细介绍

四、接口mock和健康体检技术原理

4.1、接口Mock

整体流程图

DoKit 首页效果演示

第一步: 前往dokit.cn平台进行账号注册并登录,然后在控制台中进行产品创建,并将产品Id集成到安卓和iOS中。具体参考上文安卓和iOS集成。

第二步: 在平台端的数据Mock模块中进行相应的接口Mock创建。

第三步: 每次进入SDK的数据Mock页面,会加载在DoKit平台添加的Mock接口列表并和本地数据进行合并。

第四步: 打开拦截接口开关并选中相应的场景或者打开接口模板开关(拦截模块和模板模块相互独立),等待真实的网络请求命中我们的拦截规则。

拦截规则: 假如命中拦截规则我们会将http重定向到我们的DoKit后台并返回Mock数据。

模板规则: 假如命中模板规则,我们会将真实的接口数据保存,用户可以进入模板页面,找到指定的模板项并将模板数据上传到我们的DoKit后台并用于创建场景。

效果演示

接口拦截效果图

DoKit 首页效果演示 DoKit 首页效果演示

接口模板效果图

DoKit 首页效果演示 DoKit 首页效果演示

想象以下以下几种情形:

一: 以前我们要在移动端要进行接口Mock的常规操作,基本上都是先拿到一个定义好的mock接口然后在代码中修改url,然后等待编译、完成以后运行一下好像没什么问题然后又改回去编译。重复这样的操作。

二: 一般来说我们泛前端都是需要依赖后端的接口进行开发的,这个操作无法同时进行,所以当多条业务需求同时开发的时候就容易由于资源不足和安排不当造成进度阻塞。

三: 关于测试用例。一般来说我们在需求评审完成以后我们的测试人员就开始编写测试用例了,但是这样的用例往往都是文档化的,我们研发要进行用例测试边界情况的时候往往是通过修改代码来完成的。测试用例大部分用例也是依赖接口的。

当然不止以上几种情况,我们都知道接口联调和测试在我们研发中占的比重是很大的,同时也是需要我们反复的修改代码来进行测试和适配,这往往消耗着我们绝大部分的精力。

那我们dokit的操作是怎么解决这个问题的呢?

我们dokit区别于其他接口Mock方案,因为我们具有端上的优势,我们依赖端上的本地抓包功能,通过拦截所有的网络请求,根据path和query字段(跟域名无关)去匹配我们在平台端创建的mock接口。然后上传真实接口模板并支持各种场景切换。因为同一个接口往往具有不同的场景,比如验证码验证成功或者失败等等。 测试也可以在我们平台端提前编写好测试用例接口以及各种边界情况。开发在研发阶段就能参与到测试用例的验证。也可以预想整理好整个链路的mock接口,让我们在测试过程中按照自己制定各种case往下走。

所以我们DoKit解决方案的最大优势就是:无需进行任何业务代码的修改的情况下去完成绝大部分的接口Mock需求。

4.2、健康体检

DoKit 首页效果演示

健康体检部分主要我们整合了DoKit端上的的各项工具,比如网络、cpu、fps、内存等9个性能指标。于此同时为了让整个流程更加的符合测试人员的操作习惯,我们化繁为简,将整个流程分为以下三步:

1)启动

2)正常的操作页面然后在每个页面根据倒计时提醒停留10s左右,完成每个页面的性能数据采集工作。

3)点击上传,填写用例的名称和测试人员名称,等待数据上传完成。

我们的每一次性能测试结果都将在我们的后台中进行记录。我们平台端记录的数据十分全面,基本上涵盖了我们的大部分需求,并且我们在后端会针对性能数据进行精准的分析并给出分析结果。还有就是我们针对性能数据进行了图表化的展示,使得每一次的性能测试更加直观。这样我们在整理的时候也不需要自己再根据数据去导出各种报表了,直接截图就可以用了。在这一块还是比较贴心的。

以下为健康体检的数据展现示例:

DoKit 首页效果演示

五、接入方式

5.1、iOS接入方式

Cocoapods依赖

    pod 'DoraemonKit/Core', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//必选
    pod 'DoraemonKit/WithLogger', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
    pod 'DoraemonKit/WithGPS', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
    pod 'DoraemonKit/WithLoad', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
    pod 'DoraemonKit/WithDatabase', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
    pod 'DoraemonKit/WithMLeaksFinder', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
    pod 'DoraemonKit/WithWeex', :git => "https://github.com/didi/DoraemonKit.git", :tag => '3.0.0', :configurations => ['Debug']//可选
复制代码

初始化SDK

#ifdef DEBUG
#import <DoraemonKit/DoraemonManager.h>
#endif

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    #ifdef DEBUG
    [[DoraemonManager shareInstance] installWithPid:@"productId"];//productId为在"平台端操作指南"中申请的产品id
    #endif
}
复制代码

5.2、Android接入方式

gradle依赖

# 添加仓库
buildscript {
    apply from: "config.gradle"
    repositories {
        google()
        jcenter()
        maven { url 'https://www.jitpack.io' }

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.1'
        classpath 'com.didichuxing.doraemonkit:doraemonkit-plugin:3.0.0'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}
复制代码

插件引入


# 项目app module的build.gradle中
apply plugin: 'com.didi.dokit'
复制代码

SDK引入

debugImplementation "com.didichuxing.doraemonkit:doraemonkit:3.0.0"
releaseImplementation "com.didichuxing.doraemonkit:doraemonkit-no-op:3.0.0"
复制代码

SDK初始化

public class App extends Application {
    private static final String TAG = "App";
    public static Activity leakActivity;

    @Override
    public void onCreate() {
        super.onCreate();
        //productId为在"平台端操作指南"中申请的产品id
        DoraemonKit.install(this, null, "productId");
    }
}
复制代码

5.3、使用中心

其他更多细节的介绍和用户指南,请移至www.dokit.cn/的使用中心

六、社区回馈

6.1、官方公众号

为了DoKit能够更好的服务开发者,同时也是为了完善社区生态让大家第一时间了解DoKit平台的最新信息,我们推出了DoKit开源社区官方公众号:DoKit开源社区

DoKit开源社区公众号将会第一时间发布有关DoKit的最新消息,包括一些隐藏福利和重磅功能提前体验。

6.2 、社区活动升级

DoKit社区活动:提PR、赢纪念T恤(2020)

各位社区的朋友您们好:

为了鼓励更多的开发者参与到Dokit开源项目的共建中来,我们准备发起一个长期有效的激励活动,只要给我们提交PR,并被我们采纳的话,就有机会获得相应的奖品。

活动规则:每一个月为一次获奖周期,我们会统一评审本月所有被我们采纳的PR,挑选出前3名的贡献者,即可获得我们提供的奖品;

活动时间:2020-04-01 ~ 2020-12-31;

活动奖品:每个月前5的贡献者将会获得DoKit纪念T恤一件,并且可以加入到我们首页的外部贡献者名单中

提交的PR可以包含:

(1)现在一些未解决的issues的处理

(2)对于现有功能的一些优化

(3)提供单独的工具集成到DoKit中

(4)其他有利于DoKit发展的任何事项

获奖名单每个月都在这个issues和我们“DoKit开源社区”的公众号里面同步,获奖同学联系QQ用户群 @didi_iOS_易翔 或者 @didi_Android_金台 领奖。

活动详情参考

DoKit社区活动:提PR、赢纪念T恤(2020)

七、总结

最后还是要感谢一下社区一直以来的支持,是你们的积极响应和反馈让DoKit变得更好,DoKit所取得的所有成绩都来至于大家共同的努力。未来,DoKit还有很长的路要走,我希望接下来走的每一步都有你的陪伴。

附上github地址:

github.com/didi/Doraem… 留下你的小星星。