攜程鴻蒙應用開發實踐
?作者 | Gordon,攜程資深移動開發工程師,關注鴻蒙開發。
背景
作為全球領先的一站式旅游服務平臺,攜程始終堅持以技術創新為發展核心。自鴻蒙發布以來,我們便投入研發力量進行調研、開發,并成功落地了攜程機票項目、服務卡片項目等。現將鴻蒙項目中相關經驗整理分享,希望能給大家一些參考,也希望鴻蒙發展能越來越好。
一、鴻蒙系統簡介
華為鴻蒙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至agconnect@huawei.com,等待華為受理。
進入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市場中,內卷競爭化會比智能手機時代的操作系統更加劇烈和難以預測。鴻蒙生態鏈仍處于早期階段,各方面仍待完善。