眾所周知Google的Android系統跟Linux系統有著千絲萬縷的關系,可究竟有什麼關系呢?有人說Android是Android,Linux是Linux,兩個只是kernel一樣調度機制一樣,其他沒一毛錢關系,有人說Android說到底就是個Linux系統,可如果是這樣,那麼為什麼Android系統能這麼火,其他的Linux發行版(Ubuntu/Fedora/centos等)為什麼在移動端火不起來呢?下面的圖或許可以解開這些迷惑。
上面兩幅圖應該很直觀的展示了Android系統和Linux發行版系統(Ubuntu/Fedora/centos)之間的區別和聯系。可以這麼說Android本質上還是一個Linux系統,只不過Google對它進行了裁剪和定制,這跟我們定制Linux到自己的嵌入式設備上的做法大同小異,只不過Google做的更多罷了,那麼Google主要做了哪些事情呢?上圖中也可以看出來,很多人說Android系統的程序只能用Java開發,這麼說的說明對Android系統的架構了解的還不是很深入,其實從圖上看到,Google自己寫了一個叫Dalvik的程序運行在Linux的系統上面,這個程序就是Android的Java虛擬機(JVM),由於效率等問題Android4.4以後改為Android Run Time(ART),但不管是Dalvik還是ART,都是用c/c++開發的,而用Java開發出來的APP其實是運行在Dalvik/ART上面的,皮之不存毛將焉附,沒有Dalvik/ART,那些Java開發的APP是根本沒法運行的,所以說那些說Android系統不能用c/c++開發的說法是站不住腳的,只要用AOSP(安卓開放源碼項目)裏面的交叉編譯器編譯出來的二進制文件在Android上面照樣也是可以運行的,而且跟Dalvik/ART屬於同一層次的東西,即(都是init進程的子進程),但是一般的Android系統上init進程只有一個子進程即Dalvik/ART,如果非要說Dalvik/ART才算Android的話,那麼Android確實不能用c/c++開發,因為Java程序編譯出來的是字節碼,只能在Dalvik/ART上運行,c/c++編譯出來的是二進制機器碼直接在CPU中運行,應該說c/c++開發(這裏不是說的JNI方式)Android程序無法調用Android的Java類庫這樣才是正確的。
說了這麼多Android的,再看看Linux發行版的做法,Linux發行版一般是在Linux的基礎上開發了一套桌面管理系統,比如基於GTK框架的gnome,比如基於Qt框架的LXQT(聽說Ubuntu准備拋棄gnome投向Qt懷抱了?Qt的死忠粉表示乾得好!)。跟Windows一樣,經典的一個桌面系統+N個軟件的模式,用c/c++開發出來程序編譯成二進制的機器碼直接運行在Linux系統上,這些軟件全部都是跟Dalvik/ART一個層次的東西,而Linux發行版的程序能不能用Java開發呢?這個問題就跟問Windows上能不能用Java開發一樣沒水准。畢竟Dalvik/ART本身也是運行在Linux系統上的,你只要把Dalvik/ART移植到Linux發行版甚至Windows上,你手機裏的那些APP就可以運行了(當然是不依賴硬件的,如果要打電話肯定是不行了),不然你以為Android模擬器是怎麼弄的。
總結起來,Android系統和Linux發行版的系統根本區別是Android上面只跑了一個Dalvik/ART,而Linux發行版上面跑了很多“Dalvik/ART”而已。如果你把gnome或者LXQT部署到Android上,或者把Dalvik/ART部署到Linux發行版上的話,那麼二者的區別可能並沒你想象的那麼大。
其實,在Linux上面跑一個軟件(虛擬機、解釋器),然後再基於這個軟件做二次開發的的做法Google的Android並不是第一個這麼乾的。工控行業的小夥伴對控制器應該很熟悉吧?什麼,你不知道控制器?或者說PLC更親切吧,PLC(可編程控制器)只是一種通用的控制器而已,PLC分為兩種,一種是編譯型的PLC,我們在學校裏學習的什麼歐姆龍,三菱,西門子S300都是這種PLC,這種PLC的軟件架構很簡單,就是一個單片機,然後我們畫的梯形圖跟我們編譯單片機程序一樣直接被編譯成了機器碼,然後燒寫到單片機裏面執行,這種PLC是沒有辦法監控運行的,不過我要說的是另外一種PLC,曾經機緣巧合接觸過一段時間,那就是軟PLC,最常用的軟PLC就是codesys,codesys可不止是一個簡單的PLC編譯工具!它是一個軟PLC核!為什麼說他跟Android的做法十分相似呢?看看它的架構就知道了,codesys通常被部署在Linux系統上面,開機即運行,然後我們的梯形圖程序被codesys編譯工具轉成梯形圖指令保存到內存中,然後codesys內核逐句解析梯形圖指令,邊解析邊執行,而不是像傳統的編譯型的PLC一樣先把所有程序編譯成機器碼再燒寫到flash中,運行的時候再搬到內存裏面運行,這跟JVM執行字節碼如出一轍,這種PLC可以很方便的實現監控運行,怎麼樣,是不是跟Android的做法很相似呢?
codesys軟PLC軟件架構如下圖所示: