Android4.2.2源码目录结构分析
?撰寫不易,轉(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.mk
Make-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.mk
android整體編譯時(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/releasetools
Build的tools目錄,全是一些用于編譯的工具腳本和可執(zhí)行工具,其中releasetools下是用于編譯制作androidOTA刷機(jī)包時(shí)的python腳本集合,由上面說到的主Makefile中調(diào)用進(jìn)ota_from_target_files中的defmain(argv):
/cts
google提供的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.android.com/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/README
google提供的readme,有介紹如何配置cts環(huán)境以及使用的常用命令
關(guān)CTS 可參考我之前的博客:Android—— ubuntu下【CTS】測(cè)試TV真機(jī)
/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——編譯安裝Module的控制因素 ? ? ?
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 (二)
/frameworks
android的運(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/telephony
android電話子系統(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.c
hardware機(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顯示屏上.其它類似.
./ril
android電話系統(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ī)制不多做介紹~
可參考:Android——RIL 機(jī)制源碼分析
/system
android系統(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)從這里開始,詳情另行參考~
可參考:Android——啟動(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)限配置.
./vold
android舍棄了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.img
android系統(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)屬性.
可參考:Android——build.prop 解析
./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ì)有所出入.
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Android4.2.2源码目录结构分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android 5.0 SEAndroi
- 下一篇: 不同分辨率及其字母简称