android HAL層:對Linux內(nèi)核驅動的封裝,Linux是開源的,如果把所有驅動實現(xiàn)都放在內(nèi)核中,需要公布硬件廠商的源碼。
運行在用戶空間
一. 在Android 內(nèi)核源代碼工程中編寫硬件驅動程序。
二. 在Android 系統(tǒng)中增加C 可執(zhí)行程序來訪問硬件驅動程序。
三. 在Android 硬件抽象層增加接口模塊訪問硬件驅動程序。
四. 在Android 系統(tǒng)中編寫JNI 方法在應用程序框架層提供Java 接口訪問硬件。
五. 在Android 系統(tǒng)的應用程序框架層增加硬件服務接口。
六. 在Android 系統(tǒng)中編寫APP 通過應用程序框架層訪問硬件服務。
croot : 切換到源碼根目錄
m:在源碼樹的跟目錄執(zhí)行make
mm:build當前目錄下的模塊
mmm:build指定目錄下的模塊
cgrep:在所有C/C++文件下執(zhí)行grep
jgrep:在所有java文件下執(zhí)行grep
resgrep:在所有res/*.xml下執(zhí)行grep
godir:轉到包含某個文件的目錄下
printconfig:顯示當前build的配置信息
add_lunch_combo:在lunch菜單增加條目
LOCAL_MODULE_TAGS:=user debug eng tests optional
user:該模塊只在user模式下編譯
debug:userdebug
eng:eng make的默認選項
tests:tests
optional:在所有版本都編譯,除了tests
HAL 頭文件路徑 :Pie\hardware\libhardware\include\hardware
HAL 實現(xiàn)路勁 : Pie\hardware\libhardware\modules
Android硬件抽象層規(guī)范的要求,分別定義模塊ID、模塊結構體以及硬件接口結構體。
https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
source build/envsetup.sh
m help
hmm 列舉可用指令
m 在源碼樹的根目錄執(zhí)行編譯
mm 編譯當前路徑下所有模塊,但不包含依賴
mmm [module_path] 編譯指定路徑下所有模塊,但不包含依賴
mma 編譯當前路徑下所有模塊,且包含依賴
mmma [module_path] 編譯指定路徑下所有模塊,且包含依賴
make [module_name] 無參數(shù),則表示編譯整個Android代碼
當需要重新編譯所有的相關模塊,則需要編譯命令后增加參數(shù)-B,比如make -B
模塊 make命令 mmm命令
init make init mmm system/core/init
zygote make app_process mmm frameworks/base/cmds/app_process
system_server make services mmm frameworks/base/services
java framework make framework mmm frameworks/base
frameworkres make framework-res mmm frameworks/base/core/res
jni framework make libandroid_runtime mmm frameworks/base/core/jni
binder make libbinder mmm frameworks/native/libs/binder
cgrep 所有C/C++文件執(zhí)行搜索操作
jgrep 所有Java文件執(zhí)行搜索操作
ggrep 所有Gradle文件執(zhí)行搜索操作
mangrep [keyword] 所有AndroidManifest.xml文件執(zhí)行搜索操作
mgrep [keyword] 所有Android.mk文件執(zhí)行搜索操作
sepgrep [keyword] 所有sepolicy文件執(zhí)行搜索操作
resgrep [keyword] 所有本地res/*.xml文件執(zhí)行搜索操作
sgrep [keyword] 所有資源文件執(zhí)行搜索操作
croot 切換至Android根目錄
cproj 切換至當前模塊的根目錄
godir [filename] 跳轉到包含某個文件的目錄
hmm 查詢所有的指令help信息
findmakefile 查詢當前目錄所在工程的Android.mk文件路徑
print_lunch_menu 查詢lunch可選的product
printconfig 查詢各項編譯變量值
gettop 查詢Android源碼的根目錄
gettargetarch 獲取TARGET_ARCH值
make clean 等價于 rm -rf out/
make update-api:更新API,在framework API改動后需執(zhí)行該指令,Api記錄在目錄frameworks/base/api;
build
系統(tǒng)核心make文件 build/core
產(chǎn)品make文件 device/
模塊make文件 Android.mk
out/host Android開發(fā)工具生成路徑,如SDK工具
out/target/common 針對設備的共通的編譯產(chǎn)物,包含java應用代碼和java庫
out/target/product/[product_name] 特定產(chǎn)品的編譯產(chǎn)物及平臺相關的C/C++代碼和二進制文件
在out/target/product/[product_name]目錄下,有幾個重量級的鏡像文件:
system.img:掛載為根分區(qū),主要包含Android OS的系統(tǒng)文件;庫,可執(zhí)行文件以及預置的應用程序
ramdisk.img:主要包含init.rc文件和配置文件等;用來掛載其他系統(tǒng)鏡像并啟動 init 進程。
userdata.img:被掛載在/data,主要包含用戶以及應用程序相關的數(shù)據(jù);
LOCAL_SRC_FILES:當前模塊包含的所有源碼文件;
LOCAL_MODULE:當前模塊的名稱(具有唯一性);
LOCAL_PACKAGE_NAME:當前APK應用的名稱(具有唯一性);
LOCAL_C_INCLUDES:C/C++所需的頭文件路徑;
LOCAL_STATIC_LIBRARIES:當前模塊在靜態(tài)鏈接時需要的庫名;
LOCAL_SHARED_LIBRARIES:當前模塊在運行時依賴的動態(tài)庫名;
LOCAL_STATIC_JAVA_LIBRARIES:當前模塊依賴的Java靜態(tài)庫;
LOCAL_JAVA_LIBRARIES:當前模塊依賴的Java共享庫;
LOCAL_CERTIFICATE:簽署當前應用的證書名稱,比如platform。
LOCAL_MODULE_TAGS:當前模塊所包含的標簽,可以包含多標簽,可能值為debug,eng,user,development或optional(默認值)
LOCAL_PROPRIETARY_MODULE
BOARD_VNDK_VERSION := current
echo 0 > /proc/sys/kernel/printk 關閉內(nèi)核打印
LOCAL_CFLAGS += -DXXX 相當于在所有源文件中增加一個宏定義#define
-O0不優(yōu)化,-O1低級優(yōu)化,-O2中級優(yōu)化,-O3高級優(yōu)化,-Os代碼空間優(yōu)化
-W[no-]<警告選項> no- 表示診斷時忽略這個警告
-Woption 讓編譯器給出option指定的編譯警告,常用的一些如下:
unused-function: 遇到僅聲明過但尚未定義的靜態(tài)函數(shù)時發(fā)出警告。
unused-parameter: 從未用過的函數(shù)參數(shù)的警告。
unused-variable: 在本地聲明但從未用過的變量的警告。
unused-value: 經(jīng)計算但從未用過的值得警告。
return-type: 對函數(shù)返回類型不當?shù)木妗?br>
uninitialized:在初始化之前就使用自動變量。
float-equal: 比較兩個浮點數(shù)是否相等。
-Wall 給出“幾乎”所有的編譯器警告,注意是“幾乎”。下面是一些-Wall沒有輸出的警告類型:
sign-compare:將有符號類型和無符號類型數(shù)據(jù)進行比較時發(fā)出警告。
unreachable-code:如果發(fā)現(xiàn)從未執(zhí)行的代碼時給出警告。
inline:如果某函數(shù)不能按要求內(nèi)嵌(inline),則無論是函數(shù)聲明為inline或者是指定了-finline-functions 選項,編譯都將發(fā)出警告。
-Werror 把所有的警告都視為錯誤處理。
-Wno-option 如果我們不想輸出某些警告信息,可以使用此參數(shù)形式,比如:LOCAL_CFLAGS := -Wno-unused-parameter
1,Add module B absolute path in "LOCAL_C_INCLUDES+=" of module A make file.
LOCAL_C_INCLUDES += \ /system//include
2,is the Module B is shared library then add below in module A make file.
LOCAL_LDFLAGS += $(call intermediates-dir-for,SHARED_LIBRARIES,B)/B.so
3,At last add additional dependency for module B in module A
LOCAL_ADDITIONAL_DEPENDENCIES := B