Android平台-添加新设备

213 阅读3分钟

先上参考链接:

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, vendorproduct 下面创建目录
  • 一般结构为 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_OVERLAYSDEVICE_PACKAGE_OVERLAYS

一般写法:

PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
  • overlay资源目录内的目录结构必须保持与AOSP根目录下的目录结构完全一致

  • 设置多个overlay的规则

    • PRODUCT_PACKAGE_OVERLAYS 优先级高于 DEVICE_PACKAGE_OVERLAYS
    • PRODUCT_PACKAGE_OVERLAYSDEVICE_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