Android Source Architecture
相信各位對于Android系統(tǒng)架構(gòu)圖的三層或四層結(jié)構(gòu)已經(jīng)了然于胸,迫不及待想要膜拜一下源碼酬蹋,但是可能好不容易下載好源碼打開一看就懵逼了:這目錄是啥及老?這又是啥抽莱?其實Android源碼目錄名字已經(jīng)很淺顯地表明了目錄的內(nèi)容和功能,但對于初學(xué)者特別是背景知識不夠?qū)捄甑某鯇W(xué)者而言還是有點摸不著頭腦骄恶。本文簡單介紹Android系統(tǒng)源碼目錄結(jié)構(gòu)食铐,好讓讀者對Android源碼有一個整體的概念,這樣當(dāng)深入到某一模塊研究的時候能夠同時心中有全局僧鲁。
首先要了解一個理念:Android源碼以什么樣的原則來分包和存放虐呻。從目錄看,Android很自然地將源碼分為Core寞秃、External和Package三種斟叼,其中Core是核心工程,在根目錄的各個文件夾中春寿,External是擴展工程朗涩,使用其他開源項目擴展的功能,在external文件夾中堂淡,Package是提供應(yīng)用程序和服務(wù)的馋缅,在package中,平時用到的各種系統(tǒng)應(yīng)用就是在這里面寫就的绢淀。
以下按層次結(jié)構(gòu)依次標(biāo)注目錄功能(源碼版本:android_4.4.1-r1):
.├── abi application binary interface萤悴,應(yīng)用程序二進制接口├── art art虛擬機├── bionic [Build] bionic C運行時支持:libc、libm皆的、libdl覆履、動態(tài)linker├── bootable 啟動引導(dǎo)相關(guān)代碼├── build [Build]存放系統(tǒng)編譯規(guī)則及generic等基礎(chǔ)開發(fā)配置├── cts Android兼容性測試套件標(biāo)準(zhǔn)├── dalvik dalvik虛擬機├── 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 核心庫相關(guān)├── libnativehelper 動態(tài)庫费薄,是實現(xiàn)JNI的基礎(chǔ)├── Makefile [Build]make的入口點硝全,其內(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ù)自己的需要可以對不同部分加以關(guān)注凳厢,我們主要關(guān)注packages和frameworks目錄。我們打開frameworks竞慢,發(fā)現(xiàn)它的目錄結(jié)構(gòu)如下:
./frameworks/├── av Audio/Video│ ├── camera 相機│ ├── CleanSpec.mk 本模塊的清除步驟先紫,下同│ ├── cmds command目錄,包含錄屏和stagefright兩個子目錄│ ├── drm digital rights management相關(guān)│ ├── include 頭文件│ ├── libvideoeditor 視頻編輯器庫│ ├── media 媒體│ ├── MODULE_LICENSE_APACHE2 開源協(xié)議│ ├── NOTICE 聲明│ ├── services 服務(wù)筹煮,包含audioflinger遮精,camera和medialog│ └── tools 工具├── base 基礎(chǔ)定義,我們主要關(guān)注這個文件夾下的內(nèi)容│ ├── Android.mk 本模塊的編譯步驟败潦,下同│ ├── api 當(dāng)前api定義本冲,如果api有變化這個文件會相應(yīng)更新│ ├── CleanSpec.mk│ ├── cmds│ ├── core framework核心代碼准脂,實現(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)保護│ ├── 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)容不再一一介紹闷板,用到的時候再去詳解也不遲│ ├── 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ù)雜的澎灸,源碼研究是一項艱苦而持久的任務(wù)。世上無難事只怕有心人遮晚,下面我們看點輕松的好理解的內(nèi)容:
./packages/├── apps 應(yīng)用程序庫├── experimental 實驗性的庫(打印服務(wù)性昭,bug匯報,通知县遣,RPC等)├── inputmethods 輸入法├── providers 四大組建之一Provider的系統(tǒng)自帶模塊├── screensavers 屏保├── services 系統(tǒng)服務(wù)(電話服務(wù))└── wallpapers 壁紙
有了以上的準(zhǔn)備糜颠,閱讀起源碼來就心里有數(shù),想要找什么代碼也有了大致的搜索范圍萧求。
下面特別指出一些庫的位置其兴,有興趣的可自行閱讀:
系統(tǒng)C庫 bionic
媒體庫 frameworks/av/media
圖形顯示庫 frameworks/native/services/surfaceflinger
網(wǎng)絡(luò)引擎庫 external/webp, external/webrtc
3D圖形庫 frameworks/native/opengl
SQLite Java layer framworks/base/core/java/android/database, C++ layer external/sqlite
更詳細的目錄知識參見Android源碼目錄結(jié)構(gòu)
?