导读:DoraemonKit,简称 DoKit,中文名哆啦 A 梦,是滴滴开源的一款功能齐全的客户端( iOS 、Android )研发助手。今天,Dokit 3.0 版本正式发布,开发者朋友可以选择更新、试用,本文是 DoKit 团队对本次更新的技术解读。
1.
Dokit 3.0-不只是工具
点击上图可进入Github项目页
首先我要代表团队对于大家一直以来对 DoKit 的支持表示感谢,DoKit 的今天离不开大家共同的努力和贡献。所以为了更好的回馈社区,我们近期一直在努力的升级内部架构,同时我们还结合实际业务场景新增了两个重磅的功能:接口 mock 和 健康体检,配合平台端 dokit.cn 一起使用,让 DoKit 的能力得到延伸。当前,DoKit3.0 版本已经发布,在这里非常欢迎大家的升级使用。同时也很希望大家能将使用过程中遇到的各种问题通过各种渠道 (github issues、QQ 群等等) 反馈给我们,让我们大家一起努力把 DoKit 的生态建立的更加完善。
在这之前我想问一个问题:大家想起 DoKit 第一印象是什么?好像只是一个端上的工具,包括 Android、iOS、小程序。功能丰富、好用,提高了大家的研发效率,同时也获得了社区包括我们滴滴内部业务的广泛好评。但是我们团队在讨论 DoKit 的定位以及未来规划的时候在想:那在我们自己的心目中 DoKit 应该是什么样的?
简单的工具集合肯定不是我们想要的,我们希望将 DoKit 打造成一个平台,一个能够满足泛前端开发、测试、设计等等需求的功能丰富的通用型平台。这样当以后大家再想起或者向别人介绍 DoKit 的时候会说,DoKit 是一个通用的研发平台,而不仅仅只是一个工具。为此我们推出了 DoKit3.0,这也是我们实现目标的第一步。
2.
3.0 新特性
▍优化点
DoKit 3.0 相比于上一个版本一共解决了 github 上的 issues 70 多个,合并 PR 30 多个;
内部架构升级,其中性能和代码的健壮性都得到了显著的提升;
工具优化用户体验优化。
Android
Android 端主要优化了网络拦截、悬浮窗、位置模拟、Aop 解决方案等等:
网络拦截统一了 okhttp、urlconnection;
悬浮窗新增了普通模式,不再需要系统悬浮窗权限;
位置模拟现已支持百度、腾讯、高德、系统原生;
AOP 的代码插装方案也由一开始的 Aspectj 改成了 ASM 方案,兼容性和性能也都有了明显的提升。
iOS
iOS 端主要优化了多个工具的用户体验、加速代码安装速度、减少对于业务方的影响等等:
NSLog 监控、子线程 UI、CocoaLumberjack 日志日志监控等功能不需要重新启动 App 即可进行开关;
pod 仓库多地备份(github、gitee、gitlab),解决 pod install 缓慢的问题;
解决 DoKit 的 window 影响 UIMenuController 的吗,导致业务方在某些机型弹不出来的问题;
减少代码 hook 对于全局的影响;
全局支持中英文切换。
▍新增工具
以下新增的大部分 Kit 在 Android 和 iOS 两端是对齐的,有些平台特有的功能我会进行标注。
1)数据 Mock
提供一套基于 App 网络拦截的接口 Mock 方案,无需修改代码即可完成对于接口数据的 Mock。
了解详情:
https://www.dokit.cn/#/index/productCenter
2)健康体检
一键式操作,整合 DoKit 多项工具,数据可视化,快速准确定位问题,让你对 app 的性能了如指掌。
了解详情:
https://www.dokit.cn/#/index/HealthTest
3)DBView
主要能帮我们将 db 等本地数据在浏览器中进行操作,十分方便。DBView 和本地沙盒的主要区别在于本地数据库在端上的体验效果并不是很好,因为受限于屏幕的大小,所以我们引入这 DBView,可以将我们的本地数据库和浏览器打通,在浏览器上进行增删改查等等操作,提升我们的效率。
了解详情:
http://xingyun.xiaojukeji.com/docs/dokit/#/DBView
android 直接接入的 Android-Debug-Database 方案;
iOS 是由社区同学 y500 提供的 iOSDebugDatabase, 感谢该同学的贡献。
4)函数耗时
Android:函数耗时主要通过 ASM 代码插装的方式,会在指定的包名下进行代码插装,统计每个函数的耗时,默认情况下会在控制台中将执行时间大于 200 微妙的函数调用栈打印出来。后续我们计划将函数耗时和平台端打通,记录下每一个函数耗时操作。
iOS:iOS 采用的额是 Hook objc_msgSend, 会以树形结构打印出某一段操作中具体的函数耗时,比 Xcode 的 TimeProfiler 更加直观。
了解详情:
http://xingyun.xiaojukeji.com/docs/dokit/#/TimeProfiler
5)其他工具
快速跳转到应用设置 :避免手动去设置里面寻找 App 的麻烦;
NSUserDefalult(iOS) :对于 NSUserDefalult 的数据方便进行增删改查;
UI 层级检查 :检查每一个 UI 界面的成绩,成绩太深的话,会影响一定的性能;
启动耗时 :检查每一次启动消耗的时间;
UI 结构(IOS) :可以动态改变每一个 UI 元素的属性,感谢社区 HDB-Li 提供。
用户可以自行更新体验。
3.
Dokit.cn 平台介绍
为了让 Dokit 的端上能力得延伸和扩展,同时也是为了更好的服务好我们的每一个业务方,让 DoKit 成为一个能够满足泛前端开发、测试、设计等等各方都需要的功能丰富的通用型平台。我们组内经过讨论决定推出 dokit.cn。平台端主要包含以下几项内容:
用户登录
使用中心
产品中心: 包含 接口 Mock 和 健康体检 的功能详细介绍
控制台: 主要提供产品管理、用户管理、数据 Mock、健康体检等功能。必须登录以后才能访问,你可以创建的每一个产品。然后需要将你的 ProductId 集成到 Android 和 iOS 中去。
了解详情:
http://xingyun.xiaojukeji.com/docs/dokit/#/WebInstruction
4.
接口mock和健康体检技术原理
▍接口Mock
1. 整体流程图
第一步:
前往 dokit.cn 平台进行账号注册并登录, 然后在控制台中进行产品创建,并将产品 Id 集成到安卓和 iOS 中。具体参考上文安卓和 iOS 集成。
第二步:
在平台端的数据 Mock 模块中进行相应的接口 Mock 创建。
第三步:
每次进入 SDK 的数据 Mock 页面,会加载在 DoKit 平台添加的 Mock 接口列表并和本地数据进行合并。
第四步:
打开拦截接口开关并选中相应的场景或者打开接口模板开关 (拦截模块和模板模块相互独立),等待真实的网络请求命中我们的拦截规则。
拦截规则:
假如命中拦截规则我们会将 http 重定向到我们的 DoKit 后台并返回 Mock 数据。
模板规则:
假如命中模板规则,我们会将真实的接口数据保存,用户可以进入模板页面, 找到指定的模板项并将模板数据上传到我们的 DoKit 后台并用于创建场景。
▍效果演示
接口模板效果图
接口模板效果图
想象以下几种情形:
以前我们要在移动端要进行接口 Mock 的常规操作,基本上都是先拿到一个定义好的 mock 接口然后在代码中修改 url,然后等待编译、完成以后运行一下好像没什么问题然后又改回去编译。重复这样的操作。
一般来说我们泛前端都是需要依赖后端的接口进行开发的,这个操作无法同时进行,所以当多条业务需求同时开发的时候就容易由于资源不足和安排不当造成进度阻塞。
关于测试用例。一般来说我们在需求评审完成以后我们的测试人员就开始编写测试用例了,但是这样的用例往往都是文档化的,我们研发要进行用例测试边界情况的时候往往是通过修改代码来完成的。测试用例大部分用例也是依赖接口的。
当然不止以上几种情况, 我们都知道接口联调和测试在我们研发中占的比重是很大的,同时也是需要我们反复的修改代码来进行测试和适配,这往往消耗着我们绝大部分的精力。
那我们 dokit 的操作是怎么解决这个问题的呢?
我们 dokit 区别于其他接口 Mock 方案,因为我们具有端上的优势, 我们依赖端上的本地抓包功能,通过拦截所有的网络请求,根据 path 和 query 字段 (跟域名无关) 去匹配我们在平台端创建的 mock 接口。然后上传真实接口模板并支持各种场景切换。因为同一个接口往往具有不同的场景,比如验证码验证成功或者失败等等。测试也可以在我们平台端提前编写好测试用例接口以及各种边界情况。开发在研发阶段就能参与到测试用例的验证。也可以预想整理好整个链路的 mock 接口,让我们在测试过程中按照自己制定各种 case 往下走。
所以我们 DoKit 解决方案的最大优势就是:无需进行任何业务代码的修改的情况下去完成绝大部分的接口 Mock 需求。
▍健康体检
健康体检部分主要我们整合了 DoKit 端上的的各项工具,比如网络、cpu、fps、内存等 9 个性能指标。于此同时为了让整个流程更加的符合测试人员的操作习惯,我们化繁为简,将整个流程分为以下三步:
启动
正常的操作页面然后在每个页面根据倒计时提醒停留 10s 左右,完成每个页面的性能数据采集工作。
点击上传,填写用例的名称和测试人员名称,等待数据上传完成。
我们的每一次性能测试结果都将在我们的后台中进行记录。我们平台端记录的数据十分全面,基本上涵盖了我们的大部分需求,并且我们在后端会针对性能数据进行精准的分析并给出分析结果。还有就是我们针对性能数据进行了图表化的展示,使得每一次的性能测试更加直观。这样我们在整理的时候也不需要自己再根据数据去导出各种报表了,直接截图就可以用了。在这一块还是比较贴心的。
以下为健康体检的数据展现示例:
5.
接入方式
▍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
初始化SDK
#ifdef DEBUG#import #endif
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { #ifdef DEBUG [[DoraemonManager shareInstance] installWithPid:@"productId"];//productId 为在"平台端操作指南"中申请的产品 id #endif}
▍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"); }}
▍使用中心
其他更多细节的介绍和用户指南,请移至使用中心:
http://www.dokit.cn/
6.
Dokit社区活动
为了鼓励更多的开发者参与到Dokit开源项目的共建中来,Dokit 现发起长期有效的激励活动,只要给向 Dokit 提交PR,并被我们采纳的话,就有机会获得相应的奖品。
活动规则:每一个月为一次获奖周期,我们会统一评审本月所有被我们采纳的PR,挑选出前3名的贡献者,即可获得我们提供的奖品;
活动时间:2020-04-01 ~ 2020-12-31;
活动奖品:每个月前3的贡献者将会获得DoKit纪念T恤一件,并且可以加入到我们首页的外部贡献者名单中。优秀贡献者,更有有机会在年末邀请至北京,参加滴滴开源年度盛典。
提交的PR可以包含:① 现在一些未解决的issues的处理。② 对于现有功能的一些优化。③提供单独的工具集成到DoKit中。④其他有利于DoKit发展的任何事项。
获奖名单每个月都在该issues和「DoKit开源社区」公众号中同步,获奖同学联系QQ用户群 @didi_iOS_易翔 或者 @didi_Android_金台 领奖。
DoKit开源社区公众号
7.
总结
最后还是要感谢一下社区一直以来的支持,是你们的积极响应和反馈让 DoKit 变得更好,DoKit 所取得的所有成绩都来自于大家共同的努力。未来,DoKit 还有很长的路要走,我希望接下来走的每一步都有你的陪伴。
附上 GitHub 地址,欢迎留下你的小星星:
https://github.com/didi/DoraemonKit
推荐阅读
▬
更多推荐
▬
滴滴开源 / Open Source
Nightingale | FastLoad | Levin | AoE | Delta | Mpx | Booster | Chameleon | DDMQ | DroidAssist | Rdebug | Doraemonkit | Mand Moblie | virtualApk | 获取更多项目
技术干货 / Recommended article