HDC2021技術分論壇:程式崩潰/應用卡死,故障頻頻怎麼辦?

HarmonyOS開發者社群發表於2021-12-10

作者:jiwenqiang,DFX技術專家

 

提到開發一個產品,我們通常首先想到的是要實現什麼樣的功能,但是除了功能之外,非功能屬性也會很大程度上影響一個產品的體驗效果,比如不定時出現的應用卡死、崩潰現象。那為什麼有的系統故障頻頻,有的卻很少出現這些問題呢,這就不得不提到我們今天的主角DFX了。

 

一、什麼是DFX?


DFX是早在1960~1970年代就出現的產品設計理念,但是對於不少開發者而言,這是一個陌生的概念,什麼是DFX?所謂DFX(Design For X),是指產品的非功能屬性設計,其中的X代表產品的某個特性或者產品生命週期的某個階段。

 

從下面的圖可以看出,產品的非功能屬性是非常豐富的,它們直接影響產品的質量、效率、成本等這些長期核心競爭力。

圖1 產品DFX

 

在過去的幾年裡,華為軟體的交付效率和質量一直在不斷提高,每個軟體大版本相較於上個版本交付時間在不斷縮短,故障率也有大幅降低,這些提升的背後,DFX起到了很重要的作用。

 

隨著業界認識的深入,DFX逐漸成為了卓越產品設計的基石以及頭部企業產品設計開發的基礎設施,因此現在對DFX又有了另一種解釋,即“Design For eXcellence”,面向卓越的設計。

 

二、什麼是作業系統DFX?

 

現在我們瞭解了DFX的概念,也知道DFX設計對產品來說異常重要,因此我們在設計HarmonyOS的時候,堅持將DFX的理念帶了進來,使其成為作業系統的公共基礎設施,使能高質量卓越產品的設計、實現、測試和維護。通過對應用程式、裝置產品這些作業系統所服務的物件進行考察,我們歸納出系統所能提供的非功能需求,並從中提煉出公共、基礎的DFX框架加入到HarmonyOS中,這就產生了作業系統DFX。開發者在使用HarmonyOS的過程中,可以根據產品需要直接使用或靈活擴充這些DFX能力。

 

圖2 作業系統DFX

 

看到這裡,大家可能會覺得,作業系統DFX不就是將產品DFX的能力拷貝到作業系統中嗎。其實不然,作業系統DFX相較於產品DFX有兩個顯著的不同點:

 

  • 由於作業系統不是為某類產品所專門定製的,而是一個全棧、公共的基礎設施,因此作業系統DFX主要聚焦記錄、診斷、恢復、觀測、剖析、維護和服務等開發產品所需要的公共能力。
  • 作業系統DFX更多地關注開發者和裝置商的開發體驗,以幫助他們設計出更卓越的產品為目標。


三、HarmonyOS對DFX能力的要求


既然作業系統DFX是為了使能開發者開發出更卓越的產品,而HarmonyOS中也加入了DFX框架和能力,那麼大家一定很好奇,HarmonyOS中的DFX是什麼樣的?DFX能為HarmonyOS帶來些什麼呢?在回答這些問題之前,我們先來看一下HarmonyOS對DFX能力的要求。

 

幾乎所有的操作對DFX的要求都包含以下三方面:

  • 輕量有效:系統資源開銷少,易用易學習,精準有效。
  • 基礎通用:關鍵、基礎、通用、易擴充套件,方便開發者裁剪和增強。
  • 覆蓋全面:全面服務應用和裝置品類,全面服務開發者和裝置商,全面覆蓋產品全生命週期。


HarmonyOS除了這些基本要求外,還對DFX提出了新的要求:

 

我們知道,HarmonyOS是面向超級終端的系統,而不同超級終端的資源可能是差距巨大的,比如有的富裝置提供的資源為RAM 8GB、ROM 512GB,而有的瘦裝置卻只有RAM 128KB、ROM 2MB。面對這麼大的資源差異,HarmonyOS對DFX提出了支援全棧多語言、可大可小、靈活部署的要求。

 

除了面向超級終端,HarmonyOS的另一大特色是其豐富的分散式超級終端場景支援能力,因此HarmonyOS要求系統的DFX能力要能夠支援分散式場景,比如分散式的日誌、分散式跟蹤、分散式除錯調優等等。 
 

圖3 HarmonyOS對DFX能力的要求

 

四、HarmonyOS DFX框架與能力

 

通過上面的介紹,相信大家已經對作業系統DFX的概念有了一定的瞭解,那麼我們現在開始進入正題,給大家介紹一下HarmonyOS DFX的框架與能力。

 

圖4 HarmonyOS DFX框架和能力全景圖

 

圖4的全景圖中間褐色部分為HarmonyOS DFX所提供的能力。

 

HarmonyOS DFX提供了以下能力:

(1)記錄能力:提供了輕量的日誌、事件和跟蹤功能,可以將程式執行的軌跡記錄下來,為後續分析度量奠定基礎。

(2)故障管理能力:提供精準有效的故障檢測、定位和恢復能力。

(3)觀測剖析能力:提供了統一便捷的觀測與剖析工具,主要包含資訊匯出、資訊分析和聯動除錯能力。

 

那麼這些DFX能力的作用又是什麼呢?從全景圖中代表DFX的中間部分與周邊的關係可以看出,DFX的這些能力不僅需要為作業系統的其他子系統提供服務,其更重要的使命是支撐影音娛樂、智慧出行等軟體應用以及“1+8+N”等硬體裝置。除此之外,這些能力也是產品開發運維工具鏈的基礎,需要支撐開發除錯的IDE工具以及產品運維大資料分析平臺的構建。

 

在瞭解了HarmonyOS DFX的框架之後,我們知道HarmonyOS DFX主要包含日誌、事件、跟蹤、故障管理、觀測剖析這5部分。日誌、事件和跟蹤體現了DFX的記錄能力,故障管理能夠幫助開發者快速定位和發現問題,而觀測剖析則是通過一系列工具,幫助開發者在整合的環境下使用這些DFX能力。接下來我們就來逐個看看HarmonyOS中所具備的這些DFX能力。

 

1. 日誌(HiLog)


日誌通常被視為最簡單的功能,但是在開發者使用日誌的過程中,有兩個比較明顯的問題,一個是濫打日誌現象,另一個是隨著軟體規模和組織規模的擴大,系統日誌雜亂、流量超大的問題越來越嚴重,不僅容易洩露隱私,甚至連開發者想檢視自己的日誌都變得愈發困難。針對這兩個問題,HarmonyOS DFX設計了一套全新的日誌功能——HiLog。下面是HiLog的示意圖。

 

圖5 日誌(HiLog)

 

從上圖可以看出,HiLog不僅提供了支援JS/Java/C/C++多語言的日誌採集功能,還著重在日誌分類查詢、流量控制和隱私處理上做了專門設計。下面我們逐個看看這些設計。

 

(1)分類查詢

 

為了解決日誌雜亂、不便檢視的問題,HiLog對於不同級別的日誌進行了分類,提供分級查詢日誌的命令。並且除了可以按照級別(Level)、型別(Type)、標籤(Tag)檢視日誌,還提供了按照領域(Domain)檢視日誌的命令。所謂領域是指跨軟體棧層次的業務垂域。那麼我們為什麼要按照領域檢視日誌呢?我們設想一下以下場景:Camera功能領域包含應用、服務和驅動,開發者如果想從一堆日誌中過濾出Camera領域的日誌,是沒有功能支援的,用老的過濾方法是不行的。為此,我們給需要的領域定義了DomainID,通過領域過濾來解決這個問題。

 

(2)流量控制

 

通過分類查詢,我們解決了日誌檢視不便的問題,但是超量的日誌也會對系統效能產生巨大影響,根據經驗,如果把系統中所有日誌全部都開啟,嚴重的情況下系統的效能可能會下降至70%。那麼該如何解決日誌超量的問題呢?

 

HiLog通過對不同領域的日誌總量進行流控來解決這個問題,在採集日誌時,記錄每個領域的日誌總量,識別出超過閾值的領域,然後對該領域的超量日誌進行控制。其中對超量日誌的處理在除錯(Debug)和商用(Release)兩種模式下有不同的處理策略:在Debug模式下,會提示超量日誌,但不會真的丟棄超量日誌。而在Release模式下,會將超量的日誌丟棄並列印一條日誌丟棄的提示。

 

圖6 流量控制的兩種模式

 

(3)隱私管控

 

除了查詢不便和超量日誌問題,日誌的隱私管控也需要引起重視。在我們開發除錯的過程中,經常會傾向於列印更多的資訊,這就很有可能將使用者隱私資訊也列印出來,比如姓名、訪問的URL地址等。而現在對於隱私洩露的處罰是比較嚴厲的,歐盟的《通用資料保護條例》(General Data Protection Regulation,簡稱GDPR)針對隱私洩露最高罰款2千萬歐元或年度營業額的4%,因此,我們在日誌列印的時候需要非常謹慎,不能將使用者隱私列印到日誌裡。

 

為了對隱私安全進行管控,HiLog提供了變數列印控制功能,開發者可以通過格式化字元{private}或{public}靈活對變數內容進行宣告,如果宣告為{private},則表示該變數為隱私變數,在Release模式下會隱藏這些隱私的變數內容,而對於不需要管控的變數,則可用{public}來指明,不進行隱藏。

 

圖7 HiLog的變數列印控制

 

2. 事件(HiView)


除了日誌以外,HarmonyOS DFX對事件也提供了記錄能力,併為此設計了一套全新的事件框架(HiView)。

 

圖8 事件框架HiView

 

我們知道,事件可能來源於應用,也可能來源於系統,因此HiView框架分為系統事件框架和應用事件框架兩個部分。每個部分都提供了事件採集介面,系統事件框架使用HiSysEvent介面,應用事件框架使用HiAppEvent介面。除此之外,HiView還提供了靈活的訂閱查詢介面,可以為後端處理者分享採集到的事件。該介面的應用場景有很多,比如IDE可以通過此介面訂閱事件,從而在除錯介面上呈現事件,而系統廠商也可以通過此介面訂閱事件,再進行定製化處理。

 

另外,HiView還對系統事件框架的處理邏輯做了外掛化設計,通過在HarmonyOS上配置和部署系統外掛,可以實現對不同大小終端裝置的靈活適配。

 

3. 跟蹤(HiTrace)


接下來,我們來看一下HarmonyOS DFX的最後一項記錄能力——跟蹤。

 

由於HarmonyOS是面向超級終端的系統,因此除了像常規作業系統那樣跟蹤應用間、程式間的互動過程,還需要具備跨裝置跟蹤程式互動過程的能力。在HarmonyOS中,這種分散式跟蹤的能力由HiTrace提供,而HiTrace通過TraceID的傳遞來對整個業務鏈進行跟蹤。TraceID不僅能夠在APP、Native、Kernel之間跨層傳遞,還能夠跨程式、甚至跨裝置傳遞。值得一提的是,HiTrace是一種輕量級的跟蹤機制,在Wi-Fi條件下僅僅會增加微秒級延遲,而這種延遲對系統來說影響是非常小的。

 

圖9 HiTrace分散式跟蹤

 

4. 故障管理


除了上面介紹的一些記錄能力,故障管理也是HarmonyOS DFX的一項重要能力。為了幫助開發者快速定位和發現問題,HarmonyOS DFX在系統側部署了全量、精準的故障檢測機制,包含7類單系統故障檢測器(程式崩潰、應用卡死、資源洩露、踩記憶體、整機重啟、不開機和系統當機)和1類分散式故障檢測器,通過這些檢測器,故障檢測率可以達到80%以上。為了滿足HarmonyOS面向超級終端的特性,這些故障檢測器還可以在不同裝置上根據資源靈活進行部署。

 

圖10 故障檢測器

 

由於篇幅原因,下面我們重點對這7類故障檢測器中的程式崩潰檢測器、應用卡死檢測器以及系統當機檢測器進行介紹:

 

(1)程式崩潰檢測器

 

說到程式崩潰大家一定都不陌生,這是一種最常見的故障,對此的檢測機制也都比較成熟,但當前的檢測機制還存在著一些問題,比如,應用程式無法直接獲取自己程式相關的崩潰日誌,崩潰日誌包含很多無效資訊、重複資訊,以及抓取崩潰呼叫棧失敗等。為了解決這些問題,HarmonyOS DFX對其提供的程式崩潰檢測器做了以下特殊設計:

  • 支援Java/JS/Native全棧檢測。
  • 開放專門的API給應用程式查詢自己程式的崩潰日誌,能且只能獲取自己程式的崩潰資訊,解決了應用無權獲取自己崩潰日誌的問題。
  • 通過對崩潰日誌資訊的去重,刪除了很多的無效資訊,幫助開發者更加準確地定位資訊。
  • 支援同時抓取多個程式的呼叫棧,避免抓取日誌不全的問題,保證更準確地還原故障現場。


(2)應用卡死&系統當機檢測器

 

應用卡死和系統當機也是比較常見的故障,它們一般概率性發生,但是嚴重影響使用者體驗。檢測這類問題的難點在於,如何將軟體故障與使用者感知的當機故障做有效匹配,如果所有軟體bug都上報,開發者會無從下手,而如果漏檢了則又無法準確定位。為此,HarmonyOS DFX對應用卡死&系統當機檢測器,做了以下特殊設計:

  • 在系統中部署了32個檢測點,全面檢測軟體當機故障。
  • 另外增加了4個使用者行為檢測點,準確檢測使用者對當機現象的反應。

 

這些部署的檢測點支援根據不同裝置的故障模式靈活部署,如果我們的裝置沒有螢幕,那麼就不用去部署亮滅屏超時及快速點選螢幕檢測點。除了測點,判決規則也能夠根據故障檢測結果的大資料分析動態進行調整。通過上述優化,當機故障檢測率從30%提升到了80%。

 

圖11 應用卡死&系統當機檢測

 

5. 觀測剖析


看到這裡,大家或許會有個疑問,開發者如何才能使用HarmonyOS DFX所提供的這些日誌、事件、跟蹤和故障管理能力呢?那接下來我們就來介紹一下我們的觀測剖析工具,這些工具可以幫助開發者分析定位問題、除錯調優。

 

(1)資訊匯出工具(HiDumper)

 

開發者在開發、除錯、測試、維護等過程中,需要頻繁觀測系統的各種資訊,一般這些觀測資訊都是通過資訊匯出來獲得。雖然通常作業系統都會提供各類資訊匯出工具,但是這些工具之間可能規則差異很大,並且很難對自動化測試工具或IDE進行適配。隨著產品種類的增加,系統要匯出的資訊也變得異常豐富,資訊匯出介面多、能力雜,適配難的問題也更加凸顯。

 

為了避免上述資訊匯出問題,HarmonyOS提供了統一的系統資訊匯出工具HiDumper,相比於其他資訊匯出工具,HiDumper對命令引數進行了統一的規格化管理,並對所有匯出資訊進行分類、排程和輸出,減少了後端工具的適配難度。

 

圖12 資訊匯出工具HiDumper

 

(2)分散式聯動除錯工具

 

目前的APP除錯一般都是使用本地偵錯程式,每個待除錯裝置需要一套獨立的除錯終端和IDE工具,這顯然不能很好地支援需要多裝置之間聯動除錯的分散式業務場景。為了應對這種場景,HarmonyOS全新開發了分散式聯動除錯工具,將跨裝置的日誌、事件、跟蹤及故障日誌在同一個IDE除錯視窗進行關聯展示,給開發者類似單裝置除錯的視窗體驗。IDE執行時能自動捕獲異常資訊,通過異常資訊關聯出相關的事件列表和流水日誌,再通過異常日誌能準確定位到程式碼行,大大提高除錯效率。

 

圖13 分散式聯動除錯

 

(3)分散式調優工具

 

在介紹完觀測和除錯工具之後,最後我們再來看一下調優工具。HarmonyOS新開發的分散式調優工具,能準確全棧跟蹤JS/Java/C/C++等多語言呼叫鏈,記錄跨執行緒、跨程式、跨裝置等不同顆粒度的活動,生成規格化的HiTrace檔案。通過將HiTrace檔案在IDE圖形化工具中展示,開發者可以很便利地分析分散式應用效能瓶頸。

 

圖14 分散式調優

 

以上就是我們對於HarmonyOS DFX關鍵部分的介紹了,相信大家對於DFX的概念也有了初步的認識。

 

後續,HarmonyOS DFX將在缺陷檢測、故障恢復、大資料分析以及更多除錯調優工具方面繼續努力,為開發者提供更多能力,助力開發者開發更卓越的產品,大家敬請期待!

 

掃碼新增開發者小助手微信

獲取更多HarmonyOS開發資源和開發者活動資訊

相關文章