攜程鴻蒙應(yīng)用開發(fā)實(shí)踐
?作者 | Gordon,攜程資深移動(dòng)開發(fā)工程師,關(guān)注鴻蒙開發(fā)。
背景
作為全球領(lǐng)先的一站式旅游服務(wù)平臺(tái),攜程始終堅(jiān)持以技術(shù)創(chuàng)新為發(fā)展核心。自鴻蒙發(fā)布以來(lái),我們便投入研發(fā)力量進(jìn)行調(diào)研、開發(fā),并成功落地了攜程機(jī)票項(xiàng)目、服務(wù)卡片項(xiàng)目等?,F(xiàn)將鴻蒙項(xiàng)目中相關(guān)經(jīng)驗(yàn)整理分享,希望能給大家一些參考,也希望鴻蒙發(fā)展能越來(lái)越好。
一、鴻蒙系統(tǒng)簡(jiǎn)介
華為鴻蒙HarmonyOS系統(tǒng)是面向萬(wàn)物互聯(lián)的全場(chǎng)景分布式操作系統(tǒng),目前鴻蒙系統(tǒng)已從2.0升級(jí)更新至Beta 3.0,支持手機(jī)、平板、智能穿戴、智慧屏等多種終端設(shè)備運(yùn)行,提供應(yīng)用開發(fā)、設(shè)備開發(fā)的一站式服務(wù)。
憑借多終端開發(fā)IDE,多語(yǔ)言統(tǒng)一編譯,分布式架構(gòu)Kit提供屏幕布局控件以及交互的自動(dòng)適配,支持控件拖拽,面向預(yù)覽的可視化編程,使開發(fā)者可以基于同一工程高效構(gòu)建多端自動(dòng)運(yùn)行App,實(shí)現(xiàn)真正的一次開發(fā),多端部署,在跨設(shè)備之間實(shí)現(xiàn)共享生態(tài)。
作為萬(wàn)物互聯(lián)時(shí)代的操作系統(tǒng),“分布式技術(shù)”鑄就了鴻蒙的核心競(jìng)爭(zhēng)力,在5G這個(gè)萬(wàn)物互聯(lián)的時(shí)代有著巨大的優(yōu)勢(shì)。
二、鴻蒙系統(tǒng)開發(fā)
2.1 開發(fā)語(yǔ)言
鴻蒙適合的開發(fā)語(yǔ)言是Java、JavaScript、C++,其中Java、JavaScript適合用于手機(jī)應(yīng)用UI界面開發(fā)工作,C++和JavaScript適合嵌入式設(shè)備UI界面相關(guān)開發(fā)工作。只有JavaScript寫的UI界面可以跨設(shè)備使用。
在以后的鴻蒙版本中(計(jì)劃是3.0),即將推出倉(cāng)頡語(yǔ)言開發(fā)(倉(cāng)頡語(yǔ)言是華為自主研發(fā)的一款語(yǔ)言)。目前主推的還是Java和JavaScript。
鴻蒙服務(wù)卡片開發(fā),可以使用Java和JavaScript(華為建議JavaScript),其中Java和JavaScript服務(wù)卡片場(chǎng)景及能力差異如下:
場(chǎng)景 | Java卡片 | JS卡片 | 版本 |
實(shí)時(shí)刷新 | Java使用ComponentProvider做實(shí)時(shí)刷新代價(jià)比較大 | JS可以做到端側(cè)刷新,但是需要定制化組件 | HarmonyOS 2.0及以上 |
開發(fā)方式 | Java UI在卡片提供方需要同時(shí)對(duì)數(shù)據(jù)和組件進(jìn)行處理,生成ComponentProvider遠(yuǎn)端渲染 | JS卡片在使用方加載渲染,提供方只要處理數(shù)據(jù)、組件和邏輯分離 | 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及以上 |
卡片內(nèi)動(dòng)效 | 不支持 | 暫不開放 | HarmonyOS 2.0及以上 |
陰影模糊 | 不支持 | 支持 | HarmonyOS 2.0及以上 |
動(dòng)態(tài)適應(yīng)布局 | 不支持 | 支持 | HarmonyOS 2.0及以上 |
自定義卡片 | 不支持 | 支持 | HarmonyOS 2.0及以上 |
2.2 鴻蒙系統(tǒng)架構(gòu)
在說(shuō)明鴻蒙系統(tǒng)架構(gòu)之前,首先要了解AOSP(Android Open-Source Project,Android 開放源代碼項(xiàng)目)和Google Android的區(qū)別。AOSP可以隨便用,但只有經(jīng)過Google認(rèn)證的Android才能安裝GMS和Google Play。Google控制的是GMS和Google Play,無(wú)權(quán)控制Android。
HarmonyOS整體遵從分層設(shè)計(jì),從下向上依次為:內(nèi)核層、系統(tǒng)服務(wù)層、框架層和應(yīng)用層。系統(tǒng)功能按照“系統(tǒng) > 子系統(tǒng) > 功能/模塊”逐級(jí)展開,在多設(shè)備部署場(chǎng)景下,支持根據(jù)實(shí)際需求裁剪某些非必要的子系統(tǒng)或功能/模塊。
HarmonyOS技術(shù)架構(gòu)如下所示:
AOSP大致對(duì)應(yīng)圖中的UI框架+用戶程序框架+Ability框架。為了兼容Android,Harmony使用了AOSP的部分代碼,用來(lái)構(gòu)建Android應(yīng)用兼容層來(lái)運(yùn)行Android應(yīng)用。鴻蒙框架解析后將數(shù)據(jù)交給了Android,由Android的負(fù)責(zé)將其渲染在SurfaceView上。
HarmonyOS采用多內(nèi)核設(shè)計(jì),支持針對(duì)不同資源受限設(shè)備選用適合的OS內(nèi)核。內(nèi)核抽象層(KAL,Kernel Abstract Layer)通過屏蔽多內(nèi)核差異,對(duì)上層提供基礎(chǔ)的內(nèi)核能力,包括進(jìn)程/線程管理、內(nèi)存管理、文件系統(tǒng)、網(wǎng)絡(luò)管理和外設(shè)管理等。
系統(tǒng)服務(wù)層分布式軟總線技術(shù)將物聯(lián)網(wǎng)通訊技術(shù)(NFC、藍(lán)牙、WIFI……)與協(xié)議(CoAP、RPC……)做了良好的封裝,以及對(duì)數(shù)據(jù)格式(HarmonyOS IDL)以及服務(wù)(PA)做了良好的抽象,使局域網(wǎng)內(nèi)的設(shè)備之間可以方便的通訊、交換數(shù)據(jù)、調(diào)用遠(yuǎn)程服務(wù),設(shè)備之間仿佛融為一體。
框架層為HarmonyOS應(yīng)用開發(fā)提供了Java/C/C++/JS/TS等多語(yǔ)言的用戶程序框架和Ability框架,兩種UI框架(包括適用于Java語(yǔ)言的Java UI框架、適用于JS/TS語(yǔ)言的方舟開發(fā)框架),以及各種軟硬件服務(wù)對(duì)外開放的多語(yǔ)言框架API。
應(yīng)用層包括系統(tǒng)應(yīng)用和第三方非系統(tǒng)應(yīng)用。HarmonyOS的應(yīng)用由一個(gè)或多個(gè)FA(Feature Ability)或PA(Particle Ability)組成。其中,F(xiàn)A有UI界面,提供與用戶交互的能力;而PA無(wú)UI界面,提供后臺(tái)運(yùn)行任務(wù)的能力以及統(tǒng)一的數(shù)據(jù)訪問抽象。FA在進(jìn)行用戶交互時(shí)所需的后臺(tái)數(shù)據(jù)訪問也需要由對(duì)應(yīng)的PA提供支撐?;贔A/PA開發(fā)的應(yīng)用,能夠?qū)崿F(xiàn)特定的業(yè)務(wù)功能,支持跨設(shè)備調(diào)度與分發(fā),為用戶提供一致、高效的應(yīng)用體驗(yàn)。
我們今天主要從應(yīng)用層開發(fā)方面展開。
三、攜程鴻蒙服務(wù)卡片
攜程很早就在鴻蒙OS發(fā)力,基于HarmonyOS分布式能力,開發(fā)了攜程機(jī)票手機(jī)、手表聯(lián)動(dòng)項(xiàng)目。在HarmonyOS推出原子化能力后,又上線了攜程會(huì)員中心、核酸檢測(cè)、攜程火車票服務(wù)卡片,以期給到用戶更多的選擇。
3.1 開發(fā)流程
通過HarmonyOS 系統(tǒng)能力、開發(fā)指導(dǎo)、API參考等文檔,利用 HUAWEI DevEco Studio 開發(fā)工具,開發(fā)不同設(shè)備的應(yīng)用,為用戶帶來(lái)全場(chǎng)景體驗(yàn)。
總結(jié)起來(lái),整個(gè)開發(fā)流程分為開發(fā)準(zhǔn)備、應(yīng)用開發(fā)、應(yīng)用測(cè)試、應(yīng)用發(fā)布幾個(gè)流程。
階段 | 流程 |
開發(fā)準(zhǔn)備 |
|
編寫代碼 |
|
應(yīng)用測(cè)試 |
|
發(fā)布 |
|
3.2 服務(wù)卡片
服務(wù)卡片(以下簡(jiǎn)稱“卡片”)是FA的一種界面展示形式,將FA的重要信息或操作前置到卡片,以達(dá)到服務(wù)直達(dá),減少體驗(yàn)層級(jí)的目的。
經(jīng)調(diào)研,從安卓到鴻蒙,最明顯的變化應(yīng)該就是服務(wù)卡片。故我們計(jì)劃以服務(wù)卡片作為切入點(diǎn),實(shí)現(xiàn)攜程鴻蒙服務(wù)卡片功能。經(jīng)過版本逐步迭代,目前已上線了會(huì)員簽到、核酸檢測(cè)、搶火車票等功能。
由于整個(gè)開發(fā)流程中,開發(fā)準(zhǔn)備和發(fā)布流程參考文檔即可完成,僅從編寫代碼和應(yīng)用測(cè)試兩方面展開,給大家簡(jiǎn)單介紹一下。
3.3 服務(wù)卡片開發(fā)
考慮快速開發(fā)上線的需求,我們調(diào)研使用鴻蒙Native+Webview混合開發(fā)的模式,通過Native層處理持久化等相關(guān)能力,Webview實(shí)現(xiàn)功能進(jìn)行展開。
3.3.1 鴻蒙Webview實(shí)現(xiàn)功能?
首先,通過XML布局文件進(jìn)行操作:
<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并不等價(jià),這可能是鴻蒙的一個(gè)漏洞,直接輸入 WebView 并不能使用這個(gè)組件。
然后在Native代碼中實(shí)例化Webview:
private void initWebview(){
WebConfig webConfig = webView.getWebConfig();
if (null != webConfig){
webConfig.setWebStoragePermit(true);//
webConfig.setJavaScriptPermit(true); // 如果網(wǎng)頁(yè)需要使用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 服務(wù)卡片配置?
卡片應(yīng)用是一款特殊的元能力服務(wù),其配置文件config.json中聲明以下幾項(xiàng),系統(tǒng)能夠識(shí)別該應(yīng)用為一款卡片應(yīng)用,并與系統(tǒng)進(jìn)行綁定。?config.json文件"abilities"配置forms模塊細(xì)節(jié)如下:
"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
}
]
鴻蒙服務(wù)卡片有4種尺寸,分別是微卡片(1*2)、小卡片(2*2)、中卡片(2*4)、大卡片(4*4),同一個(gè)應(yīng)用還支持多種不同類型的服務(wù)卡片,不同尺寸與類型可以通過卡片管理界面進(jìn)行切換和選擇。 其設(shè)計(jì)的初衷就是信息顯示、服務(wù)直達(dá),基于以上原則,我們選擇了攜程App中幾個(gè)常用的功能來(lái)實(shí)現(xiàn)服務(wù)卡片,每個(gè)功能分別實(shí)現(xiàn)了小卡片和中卡片兩種樣式。
3.4 服務(wù)卡片測(cè)試
開發(fā)完代碼后,接下來(lái)就可以使用真機(jī)進(jìn)行調(diào)試了,使用真機(jī)設(shè)備進(jìn)行調(diào)試前,需要對(duì)HAP進(jìn)行簽名后進(jìn)行調(diào)試。詳細(xì)的調(diào)試流程如下圖所示。
針對(duì)原子化服務(wù)和應(yīng)用的簽名,DevEco Studio為開發(fā)者提供了自動(dòng)化簽名方案,幫助開發(fā)者高效進(jìn)行調(diào)試。
當(dāng)前只有受邀請(qǐng)開發(fā)者才能訪問證書管理菜單。如果AGC頁(yè)面未展示證書管理菜單,開發(fā)者需發(fā)送名稱、申請(qǐng)背景及Developer ID至agconnect@huawei.com,等待華為受理。
進(jìn)入File > Project Structure > Project > Signing Configs界面,勾選“Automatically generate signing”,即可完成簽名。
若發(fā)布應(yīng)用/服務(wù),需通過申請(qǐng)數(shù)字證書(.cer文件)和Profile文件(.p7b文件)來(lái)保證其完整性。申請(qǐng)前,首先需要通過DevEco Studio來(lái)生成密鑰(存儲(chǔ)在格式為.p12的密鑰庫(kù)文件中)和證書請(qǐng)求文件(.csr文件),同時(shí)也可以使用命令行工具的方式來(lái)生成。
設(shè)置完簽名信息后,使用DevEco Studio生成APP。點(diǎn)擊Build > Build Hap(s)/APP(s) > Build APP(s),等待編譯構(gòu)建完成已簽名的APP。
編譯構(gòu)建完成后,可以在build > outputs > app > release目錄下,獲取帶簽名的APP。
將HarmonyOS應(yīng)用打包成APP后,通過AppGallery Connect將HarmonyOS應(yīng)用分發(fā)到不同的設(shè)備上。可以根據(jù)發(fā)布HarmonyOS應(yīng)用指導(dǎo)將APP上架到華為應(yīng)用市場(chǎng)。
四、未來(lái)展望
除了華為的HarmonyOS,還有谷歌的Fuchsia、蘋果的SiriOS、三星SmartTings、騰訊TencentOS tiny等等,可見未來(lái)IOT市場(chǎng)中,內(nèi)卷競(jìng)爭(zhēng)化會(huì)比智能手機(jī)時(shí)代的操作系統(tǒng)更加劇烈和難以預(yù)測(cè)。鴻蒙生態(tài)鏈仍處于早期階段,各方面仍待完善。