??最近在學(xué)習(xí)Flutter開(kāi)發(fā),在一次配置環(huán)境的過(guò)程中遇到了一個(gè)比較尷尬的坑,不過(guò)最終還是把這個(gè)坑給填掉了,再此進(jìn)行一些分享,希望后來(lái)者遇到同樣的問(wèn)題時(shí)可以輕松的解決。
10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有隨州免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
??從下圖中可以看出,前面幾條 flutter doctor 命令執(zhí)行的時(shí)候總是未響應(yīng),通過(guò)各種方式執(zhí)行都是一樣的結(jié)果,但是dart命令是能夠正常執(zhí)行。起初還以為是環(huán)境變量配置的有問(wèn)題,但是后來(lái)把環(huán)境變量改了又改,并且把flutter包換了又換,但是現(xiàn)象一直未得到解決。
??遇到這種難題第一時(shí)間想到的便是百度,但是各種關(guān)鍵詞搜索了一番之后,竟然沒(méi)有找到一篇關(guān)于這種現(xiàn)象的解決方案,大部分都是flutter命令使用教程,如用 flutter doctor 去查看環(huán)境是否配置完成,或者通過(guò) flutter doctor --android-licenses 命令去接受Android SDK的一些協(xié)議許可。
??后來(lái),又嘗試了必應(yīng)和Google搜索,也無(wú)果之后,放棄了通過(guò)網(wǎng)絡(luò)尋求幫助解決的方法。
??由于只有flutter的命令執(zhí)行的時(shí)候無(wú)響應(yīng),所以起初認(rèn)為是程序包有問(wèn)題。于是通過(guò)再次解壓程序壓縮包和配置環(huán)境變量之后,問(wèn)題仍然存在。
??隨后,判斷了不是程序包的問(wèn)題之后開(kāi)始去監(jiān)控應(yīng)用進(jìn)程的變化。
??到這里,可以猜到很可能是由于git導(dǎo)致的問(wèn)題,但是先前安裝過(guò)flutter都沒(méi)有問(wèn)題,這一次重裝系統(tǒng)之后就突然有問(wèn)題了。所以就嘗試著把git軟件給刪除并重新安裝,然后奇跡的發(fā)現(xiàn)了 flutter doctor 命令可以正常執(zhí)行了。
??于是又倒退回去復(fù)現(xiàn)了一下問(wèn)題,發(fā)現(xiàn)是安裝git的時(shí)候選項(xiàng)選的有問(wèn)題導(dǎo)致了和flutter沖突。
??如下圖,選擇了 Use Window's default console window 的選項(xiàng)來(lái)安裝git軟件之后,git bash是直接用的window的命令窗口來(lái)執(zhí)行命令。正是因?yàn)檫x中了這個(gè)選項(xiàng)所以導(dǎo)致flutter命令無(wú)響應(yīng)的問(wèn)題。
??所以如果你出現(xiàn)了和我一樣的問(wèn)題可以嘗試重新安裝git軟件,并在這一步選擇 Use MinTTY 的選項(xiàng)來(lái)安裝。
??經(jīng)過(guò)不斷的試錯(cuò),終于將這個(gè)問(wèn)題解決了,flutter命令也可以正常執(zhí)行了。如圖,通過(guò)VSCode開(kāi)發(fā)工具可以正常的執(zhí)行 flutter create hello_flutter 創(chuàng)建新的flutter項(xiàng)目。
??遇到問(wèn)題要大膽試錯(cuò),只要不斷的嘗試就會(huì)離問(wèn)題的起因更近,最后找到解決問(wèn)題的辦法。如果你的flutter遇到了相同的問(wèn)題而又不是由于git導(dǎo)致的話,也可以通過(guò)類(lèi)似的方式不斷試錯(cuò)并找到最終的解決方案。也歡迎各位同行可以在評(píng)論里分享自己解決問(wèn)題的方法。
??樂(lè)于分享,共同進(jìn)步。
需求,app中使用webview和h5交互,根據(jù)h5發(fā)過(guò)來(lái)的消息,在屏幕上展示flutter組件,并且可以發(fā)送消息給h5。
首先使用的組件是flutter_WebView_plugin,這個(gè)組件不能嵌套flutter組件,所以放棄這個(gè)組件。
flutter_inappbrowser 可以實(shí)現(xiàn)組合布局, 所以選用了此庫(kù), GitHub鏈接
[
不久前,谷歌正式推出 Jetpack Compose 1.0 版本。近日,JetBrains 在此基礎(chǔ)上發(fā)布了 Compose Multiplatform Alpha 版本,旨在將 Compose 擴(kuò)展到桌面和 Web 端。
Compose Multiplatform 由 Compose for Desktop 和 Compose for Web 組成,通過(guò) Kotlin Multiplatform 支持許多不同的平臺(tái)。其中,Compose Desktop 采用 Google 的 Skia 圖形庫(kù),來(lái)實(shí)現(xiàn)在 Windows、macOS 和 Linux 上的 UI 繪制,借此在所有支持的操作系統(tǒng)中提供統(tǒng)一的體驗(yàn),類(lèi)似于 Flutter 的做法。
根據(jù) Kotlin 團(tuán)隊(duì)的說(shuō)法,相比起 Electron 框架,Compose Multiplatform 在內(nèi)存消耗、安裝大小和 UI 渲染性能等方面將有更明顯的優(yōu)勢(shì)。隨著 Alpha 版本的發(fā)布,Compose Multiplatform 還收獲了新的 Android Studio 插件,包括對(duì)在 IDE 中顯示組件預(yù)覽的支持以及許多附加功能。
我們希望通過(guò)本文幫助大家進(jìn)一步了解 Compose 的跨平臺(tái)能力,以及 JetBrains 將 Compose 從 Android 擴(kuò)展到這些其他平臺(tái)背后的主要驅(qū)動(dòng)力是什么。
基于 Jetpack Compose 1.0
由谷歌打造的 Jetpack Compose 是一款用于在 Android 應(yīng)用程序之內(nèi)構(gòu)建用戶(hù)界面的官方框架,上周剛剛發(fā)布 1.0 版本。與此同時(shí),Android Studio 代號(hào)“極狐”的首個(gè)穩(wěn)定版 2020.3.1 也正式亮相。
盡管才剛迎來(lái) 1.0,但谷歌表示“目前 Play Store 中已經(jīng)有超過(guò) 2000 款應(yīng)用程序在使用 Compose——更重要的是,就連 Play Store 這款應(yīng)用本身也在使用 Compose?!惫雀璺矫孢€表示,“我們一直在與一些頂級(jí)應(yīng)用的開(kāi)發(fā)人員進(jìn)行合作,他們的反饋和支持幫助我們使 1.0 版本更加強(qiáng)大。”
Jetpack Compose for Android 迎來(lái) 1.0 版本
Compose 基于 Kotlin 開(kāi)發(fā),而 Kotlin 與 Android Studio(即官方指定的 Android IDE)均來(lái)自開(kāi)發(fā)工具廠商 JetBrains。雖然 Jetpack Compose 專(zhuān)為 Android 打造(與谷歌的 Flutter 框架不同), 但 JetBrains 公司堅(jiān)信 Compose 完全能夠獲得跨平臺(tái)能力 。
Compose for Desktop: 這只是開(kāi)始
Compose Multiplatform 可以說(shuō)是該框架面向 MacOS、Linux、Windows 以及 Web 開(kāi)設(shè)的一個(gè)端口,目前剛剛發(fā)布 1.0 Alpha 版本。雖然尚處于早期開(kāi)發(fā)階段,但 JetBrains 表示,其已經(jīng)“為開(kāi)發(fā)人員帶來(lái)能夠基本安全使用的穩(wěn)定 API”。
TheRegister 就此事詢(xún)問(wèn)了 JetBrains 公司 Compose 項(xiàng)目負(fù)責(zé)人 Nikolay Igotti,希望了解為什么該公司在擁有了已經(jīng)廣泛應(yīng)用于 IntelliJ IDEA IDE 及多種豐富變體的桌面應(yīng)用程序跨平臺(tái) Java 框架之外,還要費(fèi)力開(kāi)發(fā) Compose for Desktop。Igotti 的回答是,“舊有 Java 框架基本上就是修改版的 Swing。Swing 屬于默認(rèn) JDK UI 框架,Swing 和 AWT(Abstract Windows Toolkit,抽象窗口工具包)。Compose 則完全是另一碼事,當(dāng)然我們也在設(shè)計(jì)中考慮到了互操作性需求……Swing 這套框架太陳舊了,最早出現(xiàn)在上世紀(jì)九十年代末。多年來(lái)人們對(duì)于 UI 的設(shè)計(jì)思路已經(jīng)天翻地覆,Swing 顯然滿足不了要求了?!?/p>
JetBrains IDE 中的 Compose for Desktop 項(xiàng)目
Compose 與 Swing 有一個(gè)比較大的共同點(diǎn):與其他使用本機(jī)控件的跨平臺(tái)框架,比如例如 Java 的 SWT(Standard Widget Toolkit)以及微軟的 Xamarin 有所不同,它們選擇自主繪制控件。Compose 使用的 Skia 開(kāi)源圖形庫(kù),也在谷歌 Chrome、Flutter 及其他眾多框架當(dāng)中得到廣泛應(yīng)用。那這是否意味著 Compose 應(yīng)用程序?qū)](méi)有自己的原生外觀?對(duì)此,Igotti 的回應(yīng)是,“這取決于開(kāi)發(fā)人員的選擇,取決于他們?nèi)绾螢閼?yīng)用程序設(shè)置主題。在這方面,Compose 的情況與 Flutter 等其他框架沒(méi)什么區(qū)別?!?/p>
那 Compose for Desktop 應(yīng)用程序是否依賴(lài)于 JVM(Java Virtual Machine)運(yùn)行?Igotti 表示,“我們也知道,JVM 應(yīng)用程序的發(fā)布情況可能比較棘手。因此我們提供自己的 Gradle 插件,其使用 jpackage 與 Jlink 以 JVM 應(yīng)用程序?yàn)榛A(chǔ)制作原生應(yīng)用程序。Mac 的.dmg、Windows 的 MSI、Linux 的 deb 包等均可實(shí)現(xiàn),大家用不著擔(dān)心 JVM。”
也就是說(shuō),開(kāi)發(fā)成果將會(huì)是一款被精心包裹起來(lái)的 JVM 應(yīng)用程序。JetBrains 還有一款用于解決這個(gè)問(wèn)題的 Kotlin/Native 編譯器,“預(yù)計(jì)將在未來(lái)發(fā)布,或者專(zhuān)門(mén)用于桌面開(kāi)發(fā)?!?/p>
對(duì)應(yīng)用程序的另一種思考方式
那 Web 應(yīng)用程序方面呢?Igotti 回應(yīng)稱(chēng),“我們使用 Kotlin/JS 編譯器?!盋ompose 的 Web 版本不如桌面版先進(jìn),說(shuō)明文檔中也警告稱(chēng)“API 尚未最終確定,預(yù)計(jì)會(huì)發(fā)生重大變化。”此外,雖然 Web 版本確實(shí)使用 Compose 模型,但 API 卻完全不同,而且會(huì)使用 HTML 與 CSS。所以,Web 版與 Compose for Desktop 之間能夠共享的代碼應(yīng)該比較少。
據(jù) Igotti 介紹,“Compose 代表著一種不同的應(yīng)用程序思考方式。狀態(tài)即 UI 的真實(shí)來(lái)源,而 UI 本身是無(wú)狀態(tài)的,其表達(dá)永遠(yuǎn)由狀態(tài)計(jì)算得出。在這方面,Compose for Web 采用一組相同的原語(yǔ),完全相同的狀態(tài)管理思路。但是對(duì)于具體的小部件集合與排列方式,Web 版與桌面版之間確實(shí)無(wú)法互通?!?/p>
說(shuō)到這里,為什么要把 Compose for Android 擴(kuò)展到多種其他平臺(tái)之上?“Compose 的目標(biāo)受眾主要分為三類(lèi)。首先是使用 Kotlin 與 Compose 的 Android 開(kāi)發(fā)人員,他們希望把自己的開(kāi)發(fā)成果交付至其他平臺(tái);其二是純 Kotlin 開(kāi)發(fā)人員,他們希望以‘一次編寫(xiě)、隨處運(yùn)行’的方式開(kāi)發(fā)新的應(yīng)用程序;第三則是那些不太熟悉 Kotlin 或者 Compose,但又希望開(kāi)發(fā)出精美 UI 的用戶(hù),我們希望能為他們提供實(shí)現(xiàn)目標(biāo)的工具?!?/p>
Igotti 并沒(méi)有給出具體的發(fā)布日期,但表示自己希望 Beta 版能在今年秋天發(fā)布,“我們也希望能在今年之內(nèi)推出 1.0 版本?!表?xiàng)目本身是完全開(kāi)源的,“二十一世紀(jì)了,框架在大多數(shù)人們心目中就不應(yīng)該收費(fèi)。我們只是想開(kāi)發(fā)一款長(zhǎng)期缺失的軟件”,補(bǔ)足 JetBrains 當(dāng)前商業(yè)模式中的工具鏈。
那么,JetBrains 會(huì)在自己的其他工具中使用 Compose 嗎?事實(shí)上,他們的 JetBrains Toolbox(用于管理已安裝的 IDE)已經(jīng)在使用 Compose,但 Igotti 表示短時(shí)間內(nèi) Compose 還無(wú)法取代 IntelliJ IDEA 等現(xiàn)有框架。“編輯器是其中最復(fù)雜也最重要的組件,經(jīng)歷了 20 年的發(fā)展演進(jìn),我們幾乎不可能在中途進(jìn)行重寫(xiě)了。無(wú)論是 JetBrains 還是我個(gè)人,都不打算強(qiáng)迫每個(gè)人都轉(zhuǎn)而使用 Compose。我們的目標(biāo)是為原有框架選項(xiàng)滿足不了的用戶(hù)提供新的解決方案。”
寫(xiě)在最后
那么,為什么除了 Flutter 之外,我們還需要另一個(gè)跨平臺(tái)框架?雖然谷歌的 Flutter 最開(kāi)始主要面向移動(dòng)設(shè)備,但現(xiàn)在也開(kāi)始向桌面及 iOS 進(jìn)軍,甚至比 Compose 還搶先了一步。不過(guò),根據(jù) StackOverflow 的最新調(diào)查, Flutter 使用的語(yǔ)言為 Dart;盡管 Dart 語(yǔ)言的人氣正在增長(zhǎng)(正是受到 Flutter 的推動(dòng)),但仍然無(wú)法與 Kotlin 相提并論。
Compose 代表著一種獨(dú)特的 UI 構(gòu)建方法,也許最期待 Compose 跨平臺(tái)功能的受眾,正是那些曾在 Android 上使用過(guò)它、又特別喜歡這種 UI 構(gòu)建體驗(yàn)的開(kāi)發(fā)者。
想要進(jìn)一步了解 Compose,國(guó)內(nèi) Android 開(kāi)發(fā)者可訪問(wèn)以下鏈接查看中文手冊(cè):
延伸閱讀:
在此之前先推薦看大佬的: 填坑指導(dǎo)
iOS需要注意:
1、flutter2.0要求cocoapods 升級(jí)到1.9.0
詳情看這篇博客
2、原來(lái)flutter項(xiàng)目中的podfile文件是舊版本的ccocoapods了,刪除podfile和對(duì)應(yīng)的.lock,然后flutter項(xiàng)目重新運(yùn)行使用它自動(dòng)生成的podfile文件
3、安裝CocoaPods
卸載cocoapods:sudo gem uninstall cocoapods
查看cocoapods版本:pod --version
指定版本安裝:
sudo gem install -n /usr/local/bin cocoapods -v 1.9.3(新MacOS系統(tǒng)升級(jí))
不指定版本安裝
sudo gem install -n /usr/local/bin cocoapods
說(shuō)明 :老項(xiàng)目sdk1.17.0===升級(jí)到2.0.1,當(dāng)前所有操作基于win平臺(tái)
到此為止環(huán)境已經(jīng)準(zhǔn)備妥當(dāng),正式進(jìn)入項(xiàng)目修改。
所有的插件都要適配到空安全,插件是否支持均會(huì)有對(duì)應(yīng)說(shuō)明Null safety,適配過(guò)程不確定版本的話,可以使用dio: any,適配完事后再在pubspec.lock文件中查看具體的版本修改過(guò)來(lái),實(shí)在有部分插件沒(méi)有支持的,參考下面
部分插件在適配空安全的版本放棄維護(hù)了,得自行更新或?qū)ふ姨娲?,如?flutter_swiper 變?yōu)?flutter_swiper_null_safety ,插件更新后要注意項(xiàng)目中的用法是否需要更新
2.1.1: 以前采用的是 provide 插件共享全局?jǐn)?shù)據(jù),現(xiàn)在變化為 provider ,用法改變, 點(diǎn)擊參考 ,以防文章丟失,我重復(fù)一遍:
比如:
2.1.2: dio版本升級(jí)到4.0.0最新版后,部分用法改變
2.2.1
2.2.2
解決方案:
2.2.3
解決方案:
2.2.4
解決方案:
2.2.5
解決方案:
2.2.6
解決方案:
2.2.7
解決方案:
2.2.8
解決方案: child 換為sliver
2.2.8.1
解決方案: 項(xiàng)目目錄下: android--app-build.gradle --minSdkVersion改為:18 或者19
2.2.8.2
解決方案: 在pubspec.yarm管理里面添加:publish_to
2.2.8.3
解決方案: video_player升級(jí)后字段發(fā)生了變化,initialized字段更換為:isInitialized(_controller.value.isInitialized)
2.2.8.4
解決方案:
2.2.8.5
解決方案:
2.2.8.6
解決方案: 方案一:刪除ios目錄下的Podfile.lock 文件然后重新運(yùn)行 pod install命令
方案二:刪除ios目錄下的Podfile.lock與Podfile文件 重新運(yùn)行flutter run或flutter build ios
方案三:刪除ios目錄,重新運(yùn)行 flutter create . 命令,注意有"."這個(gè)符號(hào)不要忘記
2.2.8.7
這個(gè)報(bào)錯(cuò)一般對(duì)應(yīng)的就是下面的報(bào)錯(cuò),注意看后面的報(bào)錯(cuò)信息,看是哪個(gè)插件報(bào)錯(cuò)。
解決方案: 把Podfile的版本注釋打開(kāi),改為platform :ios, '9.0' 或者是更高的版本
全局替換
1.將new List() 替換為[];
2.TextField的inputFormatters:[WhitelistingTextInputFormatter.digitsOnly] 替換為[FilteringTextInputFormatter.digitsOnly]
3.TextField的inputFormatters:[WhitelistingTextInputFormatter(RegExp("[a-z|A-Z|0-9]"))]替換為FilteringTextInputFormatter.allow(RegExp("[a-z|A-Z|0-9]"))
4.Stack組件中overflow: Overflow.visible改為 clipBehavior: Clip.none;overflow: Overflow.clip改為clipBehavior:Clip.hardEdge
5.ListWheelScrollView組件中clipToSize = false改為clipBehavior: Clip.none,clipToSize = true改為 Clip.hardEdge
6.TextField中maxLengthEnforced: true改為maxLengthEnforcement:MaxLengthEnforcement.enforced
7.FlatButton、RaisedButton、OutlineButton的變化: 官方參考
顏色的屬性發(fā)生了變化,由原來(lái)的Color 變?yōu)榱薓aterialStatePropertyColor, 這是未了解決不同狀態(tài)(pressed、hovered、focused、disabled)下按鈕顏色的變化
例如
8.出現(xiàn)如下警告
9.showSnackBar報(bào)錯(cuò)誤
解決方案: Scaffold換為ScaffoldMessenger
10.textSelectionColor棄用
解決方案:
11.charts_flutter升級(jí)后屬性報(bào)錯(cuò)
解決方案:
12.flutter 真機(jī)調(diào)試無(wú)法訪問(wèn)網(wǎng)絡(luò),dio報(bào)錯(cuò)
解決方案:
android:
ios:
問(wèn)題12完整參考
Flutter是谷歌公司推出的跨終端的開(kāi)發(fā)框架,支持Android、iOS和WEB終端。1.0版在2018年12月5日發(fā)布,目前的最新版本是1.5,它采用的開(kāi)發(fā)語(yǔ)言是Dart,Dart也是谷歌開(kāi)發(fā)的計(jì)算機(jī)編程語(yǔ)言,語(yǔ)法類(lèi)似C,是編譯型語(yǔ)言:
hello world例子,打印字符串“Hello World!”:
1、沒(méi)有橋接層
React Native、Weex等技術(shù)都是跨終端的框架,然而性能跟原生App存在很大差距。這是由于它們的工作原理決定的:
React Native、Weex等技術(shù)多了一個(gè)橋接層,所以界面渲染會(huì)慢一些,由于UI渲染非常頻繁,想要不卡頓,基本上比較難,性能和用戶(hù)體驗(yàn)跟原生代碼有差距。而這恰恰是Flutter的優(yōu)勢(shì)所在:
Dart可以被編譯成不同平臺(tái)的本地代碼,讓Flutter不通過(guò)橋接層直接跟平臺(tái)通信,自然性能會(huì)快一些。
2、編譯執(zhí)行
JavaScript是解釋執(zhí)行的,Dart是編譯執(zhí)行的,性能誰(shuí)好一目了然。
3、Flutter Engine虛擬機(jī)
Flutter是依靠Flutter Engine虛擬機(jī)在iOS和Android上運(yùn)行的,F(xiàn)lutter Engine使用C/C++編寫(xiě),開(kāi)發(fā)人員通過(guò)Flutter框架直接和API在內(nèi)部進(jìn)行交互,所以具有輸入低延遲和UI渲染高幀速率的特點(diǎn)。除了這特點(diǎn)之外,F(xiàn)lutter還提供了自己的小部件,F(xiàn)lutter小部件是使用從React獲取靈感的現(xiàn)代框架構(gòu)建的。 中心思想是您使用小部件構(gòu)建UI。
窗口小部件根據(jù)其當(dāng)前配置和狀態(tài)描述了它們的視圖。 當(dāng)窗口小部件的狀態(tài)發(fā)生更改時(shí),窗口小部件會(huì)重建其描述,框架將根據(jù)前面的描述進(jìn)行區(qū)分,以確定底層呈現(xiàn)樹(shù)從一個(gè)狀態(tài)轉(zhuǎn)換到下一個(gè)狀態(tài)所需的最小更改??梢灾苯釉贠S平臺(tái)提供的畫(huà)布上進(jìn)行描繪,也就是一些核心類(lèi)庫(kù)直接放到虛擬機(jī)里面,調(diào)用起來(lái)更快。
從它的系統(tǒng)結(jié)構(gòu)可以看出,類(lèi)似安卓的ART(Android Run Time)虛擬機(jī),同樣采用AOT(Ahead of TIme)技術(shù),會(huì)在APP安裝時(shí)就編譯成機(jī)器語(yǔ)言,不再解釋執(zhí)行,從而優(yōu)化了APP運(yùn)行的性能。
4、自帶渲染引擎
Flutter使用谷歌自己的Skia渲染引擎,而Android系統(tǒng)自帶Skia引擎,iOS平臺(tái)上Flutter也會(huì)把Skia引擎打包到APP中,從而實(shí)現(xiàn)了高效渲染。而React Native通過(guò)橋接層訪問(wèn)原生UI,操作頻繁就容易出性能問(wèn)題。
綜合所述,F(xiàn)lutter 是性能最接近原生代碼 的一種開(kāi)發(fā)框架,未來(lái)也會(huì)是構(gòu)建谷歌Fuchsia應(yīng)用的主要方式,前途不可限量,唯一的問(wèn)題就是需要學(xué)習(xí)一門(mén)新的語(yǔ)言:Dart,而有Java或者C#語(yǔ)言基礎(chǔ)的程序員會(huì)比較容易學(xué)習(xí)。
在討論Harmony OS是否真的讓谷歌慌了之前,我們先來(lái)對(duì)比一下兩個(gè)操作系統(tǒng),從架構(gòu)出發(fā)對(duì)比一下兩個(gè)操作系統(tǒng)的設(shè)計(jì)理念和目標(biāo)是否是一樣的。
HarmonyOS整體遵從分層設(shè)計(jì),從下向上依次為:內(nèi)核層、系統(tǒng)服務(wù)層、框架層和應(yīng)用層。系統(tǒng)功能按照“系統(tǒng) 子系統(tǒng) 功能/模塊”逐級(jí)展開(kāi),在多設(shè)備部署場(chǎng)景下,支持根據(jù)實(shí)際需求裁剪某些非必要的子系統(tǒng)或功能/模塊。HarmonyOS技術(shù)架構(gòu)如下所示。
系統(tǒng)服務(wù)層是HarmonyOS的核心能力集合,通過(guò)框架層對(duì)應(yīng)用程序提供服務(wù)。該層包含以下幾個(gè)部分:
根據(jù)不同設(shè)備形態(tài)的部署環(huán)境,基礎(chǔ)軟件服務(wù)子系統(tǒng)集、增強(qiáng)軟件服務(wù)子系統(tǒng)集、硬件服務(wù)子系統(tǒng)集內(nèi)部可以按子系統(tǒng)粒度裁剪,每個(gè)子系統(tǒng)內(nèi)部又可以按功能粒度裁剪。
框架層為HarmonyOS應(yīng)用開(kāi)發(fā)提供了Java/C/C++/JS等多語(yǔ)言的用戶(hù)程序框架和Ability框架,兩種UI框架(包括適用于Java語(yǔ)言的Java UI框架、適用于JS語(yǔ)言的JS UI框架),以及各種軟硬件服務(wù)對(duì)外開(kāi)放的多語(yǔ)言框架API。根據(jù)系統(tǒng)的組件化裁剪程度,HarmonyOS設(shè)備支持的API也會(huì)有所不同。
應(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界面,提供與用戶(hù)交互的能力;而PA無(wú)UI界面,提供后臺(tái)運(yùn)行任務(wù)的能力以及統(tǒng)一的數(shù)據(jù)訪問(wèn)抽象。FA在進(jìn)行用戶(hù)交互時(shí)所需的后臺(tái)數(shù)據(jù)訪問(wèn)也需要由對(duì)應(yīng)的PA提供支撐?;贔A/PA開(kāi)發(fā)的應(yīng)用,能夠?qū)崿F(xiàn)特定的業(yè)務(wù)功能,支持跨設(shè)備調(diào)度與分發(fā),為用戶(hù)提供一致、高效的應(yīng)用體驗(yàn)。
Fuchsia OS整體也采用分層架構(gòu)設(shè)計(jì),也被分為了4個(gè)不同層次。
對(duì)于不太了解內(nèi)核作用的同學(xué)簡(jiǎn)而言之,Zircon之于Fuchsia,恰如Linux之余于Android。Linux內(nèi)核驅(qū)動(dòng)了多個(gè)操作系統(tǒng),很多操作系統(tǒng)構(gòu)建在它之上,比如 Ubuntu、Android、Manjaro、ArchLinux、Debian、Red Hat、SUSE 甚至 Chrome OS ,所以我們也可以大膽預(yù)測(cè),如果未來(lái)Fuchsia OS 發(fā)展良好, Zircon 內(nèi)核也被證明好用,那么很有可能有更多的操作系統(tǒng)采用這一新內(nèi)核。
系統(tǒng)服務(wù)層(Garnet)
也是直接構(gòu)建在 Zircon 上的一層名叫 Garnet。 Garnet 包含各種操作系統(tǒng)所需的各種底層功能,包括硬件的驅(qū)動(dòng)程序(網(wǎng)絡(luò),圖形等)和軟件安裝。這一層最激動(dòng)人心的事情是 Escher(圖形渲染器),Amber(Fuchsia 更新程序)和Xi Core,它是Xi文本和代碼編輯器的底層引擎(今年早些時(shí)候已經(jīng)發(fā)布了)。
模塊管理層(Peridot)
Peridot 是接下來(lái)的這一層,主要處理Fuchsia的模塊化應(yīng)用程序設(shè)計(jì), Peridot的另外兩個(gè)主要組件直接用于模塊。 Ledger 可以跨設(shè)備保存您在應(yīng)用/模塊中的位置,并同步到您的Google帳戶(hù)。Maxwell 是一個(gè)更復(fù)雜的主題,需要更多進(jìn)一步地深入研究,但是 Maxwell 極有可能是讓 Fuchsia 充分施展魔力的點(diǎn)睛之筆,可以提前透露的是,Maxwell 的厲害之處包括 Kronk,也是大家熟知的 Google Assistant。
應(yīng)用層(Topaz)
Topaz,是這個(gè) Layer Cake 蛋糕的頂層,也是對(duì)開(kāi)發(fā)者和用戶(hù)直接影響最大的一層。Topaz 提供 Flutter 支持,而有了Flutter 的支持,各種華麗的應(yīng)用程序,可以幫助充實(shí)地提供日常使用的功能齊全的應(yīng)用程序。比如,現(xiàn)在最令人印象深刻的當(dāng)然是 Armadillo UI,它是 Fuchsia 的主要用戶(hù)界面和主屏幕。
可以做一個(gè)類(lèi)比,Topaz 這一層在 Android 中可以找到一個(gè)對(duì)照,這將是你的必備應(yīng)用程序,如聯(lián)系人,音樂(lè),文件管理器和文本編輯器 Xi(Topaz中的可視前端連接到Garnet的后端)。即使沒(méi)有你需要的東西,你也可以簡(jiǎn)單方便地安裝。
Harmony OS 與 Fuchsia OS的主要相同點(diǎn):
Harmony OS 與 Fuchsia OS的主要不同點(diǎn):
個(gè)人認(rèn)為Harmony OS成功的可能性更大。雖然從生態(tài)上來(lái)說(shuō),谷歌可以利用Android建立的生態(tài)伙伴優(yōu)勢(shì)推廣Fuchsia OS,但也恰恰是Android完善的生態(tài)會(huì)給Fuchsia OS的推廣造成最大障礙。
相反Harmony OS從架構(gòu)上更符合物聯(lián)網(wǎng)時(shí)代的需求,然后華為作為主導(dǎo)者具備強(qiáng)大的硬件制造能力,Harmony OS在華為很多手機(jī)上已經(jīng)推送,國(guó)內(nèi)很多公司的冰箱、空調(diào)等也都在采用華為鴻蒙系統(tǒng)。這些都有利于Harmony OS系統(tǒng)的產(chǎn)業(yè)化發(fā)展。
當(dāng)然,從全球大環(huán)境來(lái)說(shuō),Harmony OS可以在國(guó)內(nèi)做成功,但是要想在國(guó)際上推廣難度是非常大的。美國(guó)的 科技 霸權(quán),導(dǎo)致計(jì)算機(jī)誕生以來(lái)底層技術(shù)很少在美國(guó)之外的公司誕生并發(fā)揚(yáng)光大。Lua、Ruby等編程語(yǔ)言,Intellij IDEA等算是為數(shù)不多的例子。