Android源碼分析(一):android原生源碼編譯期間執行的流程

 

        最近在開發與修改過程當中一直是按着別人寫好的文檔去操做的,配置開發環境與編譯及部署應用都是知道怎麼去作,而不知道背後執行的過程是什麼,尤爲是原生android源碼還有MTK源碼及各大公司本身制定的源碼都有不少不同的地方,當咱們已經習慣敲幾個命令去執行編譯的時候,可能不多會去思考它背後的原理。固然,這自己並無什麼問題,由於說到底這些編譯腳本和命令,只是一堆工具。而對咱們目前工做真正有幫助的是熟練掌握這些工具的使用,而不是去了解它的原理。若是咱們只是作純粹的應用軟件,上述觀點已經足夠。可是若是咱們作系統級的開發,針對整個系統進行移植和開發,瞭解些Android的編譯系統方面的知識,仍是頗有幫助的。一下是本身經過看書和查找相關資料獲得的一些學習心得,經過博客之後方便本身查看。linux

一.Android系統概覽android

1. Android 源碼結構
 

 

 

Android框架那張圖片我之前看了不少遍,一直沒理解,最近深刻學習才慢慢理解一點點,這裏就貼圖了,因爲在公司電腦上有源碼,本身電腦沒有,圖片來自網上總體差很少,先看看android執行的流程.

 

Android源碼編譯流程關於編譯android源碼環境配置過程我就不說了,網上一堆,一開始我本身配了兩天,如今只要幾個小時就能夠了(熟悉了就好)。
         ×××好,如第一張圖,進入命令行在工程根目錄下執行 make 命令 (對於原生的來講,對於第三方公司不同)。在源碼下有一個 Makefile文件,執行make命令,等同於執行make Makefile 命令。Makefile文件的內容:
### DO NOT EDIT THIS FILE ###
include build/core/main.mk
### DO NOT EDIT THIS FILE ###
全部的流程控制都在mian.mk文件中,因此mian.mk是編譯的開始文件。
在build/core/main.mk裏主要完成如下內容:
1.初始化相關參數設置(buildspec.mk、envsetup.mk、config.mk)
2.檢測編譯環境和目標環境是否符合要求
3.決定目標product名稱
4.讀取product的配置信息及目標平臺信息
5.清除輸出目錄
6.檢查相關編譯工具版本號
7.讀取Board的配置
8.讀取全部Module的配置
9.根據配置產生必要的規則(build/core/Makefile)
10.生成p_w_picpath鏡像
 
Main.mk文件按照下面的次序包含個mk文件(建議簡單看一下文件中的內容)
1.       config.mk
2.       cleanbuild.mk
3.       version_checked.mk
4.       definitions.mk
config.mk文件按照下面的次序包含各個mk文件
1.       buildspec.mk
2.       envsetup.mk
3.       vendor/qcom-proprietary/common/build/define.mk
4.       boardconfig.mk
boardconfig.mk會在兩個目錄中尋找
1.       build/target/$targetdevice/boardconfig.mk
2.       vender/*/$ targetdevice/boardconfig.mk
envsetup.mk中包含下面的mk文件
1.       version_default.mk
 
下圖簡要介紹了Android build system的配置部分的主要構成及相互關係。
 

 

 

在build/core/main.mk文件中,簡單設置了幾個環境變量後,就引入了 config.mk文件。
include $(BUILD_SYSTEM)/config.mk該文件定義一些編譯模塊的生成規則,每個本地
模塊最後都會include其中的一種來生成目標模塊。命令變量實際上是對應的mk文件名,全部的 Android.mk文件裏基本上都包含上述命令變量,如: CLEAR_VARS:用來清除以前定義的環境變量, BUILD_SHARED_LIBRARY:用來指定編譯動態庫過程。
config.mk下面幾個重要的編譯命令:

 

 

        經過依次查找mk文件,執行其中編譯命令進行了整個源碼的編譯,編譯完成以後會在源碼目錄下生成一個out目錄(本身筆記本沒法上圖,後面會有的)。
           後面會繼續記錄各個mk文件的內容及含義,以及 Android.mk的理解.
           手寫博客內容真痛苦,最後上一個out目錄結構。
          Android 編譯完成後,將在根目錄中生成一個out 文件夾,全部生成的內容均放置在這個文件夾中。out 文件夾以下所示:
out/
|-- CaseCheck.txt
|-- casecheck.txt
|-- host
| |-- common
| `-- linux-x86
`-- target
|-- common
`-- product
主要的兩個目錄爲host 和target,前者表示在主機(x86)生成的工具,後者表示目標機(模認
爲ARMv5)運行的內容。
host 目錄的結構以下所示:
out/host/
|-- common
| `-- obj (JAVA 庫)
`-- linux-x86
|-- bin (二進制程序)
|-- framework (JAVA 庫,*.jar 文件)
|-- lib (共享庫*.so)
`-- obj (中間生成的目標文件)
host 目錄是一些在主機上用的工具,有一些是二進制程序,有一些是JAVA 的程序。
target 目錄的結構以下所示:
out/target/
|-- common
| |-- R (資源文件)
| |-- docs
| `-- obj (目標文件)
`-- product
`-- generic
其中common 目錄表示通用的內容,product 中則是針對產品的內容。
在common 目錄的obj 中,包含兩個重要的目錄:
APPS 中包含了JAVA 應用程序生成的目標,每一個應用程序對應其中一個子目錄,將結合每一個應
用程序的原始文件生成Android 應用程序的APK 包。
JAVA_LIBRARIES 中包含了JAVA 的庫,每一個庫對應其中一個子目錄。
在默認的狀況下,Android 編譯將生成generic 目錄,若是選定產品還能夠生成其餘的目錄。
generic 包含了如下內容:
out/target/product/generic/
|-- android-info.txt
|-- clean_steps.mk
|-- data
|-- obj
|-- ramdisk.img
|-- root
|-- symbols
|-- system
|-- system.img
|-- userdata-qemu.img
`-- userdata.img
在generic/obj/APPS 目錄中包含了各類JAVA 應用,與common/APPS 相對應,可是已經打成
了APK 包。
system 目錄是主要的文件系統,data 目錄是存放數據的文件系統。
obj/SHARED_LIBRARIES 中存放全部動態庫。
obj/STATIC_LIBRARIES 中存放全部靜態庫。
幾個以img 爲結尾的文件是幾個目標映像文件,其中ramdisk 是做爲內存盤的根文件系統映像,
system.img 是主要文件系統的映像,這是一個比較大的文件,data.img 是數據內容映像。這幾個
p_w_picpath 文件是運行時真正須要的文件。
相關文章
相關標籤/搜索