背景
作為全球領先的一站式旅遊服務平台,攜程始終堅持以技術創新為發展核心。自鴻蒙釋出以來,我們便投入研發力量進行調研、開發,并成功落地了攜程機票項目、服務卡片項目等。現将鴻蒙項目中相關經驗整理分享,希望能給大家一些參考,也希望鴻蒙發展能越來越好。
一、鴻蒙系統簡介
華為鴻蒙HarmonyOS系統是面向萬物互聯的全場景分布式作業系統,目前鴻蒙系統已從2.0更新更新至Beta 3.0,支援手機、平闆、智能穿戴、智慧屏等多種終端裝置運作,提供應用開發、裝置開發的一站式服務。
憑借多終端開發IDE,多語言統一編譯,分布式架構Kit提供螢幕布局控件以及互動的自動适配,支援控件拖拽,面向預覽的可視化程式設計,使開發者可以基于同一工程高效建構多端自動運作App,實作真正的一次開發,多端部署,在跨裝置之間實作共享生态。
作為萬物互聯時代的作業系統,“分布式技術”鑄就了鴻蒙的核心競争力,在5G這個萬物互聯的時代有着巨大的優勢。
二、鴻蒙系統開發
2.1 開發語言
鴻蒙适合的開發語言是Java、JavaScript、C++,其中Java、JavaScript适合用于手機應用UI界面開發工作,C++和JavaScript适合嵌入式裝置UI界面相關開發工作。隻有JavaScript寫的UI界面可以跨裝置使用。
在以後的鴻蒙版本中(計劃是3.0),即将推出倉颉語言開發(倉颉語言是華為自主研發的一款語言)。目前主推的還是Java和JavaScript。
鴻蒙服務卡片開發,可以使用Java和JavaScript(華為建議JavaScript),其中Java和JavaScript服務卡片場景及能力差異如下:
場景 | Java卡片 | JS卡片 | 版本 |
實時重新整理 | Java使用ComponentProvider做實時重新整理代價比較大 | JS可以做到端側重新整理,但是需要定制化元件 | HarmonyOS 2.0及以上 |
開發方式 | Java UI在卡片提供方需要同時對資料群組件進行處理,生成ComponentProvider遠端渲染 | JS卡片在使用方加載渲染,提供方隻要處理資料、元件和邏輯分離 | HarmonyOS 2.0及以上 |
元件支援 | Text、Image、DirectionalLayout、PositionLayout、DependentLayout | div、list、list-item、swiper、stack、image、text、span、progress、button(定制:chart 、clock、calendar) | HarmonyOS 2.0及以上 |
卡片内動效 | 不支援 | 暫不開放 | HarmonyOS 2.0及以上 |
陰影模糊 | 不支援 | 支援 | HarmonyOS 2.0及以上 |
動态适應布局 | 不支援 | 支援 | HarmonyOS 2.0及以上 |
自定義卡片 | 不支援 | 支援 | HarmonyOS 2.0及以上 |
2.2 鴻蒙系統架構
在說明鴻蒙系統架構之前,首先要了解AOSP(Android Open-Source Project,Android 開放源代碼項目)和Google Android的差別。AOSP可以随便用,但隻有經過Google認證的Android才能安裝GMS和Google Play。Google控制的是GMS和Google Play,無權控制Android。
HarmonyOS整體遵從分層設計,從下向上依次為:核心層、系統服務層、架構層和應用層。系統功能按照“系統 > 子系統 > 功能/子產品”逐級展開,在多裝置部署場景下,支援根據實際需求裁剪某些非必要的子系統或功能/子產品。
HarmonyOS技術架構如下所示:
AOSP大緻對應圖中的UI架構+使用者程式架構+Ability架構。為了相容Android,Harmony使用了AOSP的部分代碼,用來建構Android應用相容層來運作Android應用。鴻蒙架構解析後将資料交給了Android,由Android的負責将其渲染在SurfaceView上。
HarmonyOS采用多核心設計,支援針對不同資源受限裝置選用适合的OS核心。核心抽象層(KAL,Kernel Abstract Layer)通過屏蔽多核心差異,對上層提供基礎的核心能力,包括程序/線程管理、記憶體管理、檔案系統、網絡管理和外設管理等。
系統服務層分布式軟總線技術将物聯網通訊技術(NFC、藍牙、WIFI……)與協定(CoAP、RPC……)做了良好的封裝,以及對資料格式(HarmonyOS IDL)以及服務(PA)做了良好的抽象,使區域網路内的裝置之間可以友善的通訊、交換資料、調用遠端服務,裝置之間仿佛融為一體。
架構層為HarmonyOS應用開發提供了Java/C/C++/JS/TS等多語言的使用者程式架構和Ability架構,兩種UI架構(包括适用于Java語言的Java UI架構、适用于JS/TS語言的方舟開發架構),以及各種軟硬體服務對外開放的多語言架構API。
應用層包括系統應用和第三方非系統應用。HarmonyOS的應用由一個或多個FA(Feature Ability)或PA(Particle Ability)組成。其中,FA有UI界面,提供與使用者互動的能力;而PA無UI界面,提供背景運作任務的能力以及統一的資料通路抽象。FA在進行使用者互動時所需的背景資料通路也需要由對應的PA提供支撐。基于FA/PA開發的應用,能夠實作特定的業務功能,支援跨裝置排程與分發,為使用者提供一緻、高效的應用體驗。
我們今天主要從應用層開發方面展開。
三、攜程鴻蒙服務卡片
攜程很早就在鴻蒙OS發力,基于HarmonyOS分布式能力,開發了攜程機票手機、手表關聯項目。在HarmonyOS推出原子化能力後,又上線了攜程會員中心、核酸檢測、攜程火車票服務卡片,以期給到使用者更多的選擇。
3.1 開發流程
通過HarmonyOS 系統能力、開發指導、API參考等文檔,利用 HUAWEI DevEco Studio 開發工具,開發不同裝置的應用,為使用者帶來全場景體驗。
總結起來,整個開發流程分為開發準備、應用開發、應用測試、應用釋出幾個流程。
階段 | 流程 |
開發準備 |
|
編寫代碼 |
|
應用測試 |
|
釋出 |
|
3.2 服務卡片
服務卡片(以下簡稱“卡片”)是FA的一種界面展示形式,将FA的重要資訊或操作前置到卡片,以達到服務直達,減少體驗層級的目的。
經調研,從安卓到鴻蒙,最明顯的變化應該就是服務卡片。故我們計劃以服務卡片作為切入點,實作攜程鴻蒙服務卡片功能。經過版本逐漸疊代,目前已上線了會員簽到、核酸檢測、搶火車票等功能。
由于整個開發流程中,開發準備和釋出流程參考文檔即可完成,僅從編寫代碼和應用測試兩方面展開,給大家簡單介紹一下。
3.3 服務卡片開發
考慮快速開發上線的需求,我們調研使用鴻蒙Native+Webview混合開發的模式,通過Native層處理持久化等相關能力,Webview實作功能進行展開。
3.3.1 鴻蒙Webview實作功能
首先,通過XML布局檔案進行操作:
<ohos.agp.components.webengine.WebView
ohos:id="$+id:health_webview"
ohos:height="match_parent"
ohos:width="match_parent"/>
注意:ohos.agp.components.webengine.WebView和WebView都是有提示的。但WebView與ohos.agp.components.webengine.WebView并不等價,這可能是鴻蒙的一個漏洞,直接輸入 WebView 并不能使用這個元件。
然後在Native代碼中執行個體化Webview:
private void initWebview(){
WebConfig webConfig = webView.getWebConfig();
if (null != webConfig){
webConfig.setWebStoragePermit(true);//
webConfig.setJavaScriptPermit(true); // 如果網頁需要使用JavaScript,增加此行;
webConfig.setSecurityMode(WebConfig.SECURITY_ALLOW);
webConfig.setLocationPermit(true);
webConfig.setDataAbilityPermit(true);
webConfig.setMediaAutoReplay(true);
webConfig.isLoadsImagesPermitted();//webview是否下載下傳圖檔資源
webConfig.setTextAutoSizing(true);
webConfig.setViewPortFitScreen(true);
}
setWebViewCookie();
this.webView.setWebAgent(new TripWebAgent());
webView.load(HEALTH_URL);
}
3.3.2 服務卡片配置
卡片應用是一款特殊的元能力服務,其配置檔案config.json中聲明以下幾項,系統能夠識别該應用為一款卡片應用,并與系統進行綁定。
config.json檔案"abilities"配置forms子產品細節如下:
"forms": [
{
"landscapeLayouts": [
"$layout:health_2_2",
"$layout:health_2_4"
],
"isDefault": true,
"scheduledUpdateTime": "10:30",
"defaultDimension": "2*2",
"name": "health",
"description": "$string:health_title",
"colorMode": "auto",
"type": "Java",
"supportDimensions": [
"2*2",
"2*4"
],
"portraitLayouts": [
"$layout:health_2_2",
"$layout:health_2_4"
],
"updateEnabled": true,
"updateDuration": 1
}
]
鴻蒙服務卡片有4種尺寸,分别是微卡片(1*2)、小卡片(2*2)、中卡片(2*4)、大卡片(4*4),同一個應用還支援多種不同類型的服務卡片,不同尺寸與類型可以通過卡片管理界面進行切換和選擇。
其設計的初衷就是資訊顯示、服務直達,基于以上原則,我們選擇了攜程App中幾個常用的功能來實作服務卡片,每個功能分别實作了小卡片和中卡片兩種樣式。
3.4 服務卡片測試
開發完代碼後,接下來就可以使用真機進行調試了,使用真機裝置進行調試前,需要對HAP進行簽名後進行調試。詳細的調試流程如下圖所示。
針對原子化服務和應用的簽名,DevEco Studio為開發者提供了自動化簽名方案,幫助開發者高效進行調試。
目前隻有受邀請開發者才能通路證書管理菜單。如果AGC頁面未展示證書管理菜單,開發者需發送名稱、申請背景及Developer ID至[email protected],等待華為受理。
進入File > Project Structure > Project > Signing Configs界面,勾選“Automatically generate signing”,即可完成簽名。
若釋出應用/服務,需通過申請數字證書(.cer檔案)和Profile檔案(.p7b檔案)來保證其完整性。
申請前,首先需要通過DevEco Studio來生成密鑰(存儲在格式為.p12的密鑰庫檔案中)和證書請求檔案(.csr檔案),同時也可以使用指令行工具的方式來生成。
設定完簽名資訊後,使用DevEco Studio生成APP。點選Build > Build Hap(s)/APP(s) > Build APP(s),等待編譯建構完成已簽名的APP。
編譯建構完成後,可以在build > outputs > app > release目錄下,擷取帶簽名的APP。
将HarmonyOS應用打包成APP後,通過AppGallery Connect将HarmonyOS應用分發到不同的裝置上。可以根據釋出HarmonyOS應用指導将APP上架到華為應用市場。
四、未來展望
除了華為的HarmonyOS,還有谷歌的Fuchsia、蘋果的SiriOS、三星SmartTings、騰訊TencentOS tiny等等,可見未來IOT市場中,内卷競争化會比智能手機時代的作業系統更加劇烈和難以預測。鴻蒙生态鍊仍處于早期階段,各方面仍待完善。
參考文檔:
1、HarmonyOS Developer
https://developer.harmonyos.com/
2、HarmonyOS原子化服務
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/atomic-service-definition-0000001090840664
3、服務卡片開發簡介
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-widget-provider-intro-0000001150722105
4、鴻蒙開源代碼
https://gitee.com/explore/harmonyos-advanced
5、HarmonyOS到底是不是Android套皮?
https://mp.weixin.qq.com/s/Uw9_zE_k_jRUN-Frol535A
6、HarmonyOS真機調試
https://developer.huawei.com/consumer/cn/forum/topic/0203461929487310027
【作者簡介】
Gordon,攜程資深移動開發工程師,關注鴻蒙開發。