Android编译系统的学习(三)

学习计划



make阶段编译过程

安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。

不得不说它是一个好的平台,做机好几年深深的感觉到了。一入IT深似海,何时才是出头日。口水话了,接着说GNU Make编译过程。

code flow在说make编译之前先来说下code的流动,代码到我们手被蹂躏了多少次。(主要说我们认识的主干代码)

  1. GNU牛逼大哥就不说的可以参考我之前的文章“学习Makefile的记录”
  2. GNU/Linux: 安卓是一种基于Linux内核(不包含GNU组件,不得不说谷歌小弟这波操作犀利
  3. android 美国谷歌公司开发的移动操作系统,谷歌会选择某个LTS版本的Linux内核。
    打上 Android 操作系统的特定补丁,使其成为 Android 通用操作系统。
  4. Soc供应商(Qcom作代表吧)收到这个通用的操作系统,打上Soc针对平台的各种补丁,生成一个对应平台的通用系统。
  5. 最终各类OEM/ODM/元件商/…打入定制补丁,到此做机成功发布产品。

至此大概明白我们这些做机的在维护些什么东西有多么的庞大,没有一个编译系统来控制编译那得有多吓人。


1.谷歌如何通过GNU make/Makefile来构建自动化编译系统?
2. 根据上面的code的流动,make系统分为四层:arch board device product

Make前的环境准备:

看看源码build这个目录应该就明白是干啥事的

NameDateSize
buildspec.mk.default06-Oct-20154.2 KiB
CleanSpec.mk06-Oct-201517.5 KiB
core/06-Oct-20154 KiB
envsetup.sh06-Oct-201540.7 KiB
libs/06-Oct-20154 KiB
target/06-Oct-20154 KiB
tools/06-Oct-20154 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 (美国谷歌公司开发的移动操作系统)

  • 24
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值