Android = Linux Kernel + C/C++ Runtime Framework + Davik Virtual Machine + Java Runtime Framework + Java SDK。下面我們再以APK的開發(fā)、編譯、安裝和運(yùn)行來說明這些層次之間的關(guān)系。
首先,我們是在PC上使用Android SDK提供的接口來開發(fā)APK,用的Java語言。開發(fā)完成之后,使用Java編譯器將源代碼編譯成Java字節(jié)碼,也就是帶.class后綴的文件。接下來這些.class再被Android SDK提供的dx工具轉(zhuǎn)化成Dex字節(jié)碼,最后打包在APK里面的classes.dex文件中。
接著,APK文件在手機(jī)上安裝時,Java Runtime Framework里面的PacakgeManagerService就會對該APK文件進(jìn)行解析,并且通過Socket IPC通知C/C++ Runtime Framework里面的installd守護(hù)進(jìn)程對APK里面的classes.dex文件進(jìn)行優(yōu)化,得到另外一個classes.odex文件。
APK安裝完成之后,就可以運(yùn)行了。我們以APK從桌面Launcher啟動的過程為例說明它的運(yùn)行過程。當(dāng)我們從Launcher點(diǎn)擊應(yīng)用圖標(biāo)的時候,Launcher向Java Runtime Framework里面的ActivityManagerService發(fā)送一個啟動應(yīng)用的請求。ActivityManagerService又通過Socket IPC向C/C++ Runtime Framework里面的zygote守護(hù)進(jìn)程請求創(chuàng)建一個應(yīng)用程序進(jìn)程。這個應(yīng)用程序進(jìn)程包含有一個Dalvik虛擬機(jī)。應(yīng)用程序進(jìn)程創(chuàng)建并且啟動起來之后,就會通過它里面的Dalvik虛擬機(jī)加載前面提到的classes.odex文件。這樣我們的應(yīng)用程序就運(yùn)行起來了。
APK的運(yùn)行過程是依賴于Dalvik虛擬機(jī)的。我們可以將它看成是將classes.odex里面的字節(jié)碼解釋成本地機(jī)器指令執(zhí)行。例如,我們在APK里面通過FileInputStream或者FileOutputStream打開一個文件的時候,Dalvik虛擬機(jī)就會找到C/C++ Runtime Framework里面的C庫bionic提供的系統(tǒng)接口open,并且通過它來打開指定的文件。
我們再以應(yīng)用程序界面的繪制和渲染過程來詳細(xì)說明各個層次的關(guān)系。首先是應(yīng)用程序通過SDK提供的UI類向Java Runtime Framework里面的WindowManagerService申請分配一塊圖形緩沖區(qū)。WindowManagerService又是通過Binder IPC向C/C++ Runtime Framework里面的SurfaceFlinger申請分配圖形緩沖區(qū)的。圖形緩沖區(qū)實(shí)際上不是由SurfaceFlinger分配的,而是由顯示系統(tǒng)分配的,可能在顯存里面,也有可能在GPU里面。這時候SurfaceFlinger就要通過HAL層次Gralloc模塊向Kernel里面的顯卡或者GPU驅(qū)動申請分配真正的圖形緩沖區(qū)。HAL層可以看作是運(yùn)行在C/C++ Runtime Framework中。
應(yīng)用程序得通過上述方式得到繪制UI所需要的圖形緩沖區(qū)之后,就開始繪制自己的UI了。假設(shè)應(yīng)用程序使用的是硬件繪制方式,也就是通過C/C++ Runtime Framework里面的OpenGL來繪制。這時候SDK的UI類的與繪制相關(guān)的函數(shù)調(diào)用通過Dalvik虛擬機(jī)都轉(zhuǎn)化成了C/C++ Runtime Framework里面的OpenGL操作。
應(yīng)用程序UI繪制完成之后,結(jié)果就保存上述的圖形緩沖區(qū)中。這時候如果要將該圖形緩沖區(qū)渲染到手機(jī)屏幕上,那么還需要通過Binder IPC將該圖形緩沖區(qū)發(fā)送給C/C++ Runtime Framework里面的SurfaceFlinger。SurfaceFlinger通過使用OpenGL或者HWComposer將所有請求要渲染到手機(jī)屏幕上的圖形緩沖區(qū)合成之后,得到一個主圖形緩沖區(qū)。最后這個圖形緩沖區(qū)又會被SurfaceFlinger提交給Kernel的顯卡驅(qū)動,并且在手機(jī)屏幕上進(jìn)行顯示。
上面描述的就是Android系統(tǒng)各個層次的調(diào)用關(guān)系。總的來說,應(yīng)用程序運(yùn)行在Dalvik虛擬機(jī)上,并且通過SDK使用Java Runtime Framework里面的服務(wù),而Java Runtime Framework里面的服務(wù)又通過C/C++ Runtime Framework里面的服務(wù)來實(shí)現(xiàn)自己的功能,最后C/C++ Runtime Framework里面的服務(wù)又會在需要的時候請求Kernel里面的模塊或者驅(qū)動來為自己服務(wù)。
聯(lián)系客服