Android编译系统分析之几个关键点(二)

Android 编译系统解析系列文档

编译系统入口envsetup.sh解析

解析lunch的执行过程以及make执行过程中include文件的顺序

关注一些make执行过程中的几个关键点

对一些独特的语法结构进行解析


这篇文章的主要内容我们来分析关于BoardConfig.mk的一些关键的知识点

BoardConfig概览

BoardConfig 顾名思义,主要是配置一些Board(平台级)相关的东西,大致涉及的内容有arch架构(32还是64位),CPU的类型,Bootloader,Kernel,RadioImage等是否定义预编译,还有内核的一些page大小,固定的地址偏移等内容,总的来说,这个文件的主要内容就是定义一些与硬件相关的配置

使用方法

BoardConfig.mk文件的使用方法很简单,只需要在Android编译系统指定的三个位置创建BoardConfig.mk这个名称的文件即可

使用范围

BoardConfig.mk文件的使用位置有三个build, device, vendor,不过文件的存在需要唯一,为什么是这三个位置,我们在稍后的解析中就可以看到

BoardConfig解析

关于BoardConfig.mk文件的解析的代码很短,所有代码只有20行多一点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Boards may be defined under $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
# or under vendor/*/$(TARGET_DEVICE). Search in both places, but
# make sure only one exists.
# Real boards should always be associated with an OEM vendor.
board_config_mk := \
$(strip $(wildcard \
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \
$(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
$(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \
))
ifeq ($(board_config_mk),)
$(error No config file found for TARGET_DEVICE $(TARGET_DEVICE))
endif
ifneq ($(words $(board_config_mk)),1)
$(error Multiple board config files for TARGET_DEVICE $(TARGET_DEVICE): $(board_config_mk))
endif
include $(board_config_mk)
ifeq ($(TARGET_ARCH),)
$(error TARGET_ARCH not defined by board config: $(board_config_mk))
endif
TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk)))
board_config_mk :=

从解析前的注释中,我们能简单的看出BoardConfig文件的存放位置:
$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)

其中SRC_TARGET_DIR在config.mk文件中已经定义,指向build/target

也就是说Android编译系统允许的BoardConfig.mk存在的位置有三个

  • build/target/board/$(TARGET_DEVICE)
  • vendor/*/$(TARGET_DEVICE)
  • device/*/$(TARGET_DEVICE)

这三个位置除了固定深度4层之外,还指定了TARGET_DEVICE的限制,这个TARGET_DEVICE的内容是什么,如果你看过之前关于lunch的解析,你应该明白,这个值就是我们自己在product_makefile文件中定义的PRODUCT_DEVICE这个值

Android编译系统要求这个文件是唯一的,所以在获取这三个位置的BoardConfig.mk之后,我们需要告诉使用者只需要一个BoardConfig.mk文件,然后加载这个BoardConfig.mk文件即可

当然,从代码实现的角度来说,实现多个BoardConfig.mk文件同时加载也没有问题,但是从代码维护的角度来说,这样不利于这部分配置文件的维护,所以还是放在一个文件内比较好

在加载完这个文件之后,我们还通过这个文件定义了一个变量TARGET_DEVICE_DIR,我们将BoardConfig.mk文件存在的位置作为了我们后边要加载其他内容的目录,主要是用来作为kernel预编译以及一些信息的文件

至此,关于BoardConfig.mk文件的加载我们也已经解析完了

总结

  1. BoardConfig.mk文件的定义远远没有AndroidProduct.mk文件复杂,毕竟一个成型的Product,平台级别的配置基本已经定型了,我们无需要再做复杂的配置
  2. 我们可以看到对于一个Product可以有三个可选的位置放BoardConfig.mk文件,所以对于无法确定目标机型在哪个位置存放了这个配置文件,我们可以通过输出TARGET_DEVICE_DIR的值来判断

Android编译系统分析之几个关键点(二)

http://www.0xforee.top/2015/12/28/android-build-system-keypoint-second/

作者

0xforee

发布于

2015-12-28

更新于

2015-12-29

许可协议


欢迎关注我的公众号 0xforee,第一时间获取更多有价值的思考

评论