天天看點

簡訴android源代碼編譯過程,Android源碼編譯過程及原理(二)

在未來等風也等你

本節主要記錄的内容anroid 編譯系統的結構

編譯中樞中main.mk的基本解析

除非特别說明本節中的目錄都是基于android的源碼目錄

1. android 編譯系統的結構

android的編譯系統可以分為三部分:build/core: 在這個目錄中包含了大量的.mk檔案

子項目:每個子項目都包含自己的Android.mk,在編譯時會被包含進去,而如何編譯子項目是由Andorid.mk檔案所決定的3

out/:編譯結果輸出到該目錄下,編譯的結果可以是jar包,apk,也可以是二進制的檔案等

在Android系統主要就是根據.mk檔案進行編譯的。

他們之間的關系如下:

簡訴android源代碼編譯過程,Android源碼編譯過程及原理(二)

編譯關系

基本的流程是:在我們編譯系統時輸入make後會預設搜尋目前目錄下的Makefile檔案,它的内容如下:### DO NOT EDIT THIS FILE ###include build/core/main.mk### DO NOT EDIT THIS FILE ###

可見它僅僅是包含了一個main.mk檔案,說明了main.mk将會是系統編譯的重要所在。在系統編譯的時候将會包含很多的子項目,對于如何編譯子項目是由子項目的Android.mk檔案決定的

在編譯執行完成之後,編譯結果大部分将會存儲在out/target/..下

2. 編譯中樞中main.mk的基本解析決定使用shell的種類(編譯腳本運用的是shell文法,不同的shell,文法會有差異)SHELL := $(ANDROID_BUILD_SHELL)elseSHELL := /bin/bashend定義預設的target名,也就是下面所定義的droid.

.PHONY: droid

DEFAULT_GOAL := droid

$(DEFAULT_GOAL): droid_targets包含了config.mk,這個檔案主要進行了一系列的系統配置,在後面會詳細講解該檔案

設定編譯時所使用的java的版本,在Linux必須使用OpenJDK在Mac OS上使用Oracle JDK

包含了definitions.mk,該檔案定義了許多在編譯時用到的函數# Bring in standard build system definitions.include $(BUILD_SYSTEM)/definitions.mk包含了dex_preopt.mk,在Dalvik中執行的是dex檔案,不同的cpu會略有不同,為了提高Dalvik的執行效率,可以将dex檔案進行優化。而這個檔案可以配置一些和dex優化相關的選項# Bring in dex_preopt.mkinclude $(BUILD_SYSTEM)/dex_preopt.mk檢查産品的類型,如果不是user,userdebug,eng系統将會報錯ifneq ($(filter user userdebug eng,$(MAKECMDGOALS)),)

$(info ***************************************************************)

$(info ***************************************************************)

$(info Do not pass '$(filter user userdebug eng,$(MAKECMDGOALS))' on \

the make command line.)

$(info Set TARGET_BUILD_VARIANT in buildspec.mk, or use lunch or)

$(info choosecombo.)

$(info ***************************************************************)

$(info ***************************************************************)

$(error stopping)

endif檢查PDK中java支援的級别,PDK是google提前提供給裝置開發廠商OEM和晶片廠商的将要釋出的最新版的Android,使得這些廠商能夠快速更新自己的裝置和晶片。存在三個值,"not defined": 不支援, "sdk":僅支援SDK的API,"platform":支援 platform API

TARGET_BUILD_JAVA_SUPPORT_LEVEL := platform包含使用者所選擇的product下的所有子項目的Android.mk檔案subdir_makefiles := \

$(shell build/tools/findleaves.py $(FIND_LEAVES_EXCLUDES) $(subdirs) Android.mk)

在這裡使用到了腳本檔案findleaves.py,有興趣的大神可以研究研究。根據系統的設定進行全編譯和SDK編譯。主要由FULL_BUILD和is_sdk_build編譯

包含了Makefile(build/core/),該檔案定義了編譯過程中所需要的各種臨時目标對象

定義了一些通用的target也就是無論是哪一個product都會有的

例如:ramdisk:生成ramdisk.imgsystemtarball:生成systemtarball.imgboottarball:生成boot.imguserdatatarball:生成userdata.img

作者:狗錢偷生

連結:https://www.jianshu.com/p/5ad125c62af3