HarmonyOS應用開發(基礎篇)

前言

前幾日,華爲EMUI官方微博正式宣佈改名爲HarmonyOS。java

EMUI改名爲HarmonyOS

這不就是說,之後華爲手機都是鴻蒙系統了嘛?鴻蒙還發出了一條視頻,視頻中顯示2021年6月2號將開啓鴻蒙操做系統及華爲全場景新品發佈會。預計如今支持EMUI11升級的機型,將所有支持升級鴻蒙系統。我這一瞅,這不就是明天準備推送了嘛,抓緊學習一波兒。程序員

以前一直有關注過鴻蒙系統,可是感受應該不會很快的大面積推送系統。直到看到這個新聞後,我才以爲是時候學一下鴻蒙系統了。編程

學習鴻蒙系統很是簡單,目前鴻蒙的文檔、開發者社區、學習視頻都很是多。個人主要學習方法就是跟着官網讀一遍文檔。而後文檔裏面沒了解過概念知識點整理一下。json

系統定位

系統定位

文檔中有一段關於鴻蒙的系統定位,看到這段文字介紹,就能夠總結出鴻蒙系統的三大特色:swift

  1. 分佈式:鴻蒙能夠適配多個終端,包括手機、平板、智能家電、智慧屏、車載機等。從這個定位而言,就說明鴻蒙系統從設計之初就跟安卓系統不同。最關鍵的就是,面對不一樣的設備終端,只須要開發一套系統,而不須要屢次開發。也就是鴻蒙實現了一次開發,多端部署的能力。
  2. 易開發:鴻蒙系統提供了多種開發語言API,包括Java、C、JS。也就是先後端開發人員均可以快速上手學習鴻蒙。我以爲鴻蒙系統架構師在設計鴻蒙的時候,也是但願儘量多的讓各類開發人員學習和掌握鴻蒙。
  3. 組件化:鴻蒙採用組件化設計方案,能夠實現不一樣終端設備對操做系統的要求。說人話就是呢,不一樣的設備對操做系統有不一樣的要求。好比有些智能家電不須要屏幕顯示模塊,採用鴻蒙系統的家電,會根據實際須要自由組合系統模塊。這樣帶來的好處之一就是,減小智能家電系統的大小,實現業務靈活裁剪。

從這段學習當中,讓我看到了鴻蒙的願景很是遠大。不只僅是能夠替代安卓系統,還能夠將全部的智能設備鏈接在一塊兒,實現萬物互聯。後端

技術架構

鴻蒙技術架構圖

我我的感受,想學鴻蒙的話,主要根據這張技術架構圖,應該就夠了。剩下的全部相關知識無非就是根據這張技術架構圖進行的擴展和補充。因此官方給出的這張技術架構圖就是重中之重了。安全

鴻蒙系統從下向上依次分爲:內核層、系統服務層、架構層和應用層。這四層初看起來,跟隔壁的安卓系統架構圖很是像啊,但又徹底不同。鴻蒙系統功能能夠根據實際須要,量身定製某些非必要的系統功能和模塊。架構

  • 內核層:內核層針對不一樣資源受限設備選用適合的OS內核。說點人話就是,這一層提供了統一的外部訪問API。由於鴻蒙須要面對的設備終端衆多,有Linux、LiteOS等。因此這一層將各個內容差別統一封裝,暴露給外部的操做API接口倒是統一的。我猜想也就是由於這一層等封裝,才讓鴻蒙能夠完美兼容安卓系統。不知道鴻蒙可不能夠開發蘋果應用呢,後面學着看。
  • 系統服務層:整個鴻蒙系統的核心能力層。也就是包括多設備運行、安全、AI、電話、位置服務、穿戴設備啥的,都是這層乾的活兒。我比較感興趣的是,其中提供了方舟運行時。由於沒了解過方舟,後面單獨整理一下。
  • 框架層:提供了兩套UI框架,Java UI框架和JS UI框架。也就說,針對JAVA程序員和JS程序員均可以上手UI界面。
  • 應用層:一個鴻蒙應用有多個FA或PA。FA有UI界面,提供用戶交互的能力;PA提供後臺運行任務和數據訪問。這樣作的好處就是,根據實際的業務須要,能夠自由組合FA和PA,實現跨終端設備。

方舟編譯器

閱讀文檔時,系統服務層提供了方舟多語言運行時子系統。其中發現了以下這句話:框架

方舟運行時提供了C/C++/JS多語言運行時和基礎的系統類庫,也爲使用方舟編譯器靜態化的Java程序(即應用程序或框架層中使用Java語言開發的部分)提供運行時。

按照個人理解,這應該就是鴻蒙能夠實現多語言開發的關鍵吧。而後從網上找了一篇文章,瞬間明白了方舟編譯器作的事情。分佈式

無論是早期的電子管仍是如今的半導體晶體管,這些計算的基本單位能識別的只有電平的高低,在計算機中咱們就用0和1來表示。1和0的各類組合就是機器是能看懂的語言,也就是機器碼。計算機的初期,人們就是用0和1來寫成程序命令的,這種反人類的編碼顯然是程序員痛恨的,因而有了彙編語言,用字符來表示命令編碼,這就方便了不少,可是大型程序依然不可行,C\C++,JAVA等高級語言應運而生。能夠說高級語言是爲程序員設計的,也是爲大型的軟件工程設計的,所以逐步誕生了面向對象編程的繼承、多態以及回調、反射等機制,無論高級語言怎麼變化,處理器可以識別的都只是機器碼,編譯器就承擔了這個翻譯轉化的角色,這也是方舟編譯器要作的事兒。

如今的手機系統iOS之因此比Android系統更流暢的一個緣由,就是由於iOS沒有像Android同樣的虛擬機。Java之因此能夠作到跨平臺的緣由雖然是由於有虛擬機,可是在手機操做系統上,虛擬機卻拖累了Android。虛擬機打包成的字節碼雖然能夠作到於機器硬件無關,可是當程序執行的時候,仍是須要再次編譯成機器碼才能執行。也就是Java開發完的程序須要編譯兩次才能夠執行,反觀iOS則只須要一次。由於iOS有集成swiftc編譯命令的Xcode工具。

鴻蒙比安卓會更流暢的一個緣由也是由於沒有虛擬機,它採用了和iOS同樣的機制,生成安裝包時直接編譯成合適的機器碼。

方舟編譯器編譯機器指令

從上面的圖中能夠發現,安卓應用在運行前須要靜態編譯,而後在ART虛擬機中,還須要執行解析器解析代碼。逐字解析以後,還須要JIT。這就產生了額外的開銷。反觀方舟編譯器,在開發階段,就已經將其可執行文件進行了靜態編譯工做,剩下的只須要安裝和運行便可。

方舟編譯器除了去掉虛擬機,還實現了多語言聯合開發。如今開發一款APP不多隻使用到一種語言的,在開發應用時會使用到各類其餘語言開發的庫,好比C語言。不一樣語言之間也是須要通訊、調用的。在安卓陣容中,採用的是不一樣語言在單獨的環境中,而後經過中間代碼編譯成機器碼去執行。並且是當程序運行時。這樣就會產生系統額外的開銷。

方舟編譯器採用的是,不一樣語言在開發環境中,就編譯成一套可執行文件,而後在運行環境中執行。

總結來講,方舟編譯器針對現有的安卓問題,採用解決思路就是開發階段解決。

  • 去掉虛擬機,在開發階段就靜態編譯生成可執行文件。
  • 去掉JNI,在開發階段提供統一的程序,而後生成可執行文件。

我以爲,經過這樣的策略,對用戶而言手機系統APP確定是更快更流暢了,由於全部的開銷在開發階段就解決的差很少了,那程序運行時天然是快的。這就讓我想起了Xcode,如今光下載Xcode 12.5就須要11.7G的存儲空間,我電腦中Xcode就佔用了25G的存儲空間。

應用基礎知識

在開始學習以前,瞭解一下HarmonyOS應用的基礎知識。HarmonyOS應用軟件包由HAP(HarmonyOS App Package)和描述文件pack.info組成。一個HAP由代碼、資源、三方庫和配置文件組成。

App邏輯圖

一個App Pack的邏輯圖如上圖,這張圖包含了不少信息:

  • entry:應用主模塊,有且只有一個。也就是圖中黃色的模塊
  • feature:引用動態模塊。能夠有多個,甚至一個都沒有。途中藍色的模塊
  • 每一個App 都有一個用來描述HAP屬性的文件,pack.info,圖片中綠色部分。
  • 每一個單獨的hap模塊都會有一個用來配置模塊的配置文件,config.json。它是用來聲明Ablitiy的。
  • libs中存放應用的三方依賴代碼,如so、jar等。
  • 資源文件包括圖片、音頻等,都存放於resources中。
  • Ability是應用能力等封裝,其中又由有UI界面等FA和無UI界面等PA組成。

HarmonyOS應用開發基礎

華爲開發者學院有一我的才計劃,裏面有一門課程HarmonyOS應用開發系列課(基礎篇)。經過本課程的學習,開發者可以具有運用HarmonyOS順利開發應用的能力。

接下來就是對這門課程進行學習,同時結合官網文檔進行補充行學習。

首先根據官方文檔給出的快速入門建立一個能夠實現頁面跳轉的小應用。

開發環境搭建

個人開發環境是MacOS,直接下載和安裝DevEco Studio便可。同時DevEco Studio須要登陸華爲開發者帳號,由於後續開發是須要使用到遠程模擬器,因此必須得有華爲開發者帳號。

安裝完成後,須要配置一下開發環境。按照官方給出的配置開發環境的方法,自動下載安裝了最新版本的HarmonyOS SDK安裝包。其中默認使用的是Java語言的SDK。由於還沒開始學怎樣用JS開發,我先不安裝JS語言的SDK包。如今的版本已是2.1.1.20了,比文檔上面要更新一些了。這個版本是2021年4月30日最新發布的一個版本。並且能夠發現個人API Version已是5了,後面建立項目時,須要選擇的版本應該也是對應上的。

HarmonyOS SDK

運行hello world

老規矩,新環境都會建立一個hello world,代表環境是否搭建成功。

在建立項目時,我選擇的是API Version 5, 由於想體驗最新的API。

API Version 5

要想使用模擬器,必須登陸華爲開發者帳號。

登陸華爲開發者帳號

登陸帳號後,選擇P40機型做爲模擬器,而後運行代碼到模擬器中。我運行完結果和文檔上面給出的圖片,有些出入。我界面當中的「Hello World」文字,並無在垂直方向居中,而是定格在了最上面。可是也說明了,開發環境搭建完成了。

hello world運行結果

用XML建立UI佈局

在HarmonyOS中提供了Java UI框架,而Java UI框架又提供了兩種佈局方式:XML佈局和代碼佈局。爲撒HarmonyOS會提供xml佈局方式呢?

我想這多是架構者須要吸引部分Android開發者們,加入到鴻蒙系統的開發當中來。提供多種不一樣的開發方式,幫助鴻蒙系統發展和壯大。

文檔這裏並無說怎麼建立一個Button按鈕或者Text文本,而是直接給出了一段代碼。可是文檔中給出了是採用DependentLayout佈局,並且給出了Text和Button組件的鏈接地址。

我用DevEcoStudio建立的項目,按照文檔提示,打開ability_main.xml文件,代碼以下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text_helloworld"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="$string:mainability_HelloWorld"
        ohos:text_size="50px"
        />

</DirectionalLayout>

對比了一下文檔給出代碼,發現佈局方式不同,我這裏使用的是DirectionalLayout方式佈局,而文檔使用的是DependentLayout方式佈局。

按照文檔給出的步驟開始後,又發現一個問題,每次運行模擬器都須要從新安裝應用,從新運行應用才行,好像沒有相似Flutter同樣的熱更新。

後來發現使用文檔中提到的預覽器能夠解決實時預覽界面效果的問題。

Hello World加按鈕

最後我調整的代碼以下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">

    <Text
        ohos:id="$+id:text_helloworld"
        ohos:height="match_content"
        ohos:width="match_content"
        ohos:background_element="$graphic:background_ability_main"
        ohos:layout_alignment="horizontal_center"
        ohos:text="$string:mainability_HelloWorld"
        ohos:text_size="50px"
        />
    <Button
        ohos:id="$+id:button"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text="Next"
        ohos:text_size="19fp"
        ohos:text_color="#FFFFFF"
        ohos:top_padding="8vp"
        ohos:bottom_padding="8vp"
        ohos:right_padding="70vp"
        ohos:left_padding="70vp"
        ohos:center_in_parent="true"
        ohos:layout_alignment="horizontal_center"
        ohos:below="$id:text_helloworld"
        ohos:margin="10vp"
        ohos:background_element="$graphic:background_button"/>
</DirectionalLayout>

由於是拷貝的官方文檔代碼,可是須要調整的地方爲:

  • Button按鈕的below屬性,應該爲Text的id屬性。我查了一下手冊,暫時沒有找到這個屬性是幹什麼用的。
  • 我拷貝的代碼過來之後,發現按鈕沒有水平居中,添加了一行ohos:layout_alignment="horizontal_center"
  • 運行的結果圖看,文字和按鈕並無垂直方向居中。說明組件的某些屬性沒有調整對,看來後續還得調整一下。

用代碼建立UI佈局

用代碼建立UI佈局就是在Java文件中,編寫佈局代碼。直接拷貝文檔給出的代碼便可。

Hi there運行圖

此次運行的效果跟文檔上面一致了。而後有幾處注意點

  • 拷貝的Java代碼,使用的是DependentLayout佈局方式。這應該就是致使第一個頁面沒有垂直居中的緣由。
  • java代碼也一樣支持實時預覽功能。在java代碼中,直接運行預覽便可。

至此文檔上的快速入門手冊就運行成功了。雖然代碼全是拷貝,也並不知道其中的概念。因此還須要進一步學習。

拿到證書

掌握了上面這些基礎知識後,再去學習華爲給出的課程就很是簡單了。認真看一遍官網給出的視頻介紹,而後聽聽每節課後面的答疑,最後作作每節課的考覈。全都完成以後,只須要作一份畢業考試題,就能夠了。

初級證書

這是我第一次線上學習帶有華爲認證的課程,並且今天恰好是6月1兒童節,但願本身天天都依然充滿童心檢查學習下去✌️✌️✌️。

這個證書其實就是證實有了一個對HarmonyOS基礎的認識而已。離真正能開發HarmonyOS應用的能力還差很多距離,後續還須要繼續努力💪💪💪。

相關文章
相關標籤/搜索