先上参考链接:
- Soong: android.googlesource.com/platform/bu…
- Soong Build System: source.android.google.cn/docs/setup/…
- Add a new device: https://source.android.google.cn/docs/setup/create/new-device?hl=en
- Runtime resource overlay: source.android.google.cn/docs/core/a…
1. 一些概念
1.1. 构建层级
- Arch
- arm, x86, arm64, x86_64
- Board/Device
- aosp_car, marlin, msmnile, etc.
- Product
- myProduct, myProduct_eu, myProduct_eu_fr, sdk
1.2. 构建变种
- eng:
- 包含 PRODUCT_PACKAGES_ENG, PRODUCT_PACKAGES_DEBUG 以及 PRODUCT_PACKAGES 中的模块
- ro.secure=0
- ro.debuggable=1
- ro.kernel.android.checkjni=1
- adb 默认打开
- user:
- 包含 PRODUCT_PACKAGES 中的模块
- ro.secure=1
- ro.debuggable=0
- adb 默认关闭
- userdebug: 除了以下差别,与 user 相同
- 包含 PRODUCT_PACKAGES_DEBUG 中的模块
- ro.debuggable=1
- adb 默认打开
2. 添加新设备的基本步骤
2.1. 添加产品目录
- 在
device
,vendor
或product
下面创建目录 - 一般结构为
vendor/le/demo
,device/generic/car
, 但不是强制格式
2.2. 添加产品配置文件
- AndroidProducts.mk
- 必须
- 放在产品目录中
- 用于添加lunch选项
- 用于指定产品主make文件
如 device/generic/car/AndroidProducts.mk
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/aosp_car_arm64.mk \
$(LOCAL_DIR)/aosp_car_arm.mk \
$(LOCAL_DIR)/aosp_car_x86.mk \
$(LOCAL_DIR)/aosp_car_x86_64.mk \
$(LOCAL_DIR)/car_ui_portrait.mk \
$(LOCAL_DIR)/car_x86_64.mk \
$(LOCAL_DIR)/gsi_car_arm64.mk \
$(LOCAL_DIR)/gsi_car_x86_64.mk \
COMMON_LUNCH_CHOICES := \
aosp_car_arm-userdebug \
aosp_car_arm64-userdebug \
aosp_car_x86-userdebug \
aosp_car_x86_64-userdebug \
car_ui_portrait-userdebug \
car_x86_64-userdebug \
gsi_car_arm64-userdebug \
gsi_car_x86_64-userdebug \
EMULATOR_VENDOR_NO_SOUND_TRIGGER := false
- demo.mk
- 必须
- 放在产品目录或子目录中
- 在 AndroidProducts.mk 中引用
- 产品的主make文件
如 device/generic/car/aosp_car_x86_64.mk
PRODUCT_PACKAGE_OVERLAYS := device/generic/car/common/overlay
EMULATOR_VENDOR_NO_SENSORS := true
$(call inherit-product, device/generic/car/emulator/aosp_car_emulator.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_x86_64.mk)
EMULATOR_VENDOR_NO_SOUND := true
PRODUCT_NAME := aosp_car_x86_64
PRODUCT_DEVICE := generic_car_x86_64
PRODUCT_BRAND := Android
PRODUCT_MODEL := Car on x86_64 emulator
- BoardConfig.mk
- 必须
- 放在产品目录中
- 指定设备树,各种构建和bootloader设置,针对某种device或board的软硬件参数配置
- Kernel配置,如开关某个feature
- Debug选项,如默认log等级
- Hardware配置,如分辨率,内存大小,核心类型
- Boot设置,如使用哪个bootloader,指定开机动画等
- 构建选项,如目标架构,是否生成调试符号表
如 device/generic/car/generic_car_x86_64/BoardConfig.mk
# This is a wrapper board for AAOS 64bit only emulators
# Use generic_64bitonly_x86_64 BoardConfig as base
include build/make/target/board/generic_64bitonly_x86_64/BoardConfig.mk
# Override BOARD_SUPER_PARTITION_SIZE to increase the mounted system partition.
BOARD_SUPER_PARTITION_SIZE := 5856296960
-
AndroidBoard.mk
- 可选
- 放在产品目录中
- 用来配置硬件相关功能,自定义脚本,或覆盖模块变量,是BoardConfig.mk的扩展,是在Android侧对board层配置的覆写
- 针对Device的设置: 比如 camera, audio设置
- 自定义脚本: 比如构建时用的脚本
- 覆写模块Android.mk里的变量
- 自定义Android框架,如添加新的services, permissions,或修改已有模块行为.
-
*.prop
- 可选
- 放在产品目录中
- 不同分区的系统属性文件
- 可能是 system.prop/vendor.prop/product.prop/odm.prop/system_ext.prop
-
Android.mk
- 可选
- 内容空白,屏蔽掉子目录的 Android.mk 或 Android.bp
2.3. 设置产品变量
-
基本属性变量
PRODUCT_NAME
PRODUCT_DEVICE
必须与BoardConfig.mk所在目录名称一致PRODUCT_MODEL
PRODUCT_MANUFACTURER
PRODUCT_BRAND
-
一些重要变量
PRODUCT_LOCALES
- 支持的语言列表
PRODUCT_COPY_FILES
- 复制文件到最终设备中
- 同一目标文件的多个复制规则,第一个生效
$(TARGET_OUT)/product_copy_files_ignored.txt
中可以查看未生效规则
PRODUCT_PACKAGES
- 包含在最终产品的模块列表
PRODUCT_SYSTEM_PROPERTIES
,PRODUCT_VENDOR_PROPERTIES
...- 为某个分区添加系统属性
- 可以是 SYSTEM, VENDOR, ODM, SYSTEM_EXT and PRODUCT
PRODUCT_PACKAGE_OVERLAYS
- 指定产品overlay资源目录
PRODUCT_ADB_KEYS
- 设置用于debug的 adb key
2.4. 资源overlay
PRODUCT_PACKAGE_OVERLAYS
或DEVICE_PACKAGE_OVERLAYS
一般写法:
PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
-
overlay资源目录内的目录结构必须保持与AOSP根目录下的目录结构完全一致
-
设置多个overlay的规则
PRODUCT_PACKAGE_OVERLAYS
优先级高于DEVICE_PACKAGE_OVERLAYS
PRODUCT_PACKAGE_OVERLAYS
和DEVICE_PACKAGE_OVERLAYS
内部先出现的生效
-
PRODUCT_ENFORCE_RRO_TARGETS
强制转换为 RRO
一般写法:
PRODUCT_ENFORCE_RRO_TARGETS := framework-res
3. 构建配置
3.1. 环境变量
通过 source build/envsetup.sh
引入,可以在 device, vendor 或 product 目录下创建 vendorsetup.sh 引入自定义变量
3.2. 内置构建变量
3.2.1. PRODUCT_*
build/make/core/product.mk
有完整列表- 产品的 makefiles 中设置
- 分为单值变量和多值变量
- 主要用于产品继承
3.2.2. TARGET_*
build/make/core/envsetup.mk
中创建source build/envsetup.sh
时赋值
3.2.3. DEVICE_*
产品的 makefiles 中设置,常见的有:
DEVICE_PACKAGE_OVERLAYS
DEVICE_MATRIX_FILE
DEVICE_MANIFEST_FILE
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE
DEVICE_FRAMEWORK_MANIFEST_FILE
3.2.4. LOCAL_*
- 在
build/soong/android/androidmk.go
中定义
3.2.5. BOARD_*
- Kernel相关配置
- 产品的
BoardConfig.mk
中设置 build/make/core/board_config.mk
中解析
3.3. 继承
3.3.1. 两种方式复用产品
include
如 device/generic/car/emulator_car64_x86_64/BoardConfig.mk
BOARD_DO_NOT_STRIP_VENDOR_MODULES := true
# Use emulator64_x86_64_arm64 BoardConfig as base
include device/generic/goldfish/emulator64_x86_64/BoardConfig.mk
include device/generic/car/emulator/usbpt/BoardConfig.mk
# ...
inherit-product
3.3.2. 如何继承
inherit-product
如 build/make/target/product/sdk_x86_64.mk
$(call inherit-product, $(SRC_TARGET_DIR)/product/sdk_phone_x86_64.mk)
inherit-product-if-exists
如 build/make/target/product/aosp_x86_64.mk
$(call inherit-product-if-exists, device/generic/goldfish/x86_64-vendor.mk)
具体实现在 build/make/core/product.mk
,第二种允许对应mk文件不存在
3.3.3. inherit-product和include差异
inherit-product
除了执行 include
功能以外,还会
- 继承目录 makefile 中的所有产品变量
- 把继承关系记录到 .INHERITS_FROM 变量
- PRODUCT变量依据继承顺序最终赋值
3.3.4. 单值变量
- 当前文件赋值生效
- 第一个继承文件赋值生效
- 比如
PRODUCT_NAME
,PRODUCT_MODEL
, ...
- 比如
3.4. 系统属性
- 属性列表,有重复设置,最后一个生效
- PRODUCT_SYSTEM_PROPERTIES
- PRODUCT_SYSTEM_EXT_PROPERTIES
- PRODUCT_VENDOR_PROPERTIES
- PRODUCT_ODM_PROPERTIES
- PRODUCT_PRODUCT_PROPERTIES
- 属性文件列表
TARGET_SYSTEM_PROP
- 如
build/make/target/product/go_defaults.mk