1. 鴻蒙系統全面解析,誕生背景、技術細節生態圈一文看懂 | 智東西內參
華為6月2日正式發布的鴻蒙系統無疑占據了最近熱點話題的C位,雖然不全是贊美的聲音,但這種努力打破美國壟斷,挑戰谷歌、蘋果在移動操作系統上壟斷地位的嘗試必將成為中國 科技 史上的里程碑事件。
本期的智能內參,我們推薦興業證券的報告《華為鴻蒙深度研究》, 從鴻蒙系統的產生背景、開源技術細節和產業鏈生態圈全面解析鴻蒙系統。
原標題:
《華為鴻蒙深度研究》
作者: 未註明
鴻蒙產生的時代背景,總體來說有六個:
1、數字化的時代背景:數字化新時代的到來需要新的操作系統;
2、IoT 與 5G:5G物聯網時代的到來對操作系統提出了新的要求;
3、中國面臨「卡脖子」的挑戰:獨立自主的研發操作系統是迫切的需求;
4、人工智慧的興起:AIoT場景天然要求多設備智能協同,需要一個適用於各類型機器的操作系統;
5、大數據與雲計算:TB、PB級的大數據需要一個能夠提供多機互聯的操作系統;
6、全球信息安全面臨挑戰:網路安全威脅呈現多元化、復雜化、頻發高發趨勢,需要一個足夠安全的系統進行保障。
到鴻蒙的出現,操作系統已經經歷了四代:分別是Unix、Windows/Mac/linux、iOS/android和鴻蒙/Fuchsia。
Fuchsia是由Google自主開發的基於Zircon微內核的開源系統,它可以運行在手機、電腦、智能家電等硬體產品上。
谷歌公司對Fuchsia的預期發展是讓它取代Android和 Chrome OS ,統一兩者成為一個操作系統。
和安卓相比,鴻蒙與安卓都是基於Linux開發,安卓是基於宏內核結構設計,而鴻蒙是基於微內核結構設計。鴻蒙系統使用C和C++編寫,不需要虛擬機這一中間過程,因此運行效率更高。
和iOS相比,iOS和鴻蒙都是致力於萬物互聯的操作系統,iOS底層是基於Unix的,並且是閉源的,鴻蒙是基於Lmux的, 是開源的。
全球操作系統格局
2012年,華為出於對谷歌如果對其斷供就會難以維持生產的顧忌,開始布局自有分布式操作系統。
2019年5月15日,華為被列入了所謂「實體清單」,谷歌Android 服務GMS對華為禁供。
5G迅猛發展,物聯網時代來臨,多年前的布局使華為抓住了最佳的發展時期。
鴻蒙發展 歷史
總體來說,鴻蒙的技術現階段優勢在於開放,但劣勢是生態。系統在分布式部署、時延和流暢性等方面具有優勢,但最大短板生態。
構建一個成熟的生態是鴻蒙能否生存下去並取得勝利的關鍵所在。
技術上,鴻蒙系統使用微內核架構。內核是操作系統內最基礎的構件,因此內核的設計對於操作系統的外部特性也有著至關重要的影響。
常見內核結構可以分為宏內核、微內核、混合內核、外內核等。
微內核是較新內核結構,但是它擁有著眾多宏內核不具有的優良特性,吸引了很多研究者。
微內核與宏內核對比
微內核架構包含兩類組件:核心系統和插件模塊。核心系統負責通用功能,不因為業務的變化而變化。
插件模塊負責實現具體的業務,可以根據業務的變化而改動和擴展。
微內核架構模式可以將其他應用程序的功能作為插件添加到核心應用程序,從而提供應用的可擴展性、功能分離性和獨立性。
微內核架構通常具有以下特徵:整體敏捷度高、易部署、可測性高、功能表現優秀、可擴展性強和不易開發。
鴻蒙系統設計
鴻蒙架構的另一個很大優勢是依靠分布式軟匯流排、分布式設備虛擬化、分布式數據管理、分布式任務調度等技術,可以實現多種類、多數量的設備之間硬體的互助和資源共享。
分布式數據管理
分布式軟匯流排
分布式設備虛擬化
鴻蒙系統設計初衷是為滿足全場景智慧體驗的高標准鏈接要求,可適配手機、平板、電視、智能 汽車 、可穿戴設備等廣泛的終端設備, 將在未來萬物互聯的智能 社會 中打造下一代操作系統。
鴻蒙當前和未來架構
在技術特性上,鴻蒙有著 一次開發,多端部署 的特點。
在鴻蒙OS的框架層提供了用戶程序框架、Ability框架和UI框架。它們可以支持多終端設備業務邏輯和界面邏輯的復用,這樣應用跨設備的開發效率也就得到了提框架層升。
另一個特點是 統一OS,彈性部署 。鴻蒙os通過組件化和小型化的設計方法,使得針對各種類型的設備可以按需求選擇合適的部署方案。
鴻蒙支持多種組件配置方案:1、支持各組件的選擇,組件並不是必須被部署,可以按照需要選擇合適的部件;
2、支持組件內功能集的配置,可以按照需求選擇性的給組件配置功能集;
3、支持組件內功能集的配置,可以按照需求選擇性的給組件配置功能集。
除了微內核,鴻蒙的另一大賣點是方舟編譯器。方舟編譯器可以方便安卓APP移植到鴻蒙系統。
方舟編譯器是華為自主研發的編譯器平台,它將以前邊解釋邊執行的低效運行方式轉變為將java、C、C++等代碼一次編譯成機器碼的高效運行方式,同時也實現了多語言的統一。
華為官方數據表明,方舟編譯器能提升24%的操作系統流暢度、44%的系統響應能力和60%的三方應用操作流暢度。
華為當前的業務可分為四大領域:消費者業務、運營商業務、企業業務和雲服務四大業務領域相互協同、共同發展,拼接成華為生態戰略布局版圖。
華為生態
鴻蒙系統的生態可以概括為1+8+N。1+8+N戰略的核心是1 , 即智能手機。智能手機作為鴻蒙生態的核心部分,憑借華為海思自研的麒麟晶元,為其他設備終端提供相應的通信支撐。
正是因為萬物互聯的場景中手機的重要性,華為始終以全球手機市場第一作為目標。
8是指 PC、平板、智慧屏、音箱、眼鏡、手錶、車機、耳機 ,這8項將由華為公司親自研發和參與市場,並且會追求市場領先地位。
N是 攝像頭、掃地機、智能秤等外圍智能硬體 ,涵蓋移動辦公、智能家居、運動 健康 、影音 娛樂 、智慧出行五大場景模式。
這些領域是與鴻蒙生態的合作夥伴進行共同開發,在合作過程中,鴻蒙生態將會提供HiLink協議標准,HiAI組件,Lite OS等技術平台,同時將鴻蒙操作系統開源。
2019年8月,全球第一款搭載華為鴻蒙系統的榮耀智慧屏正式發布。
榮耀智慧屏作為當時首個搭載鴻蒙系統的終端產品,突破了傳統電視的概念,搭載有鴻鵠818智慧晶元等三顆華為自研晶元和升降式AI攝像頭,內置華為系統級視頻通話功能,開創了大屏和手機的新交互方式,除了可聯控智能家居,還能實現智慧雙投、魔法閃投、魔法控屏等功能。
鴻蒙OS + 智慧屏
2021年4月,華為的鴻蒙OS智能座艙正式發布。
鴻蒙OS車機操作系統是面向車的操作系統,與手機同平台。鴻蒙OS智能座艙搭載有一芯多屏、多用戶並發、運行時確定性保障、分布式外設、車載網路、多部件等多種應用,提供差異化啟動恢復、極速啟動、多用戶切換、聲場控制、多部件協同等功能。
鴻蒙OS智能座船可以及時升級應用,基於其HMS-Automotive平台,開發者能夠提供更好的服務與應用體驗,實現人、車、家的全場景協同。
鴻蒙OS + 智能座艙
同時面向車載場景增量還開發有HOS-A子系統,可實現賬號、多模輸入、用戶程序框架、元能力框架、多媒體、公共通信、車機業務啟動恢復等功能,使得自動駕駛、導航、視頻、音樂和通話等業務能夠在智能座艙和其他設備之間實現無縫切換,讓智能駕駛變得簡單、有趣、享受。
發布會現場透露,目前智能駕駛生態平台已獲得30+硬體生態、50+應用生態合作夥伴支持,未來鴻蒙OS將繼續加大與 汽車 及應用領域的開放與合作力度,與產業鏈一起打造智能駕駛的極致體驗。
2020年7月,華為消費者業務CEO余承東,與美的集團董事長方洪波正式簽署《戰略合作框架協議》,雙方在智慧家居領域達成「全方位戰略合作關系」 。
2021年4月,作為首批支持鴻蒙系統的家電產品,美的家用智能蒸烤箱S5mini正 式上市,該智能蒸箱搭載了華為鴻蒙系統,同時搭配了鴻蒙系統的一碰連特性,可以快速完成配網。
配網成功後,手機會自動跳轉到鴻蒙系統內置的輕量化產品頁面,用戶可以在頁面中獲取跟產品搭配的定製食譜,根據菜譜准備食材,即可一鍵啟動機器、機器自動烹飪。
智東西 認為,數字商業的終極競爭,歸根到底就是操作系統的競爭,全球市值前3名的蘋果、谷歌和微軟,他們共同特點就是都具備操作系統。鴻蒙的推出,長遠來看決定了能否在異構計算時代中取得第四張操作系統入場券的關鍵。
2. Android應用的伺服器端可以用C#寫嗎還是只能用java寫
Android應用的伺服器端是可以用C#寫的:
1、C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程序設計語言。並定於在微軟職業開發者論壇(PDC)上登台亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、介面、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司 .NET windows網路框架的主角。
2、C#是一種安全的、穩定的、簡單的、優雅的,由C和C++衍生出來的面向對象的編程語言。它在繼承C和C++強大功能的同時去掉了一些它們的復雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。
3、C#是面向對象的編程語言。它使得程序員可以快速地編寫各種基於MICROSOFT .NET平台的應用程序,MICROSOFT .NET提供了一系列的工具和服務來最大程度地開發利用計算與通訊領域。
4、C#使得C++程序員可以高效的開發程序,且因可調用由 C/C++ 編寫的本機原生函數,因此絕不損失C/C++原有的強大的功能。因為這種繼承關系,C#與C/C++具有極大的相似性,熟悉類似語言的開發者可以很快的轉向C#。
3. android系統編譯能用分布式編譯嗎
項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。
tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。
ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒
看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。
4. 華為鴻蒙是基於安卓嗎
不是。鴻蒙系統、安卓系統、ios系統是並列關系,都是操作系統。
鴻蒙OS是一款「面向未來」的操作系統,一款基於微內核的面向全場景的分布式操作系統,現已適配智慧屏,未來它將適配手機、平板、電腦、智能汽車、可穿戴設備等多終端設備。
鴻蒙OS有三大特點:
1、面向未來發展趨勢開發的系統,比谷歌微軟出發點高遠;
2、面向全場景,統籌了所有智能設備,所以未來所有設備是可以交互的,生態就非常廣泛;
3、分布式。類似模塊化,根據不同設備匹配不同架構組件,讓系統高效、簡單。
鴻蒙OS憑借多終端開發IDE,多語言統一編譯,分布式架構Kit提供屏幕布局控制項及交互的自動適配,支持控制項拖拽,面向預覽的可視化編程,從而使開發者可以基於同一工程高效構建多端自動運行App,實現真正的一次開發,多端部署,在跨設備之間實現共享生態。
華為方舟編譯器是首個取代Android虛擬機模式的靜態編譯器,可供開發者在開發環境中一次性將高級語言編譯為機器碼。此外,方舟編譯器支持多語言統一編譯,可大幅提高開發效率。
5. Android開發常用工具(一)
1、Android Studio
谷歌推出的Android集成開發工具,經過多年的迭代發展已經變得非常強大及人性化,各式各樣的工具插件滿足日常的開發需求,也可以自己製作工具插件,下載即可贈送SDK和JDK大禮包,並配置好環境變數,基本做到一鍵式開發。記得15年剛開始做開發時使用的是Eclipse,需要手動配置sdk,jdk,環境變數等,對於當時處於新手的我來說非常的繁瑣,也增加了時間成本。
2、Figma
UI製作查看工具,最近幾年比較火的UI設計軟體,使用起來就跟在線文檔一個感覺,設置許可權之後,只有美工人員可以進行編輯,而開發人員只能進行查看,裡面配置了Android、ios、css等不同平台所需要標注參數,方便不同平台開發人員查看,對比其它工具優點是打開查看UI非常方便,不需要像pxcook要先下載源UI文件,需要吐槽的是導出多尺寸圖片沒有Pxcook工具那樣方便,只能一張一張導出命名,可能是沒找到正確的使用方式,有懂的同學可以下方留言。
3、GitLab
用於代碼倉庫管理系統,使用Git作為管理工具,並在此基礎上搭建起來的Web服務。一般用於管理開發的業務主項目、開發自研的框架等,可以很方便查看遠程代碼倉庫以及組員的提交內容,也可以使用裡面的ci去構建自動化打包,但目前使用到的自動化打包構建方式還是Jenkins比較多點,ci配置需要許可權等問題。
4、Git
開源的分布式版本控制系統,同樣的工具還有svn(小烏龜),cvs等,用於代碼的提交拉取合並等。記得剛開始做開發時用的是svn,每次發布上線完一個版本後都要備份一份代碼在伺服器,開發過程中途如果遇到要緊急發布個小版本就可以通過備份的代碼進行開發發布小版本,非常不方便。直到後面用了git替代才發現原來這么的方便,git可以很方便拉取分支、切換分支、合並分支到主幹,再結合Gitlab、GitHub等倉庫管理系統進行可視化代碼管理,大大提高了效率。
5、Jenkins
基於Java開發的一種持續集成工具,用於自動化打包apk到指定伺服器,測試人員通過鏈接下載apk進行測試。常規操作是將 Jenkins工具 部署
在遠程linux伺服器,將工程項目代碼、SDK、JDK等打包編譯需要的也配置到該伺服器,還要一份打包Apk上傳包到指定FTP的腳本,本地電腦通過web操作jenkins進行項目選擇分支選擇打包就可以。
未完待續