編譯android原始碼的make命令解析

2021-09-01 13:43:52 字數 2634 閱讀 2358

摘要:

本文描述了編譯android原始碼時,make命令後面隱藏的玄機,通過一步步的分析,你會發現,實際上不是想象的那麼複雜(肯定比編hello world複雜,哈)。

正文:1. make命令執行後,編譯的入口在**?

雖然我的最終目的是研究android原始碼之間的關係,但是,當我編完android原始碼後,這是我想到的第乙個問題。根據makefile的規則,make若不加引數會預設執行目錄下的makefile檔案,而這裡的makefile檔案include了main.mk檔案。同時,makefile會執行main.mk中的第一條規則。根據這個原則,你會發現main.mk中的第一條規則在main.mk的第45行,但是它什麼也不做,目的只是占個位置。

# this is the default target.  it must be the first declared target.

default_goal := droid

$(default_goal):

真正的定義在第681行,這裡的定義覆蓋了上面的定義。往下走一步是droidcore規則,它的定義為:

.phony: droidcore

droidcore: files /

systemimage /

$(installed_bootimage_target) /

$(installed_recoveryimage_target) /

$(installed_userdataimage_target) /

$(internal_default_docs_targets) /

$(installed_files_file)

這個規則顯然是我們想要的,但問題是其中的變數值是多少呢?要解決這個問題也很容易。make在解析makefile檔案時,大致流程如下:首先會解析makefile檔案,這一步主要是進行規則的展開工作,根據make後面的引數來解析出規則實際要執行的動作(action)。解析完整個檔案後,就開始執行指定的規則後面的動作了,此時,就只剩下乙個動作列表,挨個執行就可以了。根據這個原則,加上droidcore規則位於檔案的末尾,所以我們可以在檔案的最後輸出這些引數。這裡我們要用到makefile的函式info和error,info的作用是在第一遍解析時,輸出資訊,然後繼續解析,error則是輸出資訊後退出,具體可以參考make的文件。比如,這裡我們要檢視上面幾個變數的值,可以在main.mk的最後新增如下語句。最後一句用來標識main.mk已經解析完。

1: $(info installed_bootimage_target = $(installed_bootimage_target))

2: $(info installed_recoveryimage_target = $(installed_recoveryimage_target))

3: $(info installed_userdataimage_target = $(installed_userdataimage_target))

4: $(info internal_default_docs_targets = $(internal_default_docs_targets))

5: $(info installed_files_file = $(installed_files_file))

6: $(error >>>>>>> end of the main.mk)

上面幾個變數的值實際上是相對於android原始碼的相對目標檔案路徑,比如installed_bootimage_target為out/target/product/generic/ramdisk.img。這裡我們很容易猜到systemimage的值(out/target/product/generic/system.img)是什麼了。

到這裡,我們可以認為,像out/target/product/generic/ramdisk.img的值,實際上就是一條makefile確定的規則,無論這條規則是怎麼來的,使用make out/target/product/generic/ramdisk.img是可以編譯ramdisk.img檔案的,在後面我們可以看到,知道這一點很重要,android的build system就是靠這一點工作的,我認為是核心。

2. droidcore規則完全展開後是什麼樣子的?

有了上面的工作,這個問題就變的容易許多。我本來的目的是想要研究android源**之間的依賴關係,而這個依賴關係通過makefile中獲取,是最直觀和可靠的。要想獲得droidcore的所有動作列表也不難,make命令有個引數-n,它的目的是「只輸出規則下的動作(編譯命令)語句,而不執行規則」。比如,要想獲得droidcore的所有動作序列,可以使用如下命令:(輸出結果太長了,可以將它輸出到檔案) 

make -n

我將這個命令的結果輸出到檔案,由於等的時間太長,就放棄了,估計起碼有幾十兆,幾萬行命令。

也可以用如下命令來獲取編譯ramdisk.img所需要的命令序列:

make -n out/target/product/generic/ramdisk.img

編譯ramdisk.img命令大概有5600行。還是有點大,那該如何?這個輸出的最後一行你會發現,ramdisk.img是通過將目錄out/target/product/generic/root打包而成的。所以,你可以去研究這個包裡的每個檔案是怎麼編出來的。有了上面的例子,應該不難。

後面該怎麼樣進行下去,我還沒想好,先研究ramdisk.img下每個檔案是怎麼來的再說。

Debian編譯Android原始碼

筆記本 intel i3 ram 4g linux debian 8.1.0 amd64 xfce cd 1.iso android 4.2.2android官方推薦使用ubuntu編譯原始碼,但我試了ubuntu 12.04 ubuntu 14.04,結果都在安裝好所需檔案重啟電腦後,系統就出莫名...

ubuntu編譯android原始碼

1.首先為安裝ubuntu系統,大家可以參考以下鏈結 建議大家把 根目錄分70g以上 3.安裝編譯必備的工具 清華大學映象庫 5.編譯過程 6.用到的命令 卡住不動 ctrl z 清除make資訊 make clobber 開始編譯 build envsetup.sh 選擇版本 lunch 開始編譯...

Android原始碼編譯(1)

sudo apt get install 這一步需要的庫,廠商一般都會提供出來。如果有些庫不能安裝,嘗試sudo apt get update 再sudo apt get upgrade,再進行預安裝庫。sudo apt get install openjdk x jre sudo apt get ...