軟件工程2021:第2次作業—— 談談鴻蒙操作系統
一、概述鴻蒙操作系統
- 開發背景:
2019年美國政府禁止美國對華出口,這切斷了華為與大多數芯片和軟件供應商的接觸,華為需要讓公司擺脫美國軟件的影響,從全球智能手機供應鏈中獨立出來,于是推出了主打物聯網時代的“鴻蒙系統”。
- 需求:
隨著科技不斷地發展,用戶真正需要的是一個簡單而快速的操作系統,這個操作系統,可以有完整的生態(譬如,桌面操作系統,可以兼容早期的Windows軟件,手機操作系統,可以很好的兼容或者編譯后兼容早期的安卓程序)。
華為系統現在面對的是千千萬萬有不同想法的用戶,對手機的體驗需求以及對未來網絡的需求是華為需要綜合考慮的。其次要解決的問題就是擺脫安卓系統的枷鎖。
無論是電腦也好,手機也好,某個操作系統,有足夠強大的生態系統,又總能快人一步,體驗好幾個檔次,那么這個操作系統自然會普及開來。
- 開發歷史:
2012年9月,華為開始規劃自有操作系統“鴻蒙”。華為“2012諾亞方舟實驗室”專家座談會上,任正非提出了要做終端操作系統防范于未然,要在“斷了我們糧食的時候,備份系統要能用得上?!?/p>
2017年,鴻蒙內核 1.0
2018年,鴻蒙內核 2.0
2019年,鴻蒙OS 1.0
2019年5月24日,國家知識產權局商標局網站顯示,華為已申請“華為鴻蒙”商標,申請日期是2018年8月24日,注冊公告日期是2019年5月14日,專用權限期是從2019年5月14日到2029年5月13日。
2019年5月17日,由某教授領導的華為操作系統團隊開發了自主產權操作系統——鴻蒙。
2019年8月9日,華為正式發布鴻蒙系統(HongmengOS),實行開源。
2020年,鴻蒙OS 2.0
2020年9月10日,華為在HDC開發者大會上如約發布鴻蒙 2.0,并面向應用開發者發布Beta版本。明年鴻蒙將全面支持華為手機。鴻蒙HarmonyOS正式開源,今年年底首先對國內開發者發布針對智能手機的HarmonyOS beta版本。
2021年4月22日,HarmonyOS應用開發在線體驗網站上線。5月18日,華為宣布將HiLink與Harmony OS統一為鴻蒙智聯,計劃在6月2日正式舉辦鴻蒙產品發布會。
- 應用場景:
鴻蒙OS將作為華為迎接全場景體驗時代到來的產物,發揮其輕量化、小巧、功能強大的優勢,率先應用在智能手表、智慧屏、車載設備、智能音箱等智能終端上,著力構建一個跨終端的融合共享生態,重塑安全可靠的運行環境,為消費者打造全場景智慧生活新體驗。
- 發展趨勢:
目前,中國已經具備健全的應用生態和龐大的用戶基礎,未來華為將依托中國、面向全球打造鴻蒙OS生態,通過聚焦新的價值,開放在通信、照相、全場景、AI等方面的核心能力,與各界生態伙伴共同打造出面向消費者體驗更佳的應用和服務,為產業注入新活力,共創全場景智慧化新體驗與新生態。在超前的技術特性和戰略布局下,鴻蒙OS不僅能為消費者帶來萬物互聯的全場景智慧生活的極致體驗,也能讓設備商在5G+AI+IOT爆發的全場景智慧化時代搶占先機,讓開發者以最少投入覆蓋最多用戶,快速實現全場景業務創新。
二、關于鴻蒙是否套殼的爭議
- 什么是創新及代碼復用與創新的關系:
所謂創新,通俗地講就是,別人沒想到的你想到了;別人沒發現的你發現了;別人沒做成的你做成了。創新,涉及到軟件生產的各個環節和領域,從環節上包括售前創新、售中創新和售后創新;從領域上包括理論與方法論創新、管理與制度創新、過程和控制創新、技術與工具創新、文化創新、科技創新以及其它方面的創新。針對軟件開發來講,核心問題就是如何提升軟件開發的質量和生產效率。
創新簡單來說應是在已有的基礎做出改善。所以鴻蒙的套殼爭議我們可以從另外一個角度看,在ASOP這個項目里,任何機構和企業都有義務為開源社區貢獻代碼,也能夠使用和下載開源代碼,并基于開源項目做二次開發。所以ASOP的代碼并不全是谷歌寫的,華為也是ASOP的重要貢獻者。而智能手機所使用的安卓系統則是由開源的ASOP代碼和谷歌自有的GMS(移動服務)組成的,谷歌終止向華為授權的正是私有的GMS服務。因此華為可以說是在自己所持有的資源下進行代碼復用的創新,由于ASOP代碼在安卓系統有了成功的運用,而鴻蒙OS的開發又有ASOP代碼的參與,因此避免不了系統會有安卓的影子。代碼復用的初衷是為了提高效率,節約重復開發的時間。更何況是在技術戰爭的情況下,華為為什么舍棄自己持有的ASOP代碼而且花費更多的經歷再去重造新代碼,這不僅降低了新系統的開發效率,還浪費了現有的人力物力。
華為消費者業務 CEO 余承東表示:隨著全場景智慧時代的到來,華為認為需要進一步提升操作系統的跨平臺能力,包括支持全場景、跨多設備和平臺的能力以及應對低時延、高安全性挑戰的能力,因此逐漸形成了鴻蒙 OS 的雛形,可以說鴻蒙OS的出發點和 Android、iOS 都不一樣,是一款全新的基于微內核的面向全場景的分布式操作系統,能夠同時滿足全場景流暢體驗、架構級可信安全、跨終端無縫協同以及一次開發多終端部署的要求,鴻蒙應未來而生。
那么創新的目的是什么呢?是為了讓某個東西更加完善,為了讓用戶體驗更好,為了讓用戶體驗到新鮮的功能,為了更加方便。由此看來,華為考慮到了創新的本質,這才有了上述的創新成果。
三、代碼風格分析
1.好的代碼風格1:
public <T> ServerBootstrap childOption(ChannelOption<T> childOption, T value) { if (childOption == null) { throw new NullPointerException("childOption"); } if (value == null) { synchronized (childOptions) { childOptions.remove(childOption); } } else { synchronized (childOptions) { childOptions.put(childOption, value); } } return this; }
代碼分析:這個方法使用鍵值作為鎖對象,縮小了同步范圍,提升了效率。
2.好的代碼風格2:
public class ReporterConfig { private String m_className; private List m_properties = new ArrayList(); public void addProperty(Property property) { m_properties.add(property); } }
代碼分析:它正好一覽無遺,一眼就能看這個是有兩個變量和一個方法的類。
3.不好的代碼風格1:
public class ReporterConfig { /** * The class name of the reporter listener */ private String m_className; /** * The properties of the reporter listener */ private List<Property> m_properties = new ArrayList<Property>(); public void addProperty(Property property) { m_properties.add(property); } }
代碼分析:相比于2,3的注釋簡直畫蛇添足,隔斷了兩個實體變量間的聯系,我們不得不移動頭部和眼球,才能獲得相同的理解度。
4.不好的代碼風格2:
int CDownloadPlugin::FirstProcessEvent(void* pEvent, void* target) { *** std::unique_lock <std::mutex> lck(g_lock); { *** } repo_empty.notify_all(); *** } DWORD WINAPI TestProc(LPVOID lpThreadParameter) { *** std::unique_lock <std::mutex> lck(g_lock); while (g_queIEvent.empty()) { repo_empty.wait(lck); *** } *** }
代碼分析:
問題代碼:while (g_queIEvent.empty()), 此循環條件指的是線程終止條件(while循環跳出或者第一次沒有進去表明此線程結束)
解決方法:①改為while (!this->isInterrupted()) ②改為while (!m_bStop) 要注意其他地方也要對應處理
5.不好的代碼風格3:
void CDownloadPlugin::run() { *** while (!this->isInterrupted()) { m_Semaphore.Wait(); *** { std::lock_guard<std::mutex> lk(m_mutex_filelist); *** } } } void CDownloadPlugin::UnInit() { //停止并等待線程結束 if (!this->isInterrupted()) { this->interrupt(); } CXdThread::join(); }
代碼分析:
產生現象:進程停止卡死(因為子線程沒有被正常停止,子線程正在等待互斥量釋放——>>>變相的死鎖問題)
問題代碼:
//停止并等待線程結束
if (!this->isInterrupted())
{
this->interrupt();
}
解決方法: this->interrupt();下一條語句加m_Semaphore.Signal(); 意思是在主線程停止的時候,設置完子線程終止標志,必須要額外通知子線程,否則子線程會死等信號狀態。
浙公網安備 33010602011771號