潘炳征PAN Bing-zheng
(廣西師范大學計算機科學與工程學院/軟件學院,桂林 541004)
鴻蒙是基于微內核的全場景分布式操作系統[1]。物聯網設備的多樣性與現有操作系統特異性阻礙著設備間的有效協同,而鴻蒙從操作系統、設備通信及應用程序等方面進行了相應的統一,有效解決了物聯網設備之間互聯的問題。
鴻蒙響應物聯網時代的召喚,并非對標安卓與IOS[2],借助微內核、分布式等技術實現設備的全場景化,為用戶帶來一致、高效的體驗。
鴻蒙應用程序包由一個或若干個HAP 與pack.info 構成,pack.info 用來描述每一HAP 的屬性。HAP 分為主HAP(簡稱Entry)與特征HAP(簡稱Feature),Entry 即針對特定設備的應用程序入口,Feature 即應用程序的動態特征模塊[3]。不同設備可根據不同的需求下載安裝不同的HAP,如此不必下載安裝整個應用程序包,節省設備的存儲空間。程序包結構如圖1 所示,該圖來源于鴻蒙開發者官網[3]。

圖1 鴻蒙應用程序包結構
Ability 是應用能力的抽象,類型分為FA 與PA 兩種。FA 即Page Ability,PA 包括Service Ability 與Data Ability。一個PageAbility 由一個或若干個AbilitySlice 構成,AbilitySlice 包含應用程序單個頁面及其所有控制邏輯[4]。
Intent 用于對象之間傳遞信息,可通過其指定啟動目標同時攜帶數據,由Operation 以及Parameters 構成[5]。常用于啟動與導航到Ability。
鴻蒙提供Java UI 框架與方舟開發框架。Java UI 提供細粒度的UI 編程接口,采用命令式編程規范,擁有最為豐富的API,使開發者更加靈活地進行鴻蒙應用開發。方舟開發框架提供高層UI 描述,采用聲明式編程規范,使開發更簡單,但其API 較為有限。鴻蒙生態尚屬于發展初期,組件相對缺乏,筆者認為一些簡單功能的實現較目前主流的框架更繁瑣。
分布式數據庫是一種NoSQL 數據庫,采用鍵值對的形式組織、索引與存儲數據。
單版本分布式數據庫,以單個鍵值對為單位的形式將數據保存在本地,有且僅有一個鍵,當一條數據在本地被修改時則會直接進行修改,同時將最新的數據同步至遠端設備。[6]
KvManagerConfig:用于配置KvManager 相關信息,包括應用與網絡狀態等。
KvManagerFactory:根據KvManagerConfig 創建分布式數據庫的KvManager。
Options:用于配置KvStore 相關信息,包括數據庫備份、加密與自動同步選項等。
KvManager:負責管理分布式數據庫,根據Options 對分布式數據庫KvStore 進行創建、打開、關閉與刪除操作。
KvStore:某一具體分布式數據庫,可對數據進行增加、刪除、查詢與修改。
五者之間關系如圖2。

圖2 分布式數據庫對象之間關系
分布式數據服務包括服務接口、服務組件、存儲組件、同步組件以及通信適配層。應用調用分布式數據服務接口進行數據庫操作,數據服務接口基于數據服務組件所提供的能力將數據保存至存儲組件,存儲組件通過調用同步組件進行同步數據,同步組件將數據發送至通信適配層以此實現遠端設備的數據同步;遠端設備利用同步組件從通信適配層接受數據,并同步至本端存儲組件,通過數據服務接口獲取數據并提供給本端應用使用[7]。數據分布式運作機制如圖3 所示,該圖來源于鴻蒙開發者官網[7]。

圖3 分布式運作機制
應用基于Codelabs 中的分布式手寫板以及AI 能力的語音播報系統案例進行開發[7]。
主界面如圖4 所示,點擊不同的按鈕跳轉到不同的PageAbility。

圖4 主界面
PageAbility 之間的跳轉實現步驟如下:
①為組件設置點擊事件,后續操作在事件中編寫。②創建Intent 對象。③創建Operation 對象,設置與Intent對象相關的設備Id、包名以及Ability 名稱參數,調用build()方法完成創建。④將Operation 對象設置到步驟②所創建的Intent 對象。⑤MainAbilitySlice 調用startAbility()方法,參數為Intent 對象。
實現分布式畫板需要在config.json 文件中配置多設備協同所要求的的四個權限。后續實現步驟如下。
2.2.1 初始化分布式數據庫
①創建分布式數據庫管理對象。首先在當前頁面上下文創建KvManagerConfig 對象,最后根據該對象創建KvManager 分布式數據庫管理器實例。②創建單版本分布式數據庫。首先創建Options 對象,其次將Options 對象設置相關的信息,最后基于Options 對象以及數據庫Id 標識符,KvManager 實例調用getKvStore()方法獲得與打開單版本分布式數據庫實例。③訂閱分布式數據變化。首先在客戶端實現KvStoreObserver 接口, 本例中即在WriteAbilitySlice 類中定義內部類及實現該接口;其次利用上述內部類創建KvStoreObserver 對象;最后基于KvStoreObserver 對象,單版本分布式數據庫實例調用subscribe()方法完成單版本分布式數據庫的數據變化訂閱。
2.2.2 初始化畫布
封裝好的DrawPoint 類,存放所有繪制點的基本信息與繪圖[8];drawPoints()方法將數據庫中的點數據在畫布上繪制。①初始畫布。首先獲取一種畫筆顏色,其次生成DrawPoint 類對象,將該對象添加到布局當中,最后調用drawPoints()方法進行繪圖。②設置DrawPoint 類對象的繪制圖形回調函數。首先將點數據利用GsonUtil 工具類轉換成Json 格式字符串,最后利用單版本分布式數據庫實例調用putString()方法將Json 字符串寫入數據庫。③設置同步撤回按鈕的點擊事件。首先獲取DrawPoint 類對象中的點數據;其次先移除點數據中的最后一個點,再從后往前遍歷所有點,將不屬于筆畫中的最后一個點進行移除,直到遇到筆畫中的最后一個點結束循環;最后將點數據重新設置到DrawPoint 類對象,更新單版本分布式數據庫實例。
2.2.3 設備連接
①在協同按鈕組件點擊事件中新建在線可同步設備選擇對話框。②在對話框的點擊事件中,根據所選設備Id啟動遠程界面。首先根據設備的數量生成Intent 對象數組;其次為每個Intent 對象設置是否是遠程、顏色以及數據庫標識符參數,再創建Operation 對象,同時將設備Id、包名、Ability 名稱以及多設備遠程啟動標識與Intent 對象相關聯;最后啟動遠程Ability。③在啟動遠程界面后,單版本數據庫實例調用sync()方法同步遠程數據庫。
TTS 語音播報引擎由華為官方提供,該引擎基于華為智慧引擎,提供將文本進行語音播報的能力[9]。實現文字播報步驟如下。①創建TTS 客戶端。創建TtsListener 監聽器,重寫創建TTS 客戶端成功的回調函數。重寫方法如下,首先設置TtsParams 對象的設備Id,最后利用TtsParams 對象初始化TTS 客戶端。②轉換音頻并播報。在成功創建TTS 客戶端之后,調用speakText()方法將文本轉換成音頻并播放。
在本地端點擊設備按鈕彈出設備選擇對話框,選擇設備之后將拉起遠程端。每一設備的筆跡都將同步,不同設備的筆跡顏色不盡相同,每一設備都可撤回筆跡。該功能可應用于如下場景。親子之間、伙伴之間協同學習娛樂;學校課堂上師生教學互動;公司會議上分享交流等等。
聽一聽界面如圖5 所示。

圖5 聽一聽
在文本框輸入文本內容后,點擊語音播報按鈕即可進行文字播報。該功能可應用如下場景。想聽某一段從其他應用復制的文本;知識點的溫故復習;啞人與他人之間的交流;未受過教育者學習漢語;視頻制作的簡易配音等等。
本文僅從鴻蒙分布式以及AI 能力的簡單應用進行研究,而鴻蒙有眾多的能力與特性,其應用的場景廣泛,這需要廣大開發者積極探索。鴻蒙作為國產操作系統的希望,其誕生是突破國外科技封鎖的重要里程碑,其生態建設需要每一開發者的積極努力。