说明
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
上篇文章介绍了产品配置的结构和重要目录, 而这些目录中有几个非常重要的文件, 本文重点介绍和产品配置相关的文件和脚本。
一, AndroidProducts.mk(必须)
AndroidProducts.mk文件用于描述产品列表, 表示当前公司有哪些产品, 主要包括PRODUCT_MAKEFILES变量, 会记录各个产品所用的Makefile的列表,比如有两个产品,rk3399.mk, firefly.mk等, 一般格式如下:
PRODUCT_MAKEFILES := $(LOCAL_DIR)/<first_product_name>.mk \
$(LOCAL_DIR)/<second_product_name>.mk
同时在新的Android系统版本中可以添加COMMON_LUNCH_CHOICES编译, 用于在lunch命令之后显示的产品选项, 该变量起着类似旧版本vendorsetup.sh的作用。一般AndroidProducts.mk可以放在:
device/公司名/AndroidProducts.mk
device/公司名/产品名/AndroidProducts.mk
当lunch命令执行的的时候, 会自动在device、vendor、product目录中查找AndroidProducts.mk文件.
二, <product_name>.mk(必须)
某个产品的Makefile,比如rk3399.mk内容:默认自带的软件,厂商名,产品名称,设备名称,等信息。 同时也可以定义PRODUCT_COPY_FILES, PRODUCT_PROPERTY_OVERRIDES,PRODUCT_PACKAGES,用于对设备中需要用到的特有文件进行预编译和客制化:
PRODUCT_NAME := rk3399_roc_pc_plus
PRODUCT_DEVICE := rk3399_roc_pc_plus
PRODUCT_BRAND := rockchip
PRODUCT_MODEL := ROC-RK3399-PC-PLUS
PRODUCT_MANUFACTURER := rockchip
PRODUCT_FIREFLY_NAME := HDMI
三, BoardConfig.mk文件(必须)
更多用于定义和硬件相关的底层特性和变量,比如当前源码支持的cpu 位数(64/32位),bootloader和kernel, 是否支持摄像头,GPS导航等一些板级特性,BoardConfig.mk一般都在device或者vendor目录下的4级子目录下 例如:
TARGET_ARCH := arm64
TARGET_ARCH_VARIANT := armv8-a
TARGET_CPU_ABI := arm64-v8a
TARGET_CPU_ABI2 :=
TARGET_CPU_VARIANT := cortex-a53
TARGET_CPU_SMP := true
TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv7-a-neon
TARGET_2ND_CPU_ABI := armeabi-v7a
TARGET_2ND_CPU_ABI2 := armeabi
TARGET_2ND_CPU_VARIANT := cortex-a15
PRODUCT_KERNEL_ARCH := arm64
TARGET_PREBUILT_KERNEL := kernel/arch/arm64/boot/Image
BOARD_PREBUILT_DTBIMAGE_DIR := kernel/arch/arm64/boot/dts/rockchip
PRODUCT_KERNEL_DTS ?= rk3399-sapphire-excavator-edp-avb
PRODUCT_KERNEL_CONFIG ?= rockchip_defconfig android-10.config rk3399.config
PRODUCT_UBOOT_CONFIG ?= rk3399
BOARD_NFC_SUPPORT := false
BOARD_HAS_GPS := false
BOARD_HAVE_DONGLE ?= false
BOARD_GRAVITY_SENSOR_SUPPORT := true
BOARD_COMPASS_SENSOR_SUPPORT := false
BOARD_GYROSCOPE_SENSOR_SUPPORT := false
BOARD_PROXIMITY_SENSOR_SUPPORT := false
BOARD_LIGHT_SENSOR_SUPPORT := true
BOARD_PRESSURE_SENSOR_SUPPORT := false
BOARD_TEMPERATURE_SENSOR_SUPPORT := false
BOARD_USB_HOST_SUPPORT := true
四, device.mk(非必须)
一般作为通用的文件(如同样的soc做成不同产品的通用部分)被各种产品<product_name>.mk继承进来,比如:
./product/aosp_x86_64.mk:45:$(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk)
rk3399_roc_pc_plus产品中的rk3399_roc_pc_plus.mk中
./rk3399_roc_pc_plus.mk:26:$(call inherit-product, device/rockchip/rk3399/device.mk)
./rk3399_roc_pc_plus.mk:27:$(call inherit-product, device/rockchip/common/device.mk)
里面常见有如下内容:
PRODUCT_COPY_FILES := \
device/xxx/init.rc:root/init.rc \
PRODUCT_PROPERTY_OVERRIDES += \
ro.ril.ecclist=112,911 \
PRODUCT_PACKAGES += \
librkisp_aec \
五,vendorsetup.sh文件(非必须)
用于将产品名放入到lunch选项列表中,在source build/envsetup.sh的时候会被自动调用, 一般内容如下:
add_lunch_combo xxxx-user
add_lunch_combo xxxx-userdebug
add_lunch_combo xxxx-eng
现在基本上都被AndroidProducts.mk中的COMMON_LUNCH_CHOICES替代:
COMMON_LUNCH_CHOICES := \
rk3399_mid-userdebug \
rk3399_mid-user \
rk3399_atv-userdebug \
六,AndroidBoard.mk文件(非必须)
该文件被系统编译系统核心代码包含进来:
./build/make/target/board/Android.mk:7:-include $(TARGET_DEVICE_DIR)/AndroidBoard.mk
不过在./build/target中并没有这种文件,也就是说可能用的不多。 而在rk3399中会有这个文件, 该文件更像是一个传统的Makefile,完成了将依赖编译成目标的规则, 比如:
rebuild_fstab := $(intermediates)/fstab.rk30board
INSTALLED_RK_VENDOR_FSTAB := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)/etc/$(notdir $(rebuild_fstab))
$(INSTALLED_RK_VENDOR_FSTAB) : $(rebuild_fstab)
$(call copy-file-to-new-target-with-cp)
上面主要完成是fstab.rk30board文件重新生成和拷贝。
总结
先理解好产品配置中涉及到的文件意义, 后面自己配置产品就大体知道什么意思了。