上面兩幅圖展示了Android系統(tǒng)和Linux發(fā)行版系統(tǒng)(Ubuntu/Fedora/centos)之間的區(qū)別和聯(lián)系政供≈该矗可以這么說Android本質(zhì)上還是一個(gè)Linux系統(tǒng),只不過Google對(duì)它進(jìn)行了裁剪和定制,這跟我們定制Linux到自己的嵌入式設(shè)備上的做法大同小異迷帜,只不過Google做的更多罷了。
上圖中也可以看出來色洞,很多人說Android系統(tǒng)的程序只能用Java開發(fā)戏锹,這么說的說明對(duì)Android系統(tǒng)的架構(gòu)了解的還不是很深入,其實(shí)從圖上看到火诸,Google自己寫了一個(gè)叫Dalvik的程序運(yùn)行在Linux的系統(tǒng)上面锦针,這個(gè)程序就是Android的Java虛擬機(jī)(JVM),由于效率等問題Android4.4以后改為Android Run Time(ART)置蜀,但不管是Dalvik還是ART奈搜,都是用c/c++開發(fā)的,而用Java開發(fā)出來的APP其實(shí)是運(yùn)行在Dalvik/ART上面的盯荤,皮之不存毛將焉附馋吗,沒有Dalvik/ART,那些Java開發(fā)的APP是根本沒法運(yùn)行的廷雅,所以說那些說Android系統(tǒng)不能用c/c++開發(fā)的說法是站不住腳的耗美,只要用AOSP(安卓開放源碼項(xiàng)目)里面的交叉編譯器編譯出來的二進(jìn)制文件在Android上面照樣也是可以運(yùn)行的京髓,而且跟Dalvik/ART屬于同一層次的東西,即(都是init進(jìn)程的子進(jìn)程)商架,但是一般的Android系統(tǒng)上init進(jìn)程只有一個(gè)子進(jìn)程即Dalvik/ART堰怨,如果非要說Dalvik/ART才算Android的話,那么Android確實(shí)不能用c/c++開發(fā)蛇摸,因?yàn)镴ava程序編譯出來的是字節(jié)碼备图,只能在Dalvik/ART上運(yùn)行,c/c++編譯出來的是二進(jìn)制機(jī)器碼直接在CPU中運(yùn)行赶袄,應(yīng)該說c/c++開發(fā)(這里不是說的JNI方式)Android程序無法調(diào)用Android的Java類庫這樣才是正確的揽涮。
再看看Linux發(fā)行版的做法,Linux發(fā)行版一般是在Linux的基礎(chǔ)上開發(fā)了一套桌面管理系統(tǒng)饿肺,比如基于GTK框架的gnome蒋困,比如基于Qt框架的LXQT。跟Windows一樣敬辣,經(jīng)典的一個(gè)桌面系統(tǒng)+N個(gè)軟件的模式雪标,用c/c++開發(fā)出來程序編譯成二進(jìn)制的機(jī)器碼直接運(yùn)行在Linux系統(tǒng)上,這些軟件全部都是跟Dalvik/ART一個(gè)層次的東西溉跃,而Linux發(fā)行版的程序能不能用Java開發(fā)呢村刨?這個(gè)問題就跟問Windows上能不能用Java開發(fā)一樣沒水準(zhǔn)。畢竟Dalvik/ART本身也是運(yùn)行在Linux系統(tǒng)上的撰茎,你只要把Dalvik/ART移植到Linux發(fā)行版甚至Windows上嵌牺,你手機(jī)里的那些APP就可以運(yùn)行了(當(dāng)然是不依賴硬件的,如果要打電話肯定是不行了)龄糊,不然你以為Android模擬器是怎么弄的逆粹。
總結(jié)起來,Android系統(tǒng)和Linux發(fā)行版的系統(tǒng)根本區(qū)別是Android上面只跑了一個(gè)Dalvik/ART绎签,而Linux發(fā)行版上面跑了很多“Dalvik/ART”而已枯饿。如果你把gnome或者LXQT部署到Android上,或者把Dalvik/ART部署到Linux發(fā)行版上的話诡必,那么二者的區(qū)別可能并沒你想象的那么大奢方。
其實(shí),在Linux上面跑一個(gè)軟件(虛擬機(jī)爸舒、解釋器)蟋字,然后再基于這個(gè)軟件做二次開發(fā)的的做法Google的Android并不是第一個(gè)這么干的。工控行業(yè)的小伙伴對(duì)控制器應(yīng)該很熟悉吧扭勉?什么鹊奖,你不知道控制器?或者說PLC更親切吧涂炎,PLC(可編程控制器)只是一種通用的控制器而已忠聚,PLC分為兩種设哗,一種是編譯型的PLC,我們?cè)趯W(xué)校里學(xué)習(xí)的什么歐姆龍两蟀,三菱网梢,西門子S300都是這種PLC,這種PLC的軟件架構(gòu)很簡單赂毯,就是一個(gè)單片機(jī)战虏,然后我們畫的梯形圖跟我們編譯單片機(jī)程序一樣直接被編譯成了機(jī)器碼,然后燒寫到單片機(jī)里面執(zhí)行党涕,這種PLC是沒有辦法監(jiān)控運(yùn)行的烦感,不過我要說的是另外一種PLC,曾經(jīng)機(jī)緣巧合接觸過一段時(shí)間膛堤,那就是軟PLC手趣,最常用的軟PLC就是codesys,codesys可不止是一個(gè)簡單的PLC編譯工具骑祟!它是一個(gè)軟PLC核回懦!為什么說他跟Android的做法十分相似呢?看看它的架構(gòu)就知道了次企,codesys通常被部署在Linux系統(tǒng)上面,開機(jī)即運(yùn)行潜圃,然后我們的梯形圖程序被codesys編譯工具轉(zhuǎn)成梯形圖指令保存到內(nèi)存中缸棵,然后codesys內(nèi)核逐句解析梯形圖指令,邊解析邊執(zhí)行谭期,而不是像傳統(tǒng)的編譯型的PLC一樣先把所有程序編譯成機(jī)器碼再燒寫到flash中堵第,運(yùn)行的時(shí)候再搬到內(nèi)存里面運(yùn)行,這跟JVM執(zhí)行字節(jié)碼如出一轍隧出,這種PLC可以很方便的實(shí)現(xiàn)監(jiān)控運(yùn)行踏志。