Android Source Architecture
相信各位對(duì)于Android系統(tǒng)架構(gòu)圖的三層或四層結(jié)構(gòu)已經(jīng)了然于胸,迫不及待想要膜拜一下源碼,但是可能好不容易下載好源碼打開一看就懵逼了:這目錄是啥?這又是啥?其實(shí)Android源碼目錄名字已經(jīng)很淺顯地表明了目錄的內(nèi)容和功能,但對(duì)于初學(xué)者特別是背景知識(shí)不夠?qū)捄甑某鯇W(xué)者而言還是有點(diǎn)摸不著頭腦。本文簡(jiǎn)單介紹Android系統(tǒng)源碼目錄結(jié)構(gòu),好讓讀者對(duì)Android源碼有一個(gè)整體的概念,這樣當(dāng)深入到某一模塊研究的時(shí)候能夠同時(shí)心中有全局。
首先要了解一個(gè)理念:Android源碼以什么樣的原則來分包和存放。從目錄看,Android很自然地將源碼分為Core、External和Package三種,其中Core是核心工程,在根目錄的各個(gè)文件夾中,External是擴(kuò)展工程,使用其他開源項(xiàng)目擴(kuò)展的功能,在external文件夾中,Package是提供應(yīng)用程序和服務(wù)的,在package中,平時(shí)用到的各種系統(tǒng)應(yīng)用就是在這里面寫就的。
以下按層次結(jié)構(gòu)依次標(biāo)注目錄功能(源碼版本:android_4.4.1-r1):
.├── abi application binary interface,應(yīng)用程序二進(jìn)制接口├── art art虛擬機(jī)├── bionic [Build] bionic C運(yùn)行時(shí)支持:libc、libm、libdl、動(dòng)態(tài)linker├── bootable 啟動(dòng)引導(dǎo)相關(guān)代碼├── build [Build]存放系統(tǒng)編譯規(guī)則及generic等基礎(chǔ)開發(fā)配置├── cts Android兼容性測(cè)試套件標(biāo)準(zhǔn)├── dalvik dalvik虛擬機(jī)├── developers 開發(fā)者相關(guān)├── development 應(yīng)用程序開發(fā)相關(guān)├── device 設(shè)備相關(guān)代碼(廠商定制代碼就放在這里)├── docs 開源相關(guān)文檔├── external Android使用的開源模塊├── frameworks 核心框架,包含Java source和C++ source├── hardware 主要是硬件適配層HAL├── libcore 核心庫(kù)相關(guān)├── libnativehelper 動(dòng)態(tài)庫(kù),是實(shí)現(xiàn)JNI的基礎(chǔ)├── Makefile [Build]make的入口點(diǎn),其內(nèi)容只有一句話即include build/core/main.mk├── ndk ndk相關(guān)代碼├── out 編譯輸出文件夾,默認(rèn)編譯完成后的結(jié)果輸出到此目錄├── packages 應(yīng)用程序包├── pdk Plug Development Kit,本地開發(fā)套件├── prebuilts 預(yù)編譯的資源(例如Linux-Kernel,分為x86和arm架構(gòu))├── sdk sdk及模擬器相關(guān)代碼├── system 文件系統(tǒng)和應(yīng)用組件,c/c++代碼├── tools 工具文件夾,如gradle等作為開發(fā)者根據(jù)自己的需要可以對(duì)不同部分加以關(guān)注,我們主要關(guān)注packages和frameworks目錄。我們打開frameworks,發(fā)現(xiàn)它的目錄結(jié)構(gòu)如下:
./frameworks/├── av Audio/Video│ ├── camera 相機(jī)│ ├── CleanSpec.mk 本模塊的清除步驟,下同│ ├── cmds command目錄,包含錄屏和stagefright兩個(gè)子目錄│ ├── drm digital rights management相關(guān)│ ├── include 頭文件│ ├── libvideoeditor 視頻編輯器庫(kù)│ ├── media 媒體│ ├── MODULE_LICENSE_APACHE2 開源協(xié)議│ ├── NOTICE 聲明│ ├── services 服務(wù),包含audioflinger,camera和medialog│ └── tools 工具├── base 基礎(chǔ)定義,我們主要關(guān)注這個(gè)文件夾下的內(nèi)容│ ├── Android.mk 本模塊的編譯步驟,下同│ ├── api 當(dāng)前api定義,如果api有變化這個(gè)文件會(huì)相應(yīng)更新│ ├── CleanSpec.mk│ ├── cmds│ ├── core framework核心代碼,實(shí)現(xiàn)了幾乎所有底層功能,包含java和c/c++代碼,android.xx.xx/com.android.internal.xx/com.android.server的NetworkObserver代碼位于這里│ ├── data 數(shù)據(jù)文件夾,包含字體、鍵盤定義、聲音、視頻等數(shù)據(jù)│ ├── docs 文檔│ ├── drm 版權(quán)保護(hù)│ ├── graphics 圖形│ ├── include ...│ ├── keystore│ ├── libs│ ├── location│ ├── media│ ├── MODULE_LICENSE_APACHE2│ ├── native│ ├── nfc-extras│ ├── NOTICE│ ├── obex│ ├── opengl│ ├── packages│ ├── policy│ ├── preloaded-classes│ ├── samples│ ├── sax│ ├── services com.android.server的大部分代碼位于這里│ ├── telephony│ ├── test-runner│ ├── tests│ ├── tools│ └── wifi├── compile 下面的內(nèi)容不再一一介紹,用到的時(shí)候再去詳解也不遲│ ├── libbcc│ ├── mclinker│ └── slang├── ex│ ├── camera2│ ├── carousel│ ├── chips│ ├── CleanSpec.mk│ ├── common│ ├── photoviewer│ ├── variablespeed│ └── widget├── mff├── ml│ ├── Android.mk│ └── bordeaux├── native│ ├── build│ ├── cmds│ ├── data│ ├── include│ ├── libs│ ├── MODULE_LICENSE_APACHE2│ ├── NOTICE│ ├── opengl│ └── services├── opt│ ├── calendar│ ├── carddav│ ├── colorpicker│ ├── datetimepicker│ ├── emoji│ ├── inputmethodcommon│ ├── mailcommon│ ├── mms│ ├── net│ ├── photoviewer│ ├── telephony│ ├── timezonepicker│ └── vcard├── rs│ ├── Android.mk│ ├── CleanSpec.mk│ ├── cpp│ ├── cpu_ref│ ├── driver│ ├── java│ ├── rsAdapter.cpp│ ├── rsAdapter.h│ ├── rsAllocation.cpp│ ├── rsAllocation.h│ ├── rsAnimation.cpp│ ├── rsAnimation.h│ ├── rsCompatibilityLib.cpp│ ├── rsCompatibilityLib.h│ ├── rsComponent.cpp│ ├── rsComponent.h│ ├── rsContext.cpp│ ├── rsContext.h│ ├── rsCppUtils.cpp│ ├── rsCppUtils.h│ ├── rsDebugHelper.h│ ├── rsDefines.h│ ├── rsDevice.cpp│ ├── rsDevice.h│ ├── rsElement.cpp│ ├── rsElement.h│ ├── rsEnv.h│ ├── rsFBOCache.cpp│ ├── rsFBOCache.h│ ├── rsFifo.h│ ├── rsFifoSocket.cpp│ ├── rsFifoSocket.h│ ├── rsFileA3D.cpp│ ├── rsFileA3D.h│ ├── rsFont.cpp│ ├── rsFont.h│ ├── rsgApi.cpp.rsg│ ├── rsgApiFuncDecl.h.rsg│ ├── rsgApiReplay.cpp.rsg│ ├── rsgApiStructs.h.rsg│ ├── rsg_generator.c│ ├── rsGrallocConsumer.cpp│ ├── rsGrallocConsumer.h│ ├── rsg.spec│ ├── rs.h│ ├── rs_hal.h│ ├── rsMatrix2x2.cpp│ ├── rsMatrix2x2.h│ ├── rsMatrix3x3.cpp│ ├── rsMatrix3x3.h│ ├── rsMatrix4x4.cpp│ ├── rsMatrix4x4.h│ ├── rsMesh.cpp│ ├── rsMesh.h│ ├── rsMutex.cpp│ ├── rsMutex.h│ ├── rs_native.spec│ ├── rsObjectBase.cpp│ ├── rsObjectBase.h│ ├── rsPath.cpp│ ├── rsPath.h│ ├── rsProgramBase.h│ ├── rsProgram.cpp│ ├── rsProgramFragment.cpp│ ├── rsProgramFragment.h│ ├── rsProgram.h│ ├── rsProgramRaster.cpp│ ├── rsProgramRaster.h│ ├── rsProgramStore.cpp│ ├── rsProgramStore.h│ ├── rsProgramVertex.cpp│ ├── rsProgramVertex.h│ ├── rsRuntime.h│ ├── rsSampler.cpp│ ├── rsSampler.h│ ├── rsScriptC.cpp│ ├── rsScriptC.h│ ├── rsScriptC_Lib.cpp│ ├── rsScriptC_LibGL.cpp│ ├── rsScript.cpp│ ├── rsScriptGroup.cpp│ ├── rsScriptGroup.h│ ├── rsScript.h│ ├── rsScriptIntrinsic.cpp│ ├── rsScriptIntrinsic.h│ ├── rsSignal.cpp│ ├── rsSignal.h│ ├── rs.spec│ ├── rsStream.cpp│ ├── rsStream.h│ ├── rsThreadIO.cpp│ ├── rsThreadIO.h│ ├── rsType.cpp│ ├── rsType.h│ ├── rsUtils.h│ ├── scriptc│ ├── server│ ├── spec.h│ ├── spec.l│ └── tests├── support│ ├── build.gradle│ ├── CleanSpec.mk│ ├── local.properties│ ├── settings.gradle│ ├── tests│ ├── v13│ ├── v4│ ├── v7│ └── v8├── testing│ ├── Android.mk│ ├── androidtestlib│ ├── app-tests│ ├── MODULE_LICENSE_APACHE2│ ├── uiautomator│ └── uiautomator_test_libraries├── uiautomator│ ├── Android.mk│ ├── api│ ├── apicheck_msg_current.txt│ ├── apicheck_msg_last.txt│ ├── BuildConstants.java.in│ ├── cmds│ ├── MODULE_LICENSE_APACHE2│ ├── samples│ ├── src│ ├── tests│ └── utils├── volley│ ├── AndroidManifest.xml│ ├── Android.mk│ ├── build.gradle│ ├── build.xml│ ├── custom_rules.xml│ ├── proguard.cfg│ ├── proguard-project.txt│ ├── project.properties│ ├── src│ └── tests├── webview│ ├── Android.mk│ └── chromium└── wilhelm├── doc├── include├── src├── tests└── tools以上可以看出android系統(tǒng)的源碼是非常龐大而復(fù)雜的,源碼研究是一項(xiàng)艱苦而持久的任務(wù)。世上無難事只怕有心人,下面我們看點(diǎn)輕松的好理解的內(nèi)容:
./packages/├── apps 應(yīng)用程序庫(kù)├── experimental 實(shí)驗(yàn)性的庫(kù)(打印服務(wù),bug匯報(bào),通知,RPC等)├── inputmethods 輸入法├── providers 四大組建之一Provider的系統(tǒng)自帶模塊├── screensavers 屏保├── services 系統(tǒng)服務(wù)(電話服務(wù))└── wallpapers 壁紙有了以上的準(zhǔn)備,閱讀起源碼來就心里有數(shù),想要找什么代碼也有了大致的搜索范圍。
下面特別指出一些庫(kù)的位置,有興趣的可自行閱讀:
系統(tǒng)C庫(kù) bionic
媒體庫(kù) frameworks/av/media
圖形顯示庫(kù) frameworks/native/services/surfaceflinger
網(wǎng)絡(luò)引擎庫(kù) external/webp, external/webrtc
3D圖形庫(kù) frameworks/native/opengl
SQLite Java layer framworks/base/core/java/android/database, C++ layer external/sqlite
更詳細(xì)的目錄知識(shí)參見Android源碼目錄結(jié)構(gòu)
?