為什么要學習HarmonyOS?
在上一次https://www.cnblogs.com/webor2006/p/14861199.html已經對於HarmonyOS有了一個基本的認識,其中對於它的開發環境也已經搭建好了,不過這里再對“為什么要學習HarmonyOS”這個話題先再啰嗦一下。
HarmonyOS對軟件開發行業的影響:
- 一個面向全場景的分布式微內核的操作系統;
其中啥叫“微內核”呢?相比基於Linux(宏內核)的Android操作系統,基於微內核的HarmonyOS,更安全,更穩定,可維護性更好,其中宏內核和微內核的區別在於:
1、宏內核是把很多功能都放在了內核當中了,往往要在Linux增加一個設備需要重新編譯一下內核,不像window驅動既插既用,因為Linux將很多驅動都做在了內核當中了;
2、而微內核就比較小,它只把關鍵的部分(如任務調度、內存管理等)放在了內核中,而像設備的管理、圖片管理之類的都是放在了內核之外了,那么帶來的好處除了內核小之外,還更加安全,因為內核是穩定的,不穩定的基本都是在內核之外。
其中華為對於全場景的定義為:
- 華為生態中有來自全球的180萬開發者;
- HarmonyOS有望成為全球第三大移動應用生態;
對於這么一個系統,對其其它的一個競爭對手廠家來說肯定也是感興趣的,但是對於這些廠商來說你覺得會放心去使用一個華為競爭對手的產品么?華為為了打消其它廠商的顧慮,華為成立了開源基金會,這樣其它的廠商就可以參考進來,就會公平的使用HarmonyOS了,在2020年9月10日OpenHarmony(開放原子開源基金雲https://www.openharmony.cn/)開源了HarmonyOS 2.0,而OpenHarmony的一個開源路標是這樣的:

- 2020年9月10日:面向內存128KB~128MB終端設備;
- 2021年4月:面向內存128MB~4GB終端設備;
- 2021年10月:面向4GB以上所有設備;
隨着HarmonyOS逐步開源,其對軟件行業的影響也只有越來越大的,所以做為開發者提前了解它也是非常有必要的。
HarmonyOS開發者的影響:
對終端開發者的影響:
- HarmonyOS天生支持IOT:
啥叫IOT:
- HarmonyOS不僅可以開發手機應用而且可以開發應用於物聯網的智能終端應用;
- 終端開發者可以通過HarmonyOS來開發智能物聯網的軟件,並將其應用到智能設備上【對於未來各大智能硬件的公司肯定都會擁抱HarmonyOS的】;
- 終端開發者可以通過HarmonyOS來拓寬就業場景;
對非移動端開發者的影響:
- 對於HarmonyOS來講無論是Android開發者、IOS開發者還是前端或后端開發者,大家都是零基礎,起跑線一樣;
- 非移動端開發者可以借助HarmonyOS來快速上手移動端開發實現彎道超車;
為什么要學習HarmonyOS?
- 學習門檻低,因為支持Java和JS語言進行開發。
- 應用場景廣:
1、手機所需軟件;
2、TV所需軟件;
3、穿戴設備所需軟件;
4、智能家居所需軟件;
5、車載軟件;
6、... - 對新技術保持敏感
- 為未來布局
如何能快速上手?
這里強調的是“快速上手”,因為可以建立起一個自信心,當然你也可以上官網一點點去學習,但是效率會比較慢,所以這里看一下要想快速上手,則可分為以下幾個步驟。
對HamonyOS有個整體的認識:
- 架構了解
- 和其它系統的異同(系統層面、包的結構、開發方式的異同等)
- 利用現有的知識進行類比學習(比如你已經掌握了Android開發,則可以用它進行類比)
- 搭建開發環境(這塊咱們在上一次已經搞定了)
- 開發工具使用技巧
掌握HamonyOS開發的必備基礎:
- 掌握布局知識
由於HamonyOS的開發方式有兩種,一種是使用Java語言,另一種是使用JS語言,所以其布局知識就得分別進行掌握了。 - 掌握頁面和應用生命周期
- 掌握頁面跳轉和傳參
- 調試技巧
掌握HamonyOS進階知識:
- 如何自定義列表?
- 掌握多線程與並發
- 掌握JSON解析技巧
- 掌握HamonyOS網絡通信基礎
- 構建和打包
這里少了一個數據保存相關的知識對吧,是因為暫時先不了解它,因為對於這個快速系列最終的項目不涉及到數據庫相關的技術,所以這里先略過。
通過一個小項目進行實戰鞏固:
這里的快速上手項目是應用在一個穿戴的手表上的,具體的效果如下:

那為啥不以手機APP為例呢?其實以什么平台運行不是重點,因為華為HarmonyOS的理念就是編寫一次代碼多平台運行,

關於這個特點在未來的學習中再來體會,而對於學習知識點來說沒任何的影響,所以,這塊不用太過糾結平台,目前入門以能學知識為主。
HarmonyOS架構解析:
鴻蒙OS技術架構:
關於這塊可以參考官網https://developer.harmonyos.com/cn/docs/documentation/doc-guides/harmonyos-overview-0000000000011903,這里簡單再梳理一下,先把官方的架構圖給貼出來:

而對於整個架構最清晰的了解可以參考官方給的這個視頻:https://developer.huawei.com/consumer/cn/training/detail/101605600905237027,反正我看完之后真的是感覺好強大。。
其中可以看到,相比Linux系統架構而言,這里多了一個第二層:系統服務層,這一層之前是集成在Linux內核層的,這也體現了Harmonyos中的微內核。
內核層:
目前有兩個內核子系統:
- Linux Kernel:為了兼容Android APP
- LiteOS:為物聯網硬件設備而生的內核
目前使用的是Linux Kernel,之后可能還會開發有其它的一些內核子系統,既然未來會不斷擴展多個子內核系統,那么肯定需要將行為進行抽象吧,不然不好管理,於是乎就有它出現了:

這樣在上層調用時就不用管具體是用的啥內核了,擴展性非常強。其截一個官方視頻的說明,大概就能感知這個內核層的強大:

另外還有一個驅動子系統:

系統服務層:
然后上一層就是系統服務層了,其中可以看到,原來Linux內核層的一些東西就抽出來了:

其中還有一個很新穎的東東:“方舟多語言運行時子系統”,它是干嘛用的呢?它是可以跟方舟編譯器結合起來用的,我們知道Java它不是直接生成機器指令在硬件上來運行,而是生成一個字節碼在JVM中來運行,其性能就遠不如機器指令的運行效率了,當然Android后來也做了一些相關的優化,比如引入了Android ART虛擬機,但是對於一些功能比如任務調度還是得借助於內核來完成,所以其性能效果也不盡如人意,但是對於這個方舟編譯器,簡單來說就是它可以把不同的編程語言(java、js、c、c++),都能用方舟編譯器將其生成機器指令,直接在操作系統的內核層來直接運行,性能大大提升。
框架層:

這也是咱們寫應用程序需要使用的框架。
用戶程序框架:是管理整個應用執行流程的,比如應用的載入,資源的回收等;
UI框架:這里就有兩套,一套是針對Java,一套是針對JS的;
Ability框架:這個是Harmonyos非常關鍵的概念,字面意思是“能力”的意思,其實做應用開發就是給設備賦予某種能力,所以這個框架就表達了一個應用程序所具備的功能。
有了這三個框架,咱們就可以基於它們來構建上層應用了。
應用層:

它是構建以FA(Feature Ability)/PA(Particle Ability)為基礎組成的應用(包括系統應用和三方應用):

這里的FA和PA是HarmonyOS應用的基本組成單元,能夠實現特定的業務功能,所以一個HarmonyOS的應用程序的組成元素可以為:

也就是一個應用可以包含一個或多個FA/PA,FA是有UI界面的(類似於Android中的Activity),而PA是無UI界面的(類似於Android中的Service),這里拿一個視頻通話應用為例:

"視頻通話主界面FA(Entry FA)":提供UI界面以便於用戶交互;
然后三個PA為應用提供不同的處理能力,而比較屌的功能來了:FA/PA是可以按需下載、加載和運行,其中:

基於FA/PA構建的新型應用生態,能夠實現三方服務跨設備智能分發,提供一致、高效的用戶體驗,這里還是以視頻通話app為例:
對於手機平台而言,則會下載所有FA/PA:

但是!!!對於智慧屏平台來說,如果該平台不支持視頻美顏和超級夜景能力的話,那么只會按需下載一個PA了:

是不是有一點像Android App Bundle的思想呢?
鴻蒙OS技術架構 VS Android架構:
上面對於鴻蒙OS的整體架構有了整體認識之后,接下來來類比一下Android的架構:

對於它倆的區別,說兩點:
1、整體看,都基於了Linux內核進行設計的,不過HarmonyOS是基於微內核,難度更大,但是更加穩定,這個在華為開發者大會上也曾提及過,Android的內核代碼有1億多行,而HarmonyOS也就二千多行,所以Android很難保證不同設備的流暢度。
2、HarmonyOS相比Android是采用了一個分布式架構,這也是首次在移動端使用了分布式架構,對於這樣的架構的好處就是就可以無縫的切換終端協同的體驗,開發者可以像開發同一端設備一樣開發跨終端的分布式應用,這點聽着也挺牛的!!!
HarmonyOS和Android深度對比:
HarmonyOS APP工程結構:
先來看一下官網給的一張圖:

HarmonyOS有兩個不同類型的構建產物:
- App Pack:Application Package,簡稱APP,是Harmony OS應用的發布形態,它是由一個或多個HAP(Harmony OS Ability Package)包以及描述APP Pack屬性的pack.info文件組成;
- HAP:是Ability的部署包,Harmony OS應用代碼圍繞Ability組件展開,它是由一個或多個Ability組成;
一個HAP在工程目錄中對應一個Module,它是由代碼、資源、第三方庫及應用清單文件組成,可以分為Entry和Feature兩種類型:
- Entry:應用的主模塊,一個APP中,對於同一設備類型必須有且只有一個entry類型的Hap,可獨立安裝運行;
- Feature:應用的動態特性模塊,一個APP可以包含一個或多個feature類型的HAP,也可以不含;
工程目錄結構對比:
采用Java開發的HarmonyOS的工程目錄結構和Android有些類似,都包含:

其對照關系表如下:

而HarmonryOS的JS的目錄結構如下:

- pages目錄:pages文件夾下可以包含1個或多個頁面,每個頁面都需要創建一個文件夾(如圖中的index)。頁面文件夾下主要包含3種文件類型:css、js和html文件。
1、pages > index > index.html文件:html文件定義了頁面的布局結構,使用到的組件,以及這些組件的層級關系。
2、pages > index > index.css文件:css文件定義了頁面的樣式和布局,包含樣式選擇器和各種樣式屬性等。
3、pages > index > index.js文件:js文件描述了頁面的行為邏輯,此文件里定義了頁面里所用到的所有的邏輯關系,比如數據,事件等。 - app.js文件:全局的JavaScript邏輯文件和應用的生命周期管理。
安裝包內部對比:
對於Android開發的人伙伴應該都知道它最終打出來的包是個apk,那么對於HarmonyOS應用它的安裝包到底是什么呢?
采用HarmonyOS開發的應用會被構建成.hap,hap是由代碼、資源、第三方庫及應用配置文件組成的模塊包。不同的hap可以被部署到不同類型的設備上,那hap的內部結構又是怎樣子的呢? 咱們以上一次用到的一個工程為例,在編譯之后會生成一個.hap的安裝包,如下:

然后它不像Android studio能直接雙擊就能在DevEco-Studio查看.hap中的內容,此時咱們需要將.hap更改成一個apk,然后用Android Studio打開看一下:

其中看到.apk木有,它就是為了兼容Android app而生的:

asserts:

項目中的靜態資源會被歸檔在該目錄下,里面主要存放的是項目entry/resources/目錄下的文件:
對應apk中的res與resources.arsc的集合:

classes.dex:
項目中的Java代碼對應的構建產物,它是由多個.class文件處理后的產物:
對應apk中的.dex:
entry_debug_singed_entry.apk:
項目構建出的用於在Android設備上運行的產物,HarmonyOS開發出的應用能夠兼容Android的奧秘也就是因為有它的存在。
config.json:

項目的配置文件,用於聲明應用的Ability,以及應用所需權限信息,詳見應用配置文件,對應apk中的AndroidManifest.xml:

清單文件對比:
android的清單文件是manifest.xml對吧,而harmonyOS則是config.json:那咱們以同一款應用對比一下它們之間的差異:
config.json:
{
"app": {
"apiVersion": {
"compatible": 4,
"releaseType": "Release",
"target": 5
},
"vendor": "example",
"bundleName": "com.example.helloworldwithjava",
"version": {
"code": 1000000,
"name": "1.0.0"
}
},
"deviceConfig": { },
"module": {
"abilities": [
{
"iconId": 16777219,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
],
"orientation": "unspecified",
"descriptionId": 16777218,
"labelId": 16777216,
"icon": "$media:icon",
"name": "com.example.helloworldwithjava.MainAbility",
"description": "$string:mainability_description",
"label": "$string:entry_MainAbility",
"type": "page",
"homeAbility": true,
"launchType": "standard"
}
],
"deviceType": [
"phone"
],
"mainAbility": "com.example.helloworldwithjava.MainAbility",
"distro": {
"moduleType": "entry",
"installationFree": true,
"deliveryWithInstall": true,
"moduleName": "entry"
},
"package": "com.example.helloworldwithjava",
"name": ".MyApplication"
}
}
可以看到它是由"app"、"deviceConfig"、"module"三個部分組成,缺一不可:
- app:表示應用的全局配置信息,同一個應用的不同HAP包的“app”配置必須保持一致;
1、bundleName:對應清單中的package,應用的包名:
2、vendor:開發商的描述,可以缺省,在Apk中的清單中沒有對應的。

3、version:app的版本信息,對應清單中的版本信息:

4、apiVersion:對應於清單中的minsdkverison和targetsdkversion:

- deviceConfig:表示應用在具體設備上的配置信息;
- module:表示HAP包的配置信息。該標簽下的配置只對當前HAP包生效;
1、package:
類似於Android module中的包名。
2、name:對應於Android中的Application的名字:
3、reqCapabilities:表示要求設備提供的能力:

4、reqPermissions:表示申請的權限,對應的Android清單中的use-permission

5、deviceType:表示允許Ability所運行的設備類型,因為華為的HarmonyOS是運行在全場景下的:

6、distro:是創建應用時系統為咱們生成的,不可缺省,是hap發布應用時的描述。

7、abilities:表示每個ability的信息描述,里面接受一個數組,類似於Android清單中Activity的配置:

這里對關鍵屬性進行一個說明:orientation:支持橫豎屏
icon:應用對應的icon,看一下它引用圖片的用法,跟Android有一點區別:

type:表示Ability的類型,page表示有界面的,service表示無界面的,data類似於Android的ContentProvider

launchType:啟動模式。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1000000" android:versionName="1.0.0" android:compileSdkVersion="29" android:compileSdkVersionCodename="10" package="com.example.helloworldwithjava" platformBuildVersionCode="29" platformBuildVersionName="10"> <uses-feature android:name="zidane.software.ability" android:required="false" /> <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29" /> <application android:label="@ref/0x7f020000" android:icon="@ref/0x7f010000" android:name="com.example.helloworldwithjava.ShellMyApplication" android:persistent="false" android:debuggable="true" android:allowBackup="false" android:usesCleartextTraffic="false" android:directBootAware="false"> <meta-data android:name="permZA" android:value="true" /> <activity android:label="@ref/0x7f020000" android:icon="@ref/0x7f010000" android:name="com.example.helloworldwithjava.MainAbilityShellActivity" android:exported="true" android:launchMode="0" android:screenOrientation="-1" /> </application> </manifest>
HarmonyOS需要的技術棧:
對於開發HarmonyOS需要的技術棧這里看一個圖:

