工欲善其事,必先利其器。 --《論語·魏靈公》
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,這也是我們實現目標的第一步。
二、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。
(2)健康體檢
一鍵式操作,整合DoKit多項工具,資料視覺化,快速準確定位問題,讓你對app的效能瞭如指掌。
(3)DBView
主要能幫我們將db等本地資料在瀏覽器中進行操作,十分方便。 DBView和本地沙盒的主要區別在於本地資料庫在端上的體驗效果並不是很好,因為受限於螢幕的大小,所以我們引入這DBView,可以將我們的本地資料庫和瀏覽器打通,在瀏覽器上進行增刪改查等等操作,提升我們的效率。
-
android直接接入的Android-Debug-Database方案;
-
iOS是由社群同學y500提供的iOSDebugDatabase, 感謝該同學的貢獻。
(4)函式耗時
Android:函式耗時主要通過ASM程式碼插裝的方式,會在指定的包名下進行程式碼插裝,統計每個函式的耗時,預設情況下會在控制檯中將執行時間大於200微妙的函式呼叫棧列印出來。後續我們計劃將函式耗時和平臺端打通,記錄下每一個函式耗時操作。
iOS:iOS採用的額是Hook objc_msgSend, 會以樹形結構列印出某一段操作中具體的函式耗時,比Xcode的TimeProfiler更加直觀。
Android端效果圖
(5)其他工具
-
快速跳轉到應用設定 : 避免手動去設定裡面尋找App的麻煩;
-
NSUserDefalult(iOS) : 對於NSUserDefalult的資料方便進行增刪改查;
-
UI層級檢查 : 檢查每一個UI介面的層級,層級太深的話,會影響一定的效能;
-
啟動耗時 : 檢查每一次啟動消耗的時間;
-
UI結構(IOS) :可以動態改變每一個UI元素的屬性,感謝社群HDB-Li提供;
使用者可以自行更新體驗。
三、dokit.cn 平臺介紹
為了讓Dokit的端上能力得延伸和擴充套件,同時也是為了更好的服務好我們的每一個業務方,讓DoKit成為一個能夠滿足泛前端開發、測試、設計等等各方都需要的功能豐富的通用型平臺。我們組內經過討論決定推出dokit.cn。 平臺端主要包含以下幾項內容:
1)使用者登入
2)使用中心
4)控制檯: 主要提供產品管理、使用者管理、資料Mock、健康體檢等功能。必須登入以後才能訪問,你可以建立的每一個產品。然後需要將你的ProductId整合到Android和iOS中去。詳細介紹
四、介面mock和健康體檢技術原理
4.1、介面Mock
整體流程圖
第一步: 前往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需求。
4.2、健康體檢
健康體檢部分主要我們整合了DoKit端上的的各項工具,比如網路、cpu、fps、記憶體等9個效能指標。於此同時為了讓整個流程更加的符合測試人員的操作習慣,我們化繁為簡,將整個流程分為以下三步:
1)啟動
2)正常的操作頁面然後在每個頁面根據倒數計時提醒停留10s左右,完成每個頁面的效能資料採集工作。
3)點選上傳,填寫用例的名稱和測試人員名稱,等待資料上傳完成。
我們的每一次效能測試結果都將在我們的後臺中進行記錄。我們平臺端記錄的資料十分全面,基本上涵蓋了我們的大部分需求,並且我們在後端會針對效能資料進行精準的分析並給出分析結果。還有就是我們針對效能資料進行了圖表化的展示,使得每一次的效能測試更加直觀。這樣我們在整理的時候也不需要自己再根據資料去匯出各種報表了,直接截圖就可以用了。在這一塊還是比較貼心的。
以下為健康體檢的資料展現示例:
五、接入方式
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的最新訊息,包括一些隱藏福利和重磅功能提前體驗。
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變得更好,DoKit所取得的所有成績都來至於大家共同的努力。未來,DoKit還有很長的路要走,我希望接下來走的每一步都有你的陪伴。
附上github地址:
github.com/didi/Doraem… 留下你的小星星。