最近公司要整內(nèi)部培訓(xùn),,分配給我寫個(gè)培訓(xùn)文檔,,這里記錄如下:
撰寫不易,轉(zhuǎn)載請(qǐng)注明出處:http://blog.csdn.net/jscese/article/details/40897277#t17
導(dǎo)讀:關(guān)于的android目錄分析,網(wǎng)上有很多資料,,在此不做全面介紹. 本文只簡(jiǎn)單介紹Android中我常涉及的到的一些目錄與文件,文中都屬個(gè)人觀點(diǎn),,僅供參考~以google官方Android4.2.2源碼為例. 各個(gè)廠商平臺(tái)可能會(huì)有出入. 以android源碼目錄為“/”根目錄.
——jscese 2014/11/3
/bootable這個(gè)目錄下存放android部分啟動(dòng)相關(guān)代碼,包括android的recovery模式,,一般用于進(jìn)行OTA升級(jí),,由C++編寫,可以看到用于顯示的ui.cpp和安裝的install.cpp,模式入口為recovery.cpp的main.
/build這是android源碼中編譯核心所在地,,把這個(gè)目錄下的所有mk搞清楚,,android的編譯體系就基本了如指掌了.
./envsetup.sh編譯初始化shell腳本,編譯配置命令lunch.m.mm.mmm等發(fā)源地,,所以android在 編譯的初始階段需要source*,,其最終目的都會(huì)執(zhí)行到這個(gè)腳本,,把這個(gè)腳本中的變量以及函數(shù)設(shè)置到當(dāng)前終端的臨時(shí)變量中,供后續(xù)使用. 由此腳本中的lunch選取product_name引入到core中的mk等一系列的初始配置,,最后會(huì)打印出TARGET變量等.供源碼中編譯使用,! 這里詳情可參考Android——編譯系統(tǒng)初始化設(shè)置
./core/main.mkMake-j*時(shí)的makefile入口文件,會(huì)對(duì)編譯體系中的變量進(jìn)行一些校對(duì),,編譯類型之類的,,并且加載整個(gè)源碼下的Android.mk文件,整體的編譯框架,,終極目標(biāo).PHONY:droid ./core/Makefile由上面的main.mk引入,,算作android真正的主makefile,由它再依賴到各個(gè)子編譯體系.
./core/base_rules.mkandroid整體編譯時(shí),,會(huì)加載根目錄下所有的Android.mk文件,,并且根據(jù)文件中的MODULE依次分析相關(guān)屬性,生成編譯規(guī)則,,其中不同的MODULE類型就需要在Android.mk中include$(**)加載對(duì)應(yīng)mk,,分別對(duì)應(yīng)core目錄下的mk. 比如編譯apk的Android.mk需要末尾include$(BUILD_PACKAGE),此時(shí)解析到這里的時(shí)候就會(huì)加載core下的package.mk,其中會(huì)加載進(jìn)Java.mk在這里會(huì)加載到base_rules.mk中計(jì)算一些變量值,,創(chuàng)建一些基本的依賴規(guī)則,,再又java.mk中調(diào)用函數(shù)$(transform-**)編譯,類似: $(transform-java-to-classes.jar)把java文件編譯成classes.jar 其它模塊類型類似.
./core/definitions.mk這個(gè)文件下都是一些編譯的函數(shù)宏定義,,比如上面調(diào)用transform-java-to-classes.jar 以及常常出現(xiàn)在Android.mk中的all-java-files-under等等...都可在這里找到具體實(shí)現(xiàn),!
./target/product/security這個(gè)文件下面存放的就是當(dāng)前編譯系統(tǒng)使用的簽名密鑰對(duì),用于系統(tǒng)不同組件在編譯的時(shí)候進(jìn)行數(shù)字簽名,,android原生默認(rèn)使用testkey,,這目錄下有README以及密鑰對(duì)制作腳本make_key,可以用來制作屬于自己的簽名密鑰,,使整個(gè)系統(tǒng)簽名獨(dú)一無二,,更具安全性!關(guān)于android的簽名機(jī)制,,詳情可參考Android——編譯release版簽名系統(tǒng)
./tools/releasetoolsBuild的tools目錄,,全是一些用于編譯的工具腳本和可執(zhí)行工具,其中releasetools下是用于編譯制作androidOTA刷機(jī)包時(shí)的Python腳本集合,,由上面說到的主Makefile中調(diào)用進(jìn)ota_from_target_files中的defmain(argv):
/ctsgoogle提供的CompatibilityTest Suite (CTS) 兼容性測(cè)試組,,用于測(cè)試android系統(tǒng)的兼容性以及穩(wěn)定性,發(fā)測(cè)試report給google過了這個(gè)認(rèn)證,,算是得到google的認(rèn)可的.一般的android源碼都是有這個(gè)組件源碼的,,但是不在主編譯流程中,需要使用makects編譯出android-cts目錄供使用,,也可去http://source./compatibility/downloads.html下載對(duì)應(yīng)版本最新的組件.作為一個(gè)android產(chǎn)品,,這個(gè)測(cè)試還是很有意義的,,據(jù)傳不懂CTS就不算一個(gè)合格的android開發(fā)人員~
./tests/tests存放CTS測(cè)試用例的地方,全是androidapk,,添加自己的測(cè)試用例也在此.
./CtsTestCaseList.mk這是cts模塊組件的編譯選項(xiàng)配置mk,,由上面說到的build中的cts.mk調(diào)用,對(duì)于自己添加的測(cè)試用例需要添加進(jìn)這里面的cts_test_packages變量中.
./tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java可以這里看CTS_BUILD_VERSION確定你當(dāng)前源碼中的cts版本.
./tools/tradefed-host/READMEgoogle提供的readme,,有介紹如何配置cts環(huán)境以及使用的常用命令
/device這個(gè)作為android源碼中對(duì)產(chǎn)品的描述文件夾,,各個(gè)平臺(tái)的差異還是比較大的,但是怎么改動(dòng),,本意是不變的,,只是作為要編譯的產(chǎn)品的配置文件夾,這里簡(jiǎn)單以google源碼中存放的samsung為例.
./samsung/tuna/AndroidProducts.mk一般的存放規(guī)則是/device/廠商目錄/產(chǎn)品目錄,,這個(gè)mk里面一般是定義當(dāng)前產(chǎn)品的主配子mk,對(duì)于這個(gè)AndroidProducts.mk什么時(shí)候被加載,具體可去看android編譯初始化階段,,lunch選取產(chǎn)品之后的一系列mk初始化操作.
./samsung/tuna/BoardConfig.mk這個(gè)配置文件,,看名字就知道了,定義的都是跟硬件配置相關(guān)的.這個(gè)mk依賴級(jí)別在產(chǎn)品角度算是最高的了,,如果想添加一些控制宏,,可以考慮加在這里.
./samsung/tuna/device.mk這里配置最多的就是產(chǎn)品編譯需要的組件了,一般配置最多的PRODUCT_COPY_FILES以及PRODUCT_PACKAGES,,這兩個(gè)變量在編譯體系中的作用不多做介紹~ Android——編譯體系中的【PRODUCT_COPY_FILES】【ALL_PREBUILT】【BUILD_PREBUILT】 ./samsung/tuna/recovery.fstab熟悉Linux的對(duì)這個(gè)fstab應(yīng)該比較熟悉了,,這里配置的就是recovery模式下的分區(qū),會(huì)用于制作OTA刷機(jī)包時(shí)對(duì)分區(qū)的配置參數(shù).
vendorsetup.sh一般會(huì)將產(chǎn)品的編譯信息存在這個(gè)文件中,,類似add_lunch_combofull_maguro-userdebug 在編譯初始階段由lunch加載供編譯者選擇,,這其中full代表整體編譯,maguro代表產(chǎn)品名,,userdebug代表編譯類型,,android的產(chǎn)品編譯類型可另行參考,不多做介紹~ 可參考上面的Android——編譯安裝Module的控制因素
/external這是android存放外部工具組件的地方,,以文件夾為單一模塊,,最終編譯出來的有可執(zhí)行文件,jar包,,動(dòng)靜態(tài)庫,,東西比較混雜,google已經(jīng)移植了很多工具在這里面,,如果自己想移植一些模塊進(jìn)android系統(tǒng),,可以加在這里,寫好Android.mk,,在上面提到的device.mk中加入PRODUCT_PACKAGES變量中. 像這種移植可參考:Android——4.2 - 3G移植之路之usb-modeswitch (二)
/frameworksandroid的運(yùn)行框架集合,,包含系統(tǒng)運(yùn)行的各種服務(wù)框架,,向app層提供api,根據(jù)JNI機(jī)制或者socket往下層調(diào)用,,也可使用hw_get_module調(diào)用到hardware層的module.
./base/core字面意思,,核心所在,包含java以及jni,,核心組件的java類以及native方法的jni映射,,其中內(nèi)容太多,比如java中app相關(guān)的ActivityManager.java,啟動(dòng)相關(guān)的ZygoteInit.java,,其中的jni目錄會(huì)被編譯成libandroid_runtime.so作為android運(yùn)行時(shí)的動(dòng)態(tài)庫供相關(guān)的java加載.
./base/services框架層中的系統(tǒng)服務(wù)存放目錄,,包含系統(tǒng)時(shí)間服務(wù)以及輸入子系統(tǒng)服務(wù),同上java目錄下就是服務(wù)的java類了,,可以看到各種子服務(wù)模塊,,比如pm,net,,display,,如果想具體了解當(dāng)前系統(tǒng)啟動(dòng)了多少服務(wù),可以參考SystemServer.java
./opt/telephonyandroid電話子系統(tǒng)存放目錄,,向上提供api接口,,向下通過RIL.javasocket通信.
/hardware硬件抽象層,描述對(duì)linuxkernel中的相關(guān)驅(qū)動(dòng)模塊的具體操作,,而在kernel中的驅(qū)動(dòng)模塊只擁有通用操作接口,,比如設(shè)置寄存器值,IO拉高拉低,,但是具體設(shè)置什么值,,拉高拉低的時(shí)序都寫在hardware層相對(duì)應(yīng)的module中,這就是google對(duì)于硬件驅(qū)動(dòng)的商業(yè)保護(hù). ./libhardware/hardware.chardware機(jī)制核心所在,,定義了相關(guān)規(guī)則,,比如load打開modules編譯生成的.so,抽象成一個(gè)module,,向上層提供hw_get_module接口以及module配置宏.
./libhardware/modules這里就是與kernel相對(duì)應(yīng)的module存放的地方,,頭文件存在同級(jí)目錄的include中,在其中定義module結(jié)構(gòu),,接口方法以及唯一的moduleID. 其中像gralloc就是控制kernel中顯示屏驅(qū)動(dòng)的module,,用于管理控制fb緩沖區(qū),將來自上層display的SurfaceFlinger服務(wù)傳下來的圖像推送到lcd/led顯示屏上.其它類似.
./rilandroid電話系統(tǒng)的ril驅(qū)動(dòng)文件目錄,,其中包含: rild— ril主體控制機(jī)制,, libril— ril與上層socket通信, reference-ril— ril與serial設(shè)備AT指令通信 這三個(gè)文件夾,,其中reference-ril是第三方驅(qū)動(dòng),,根據(jù)不同的設(shè)備選擇不同. 關(guān)于android的RIL機(jī)制不多做介紹~
/systemandroid系統(tǒng)底層的文件系統(tǒng),,應(yīng)用組件,包含一些系統(tǒng)庫,,以及啟動(dòng)的配置文件.
./core/init/init.c作為系統(tǒng)啟動(dòng)到android層的第一個(gè)進(jìn)程,,也將一直作為守護(hù)進(jìn)程,解析init.rc配置文件,, 啟動(dòng)相關(guān)服務(wù),其中就有比較常用的屬性服務(wù),,之后一直運(yùn)行于init進(jìn)程中,具體可參考property_service.c,,android層系統(tǒng)啟動(dòng)從這里開始,詳情另行參考~
./core/rootdir存放配置文件,,其中init.rc作為啟動(dòng)配置,ueventd.rc作為linux文件系統(tǒng)中文件事件配置,,還包含磁盤掛載所需要的vold.fstab配置文件等...
./core/include/private/android_filesystem_config.h這個(gè)頭文件定義了,,android文件系統(tǒng)中文件的權(quán)限配置.
./voldandroid舍棄了linux的udev機(jī)制,自己弄了一套磁盤掛載管理機(jī)制,,就是vold,,作為系統(tǒng)服務(wù)在init.rc配置啟動(dòng),用于磁盤的掛載等相關(guān)操作,,通過netlinksocket接收來自kernel的uevent,,與上層MountService通過一個(gè)名為vold的socket通信,,入口為main.cpp中的main函數(shù),,vold機(jī)制詳情另行參考~ 關(guān)于Vold機(jī)制可參考我之前的專欄:Android— 4.2 Vold
/out作為android源碼編譯結(jié)果存放目錄,其中包含各種中間文件以及目標(biāo)文件.像obj中存放的中間件以及hostlinux-x86存放的本地編譯項(xiàng).
./target/product/product_name/system.imgandroid系統(tǒng)編譯出來的鏡像文件,,也是整個(gè)源碼的最終目標(biāo)文件.
./target/product/product_name/system編譯之后的系統(tǒng)文件夾,,也是system.img的主要構(gòu)成,其中app目錄下都是apk文件,,android中規(guī)定此目錄下的apk作為系統(tǒng)內(nèi)置應(yīng)用,,在文件系統(tǒng)中擁有系統(tǒng)權(quán)限,普通用戶沒有權(quán)限刪除更改,,詳情可參考PackageManager.其中的bin代表可執(zhí)行文件,,etc下存放的都是系統(tǒng)配置文件,lib中都是些動(dòng)態(tài)庫,,分別對(duì)應(yīng)到文件系統(tǒng)中.
./target/product/product_name/system/build.prop這個(gè)文件中收集了編譯中的所有屬性,,包括編譯的主機(jī)環(huán)境,編譯目標(biāo)的各種配置信息等等...生成過程可參考主Makefile,在初始化階段會(huì)被property_service服務(wù)加載,,作為系統(tǒng)屬性.
./target/product/product_name/data/此目錄作為user的data存儲(chǔ)目錄,,對(duì)應(yīng)文件系統(tǒng)中的/data目錄,平時(shí)用戶安裝的apk就會(huì)被copy到這個(gè)該目錄的app目錄下,,android系統(tǒng)中apk所產(chǎn)生的數(shù)據(jù),,比如數(shù)據(jù)庫等都會(huì)存放在/data/data中,,以包名區(qū)分.
其中一般還有recovery,root等目錄,存放相對(duì)應(yīng)的產(chǎn)物,,不同平臺(tái)編譯出來的out目錄會(huì)有所出入.
|
|