學習計劃
- 了解編譯系統的歷史
- 了解各個歷史的工具
- make階段編譯程序
- Soong階段編譯程序
- ninja階段編譯程序
make階段編譯程序
安卓是一種基于Linux內核(不包含GNU組件)的自由及開放源代碼的作業系統,
不得不說它是一個好的平臺,做機好幾年深深的感覺到了,一入IT深似海,何時才是出頭日,口水話了,接著說GNU Make編譯程序,

在說make編譯之前先來說下code的流動,代碼到我們手被蹂躪了多少次,(主要說我們認識的主干代碼)
- GNU牛逼大哥就不說的可以參考我之前的文章“學習Makefile的記錄”
- GNU/Linux: 安卓是一種基于Linux內核(
不包含GNU組件,不得不說谷歌小弟這波操作犀利)- android 美國谷歌公司開發的移動作業系統,谷歌會選擇某個LTS版本的Linux內核,
打上 Android 作業系統的特定補丁,使其成為 Android 通用作業系統,- Soc供應商(Qcom作代表吧)收到這個通用的作業系統,打上Soc針對平臺的各種補丁,生成一個對應平臺的通用系統,
- 最終各類OEM/ODM/元件商/…打入定制補丁,到此做機成功發布產品,
至此大概明白我們這些做機的在維護些什么東西有多么的龐大,沒有一個編譯系統來控制編譯那得有多嚇人,
1.谷歌如何通過GNU make/Makefile來構建自動化編譯系統?
2. 根據上面的code的流動,make系統分為四層:arch board device product
Make前的環境準備:
看看原始碼build這個目錄應該就明白是干啥事的
| Name | Date | Size |
|---|---|---|
| buildspec.mk.default | 06-Oct-2015 | 4.2 KiB |
| CleanSpec.mk | 06-Oct-2015 | 17.5 KiB |
| core/ | 06-Oct-2015 | 4 KiB |
| envsetup.sh | 06-Oct-2015 | 40.7 KiB |
| libs/ | 06-Oct-2015 | 4 KiB |
| target/ | 06-Oct-2015 | 4 KiB |
| tools/ | 06-Oct-2015 | 4 KiB |
source build/envsetup.sh 這個估計大家非常熟悉吧 source/.sh這些自己百度
vim build/envsetup.sh
Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
- lunch: lunch <product_name>-<build_variant>
- mm: Builds all of the modules in the current directory, but not their dependencies.
- mmm: Builds all of the modules in the supplied directories, but not their dependencies.
To limit the modules being built use the syntax: mmm dir/:target1,target2.
- mma: Builds all of the modules in the current directory, and their dependencies.
- mmma: Builds all of the modules in the supplied directories, and their dependencies.
`基本就是定義函式`
function mm(){
ONE_SHOT_MAKEFILE=$M $DRV make -C $T -f build/core/main.mk $MODULES $ARGS
}
# Execute the contents of any vendorsetup.sh files we can find.
for f in `test -d device && find -L device -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort` \
`test -d vendor && find -L vendor -maxdepth 4 -name 'vendorsetup.sh' 2> /dev/null | sort`
do
echo "including $f"
. $f
done
alin@alin:/home/alin/android$ source build/envsetup.sh
including vendor/qcom/opensource/core-utils/vendorsetup.sh
including vendor/qcom/proprietary/common/vendorsetup.sh
including vendor/qcom/proprietary/prebuilt_HY11/vendorsetup.sh
*****Could not create symlink*******
sdk/current/androidx-README.md::frameworks/support/README.md
****************END******************
Created 88 symlinks out of 89 mapped links..
`vendorsetup.sh都是類似的不說了`
`lunch/choosecombo這兩個也不說了`
alin@alin:/home/alin/android/packages/apps/Settings$ mm
`最終生成了 >> Settings.apk`
mm 其實最終是執行了下面這個命令:
ONE_SHOT_MAKEFILE=packages/apps/Settings/Android.mk $DRV make -C /home/alin/android -f build/core/main.mk Settings
ONE_SHOT_MAKEFILE=packages/apps/Settings/Android.mk $DRV其實只是一個引數
make -C /home/alin/android -f build/core/main.mk Settings這才是命令
what?這樣也行?大家可以自己在根上執行這個命令,ONE_SHOT_MAKEFILE只是引數,這個有啥用呢?很好這個去build/core/main.mk找原因ONE_SHOT_MAKEFILE的妙用就不說了,就是一個include modules和include all_modules的區別,
以后大家不要說make是編譯的mmmmmmmm是做啥的,
文章說到這里大家也是體驗了一把單編settings的程序,其實也是make在操作,
不要慌來一張圖感覺下先:

下面我們深入android Makefile:
通過“學習Makefile的記錄”,執行make是需要當前目錄下面有一個Makefile檔案,查看andriod原始碼目錄確實有一個Makefile,
cd project/top
vim Makefile
### DO NOT EDIT THIS FILE ###
include build/make/core/main.mk
### DO NOT EDIT THIS FILE ###
#參考代碼 Marshmallow - 6.0.0_r1
vim build/make/core/main.mk
#include mk
include $(BUILD_SYSTEM)/help.mk
include build/make/core/config.mk
include $(BUILD_SYSTEM)/cleanbuild.mk
include vendor/google/build/config.mk
include $(OUT_DIR)/versions_checked.mk
include $(BUILD_SYSTEM)/definitions.mk
include $(BUILD_SYSTEM)/dex_preopt.mk
include build/core/pdk_config.mk
include $(BUILD_SYSTEM)/legacy_prebuilts.mk
include $(BUILD_SYSTEM)/Makefile
# PHONY代表定義偽target
#----------------------------------target droid-------------------------------------
# This is the default target. It must be the first declared target.
.PHONY: droid
DEFAULT_GOAL := droid
$(DEFAULT_GOAL):
# Building a full system-- the default is to build droidcore
droid: droidcore dist_files
# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: files \
systemimage \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
$(INSTALLED_VENDORIMAGE_TARGET) \
$(INSTALLED_FILES_FILE)
#----------------------------------target droid-------------------------------------
這樣看無非就是include mk 定義target,make target就執行相應的模塊,其他的也就規則問題沒啥說的
不說了來張圖感覺下先:

好了一篇文章不可能把所有的說完意思下就可以記住這個規則就可以了:arch board device product
看樣子還是有很多想學習這個,按各位的要求還是再深入一點,講講這么多mk都在做些什么,最終說一個Android.mk編譯的程序吧, 先上一張圖吧,今天就先到這,待更新,,,

非常感謝您花費時間閱讀這份稿件,感覺有用可以分享給更多的學習者,轉載請標記出處,
作者: [Alin]
時間: 2021 年 02月 04日
email:380475066@qq.com
參考文獻
Android (美國谷歌公司開發的移動作業系統)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/257139.html
標籤:其他
上一篇:加法和乘法
