在AOSP源代码树中添加新Product

在AOSP源代码树中添加新Product_第1张图片

在AOSP源代码树中添加新Product

在之前关于编译Android内置产品进行验证的基础上,我们现在将注意力转向添加自己的产品的过程。添加新产品允许您根据特定设备和用例自定义Android系统,并通过与其他开发人员分享产品来为开源社区做出贡献。

向Android开源项目(AOSP)源代码添加新产品可能是一项艰巨的任务,但并非不可行。在本文中,我们将逐步指导您创建自己的产品的过程。一般而言,一个产品包含四个元素:

AndroidProducts.mk:该文件指定产品配置并概述了由AndroidProducts.mk中的PRODUCT_MAKEFILES定义的内置软件模块等关键细节。
BoardConfig.mk:此文件包含与硬件相关的配置,包括芯片硬件设置和分区配置。这对于定制产品的硬件要求至关重要。
Product.mk:此文件封装了有关软件模块的指令,并补充了在AndroidProducts.mk中找到的定义,即它包含产品的软件相关配置,例如由AndroidProducts.mk中的PRODUCT_MAKEFILES指定的内置软件模块。
Vendorsetup.sh:这个文件在历史上很重要,曾在添加产品到菜单选项中起着关键作用。然而,随着Android 10的推出,曾在vendorsetup.sh中承载的功能已经迁移到了AndroidProducts.mk中,使其在现代产品添加中变得过时。

下面我将以aosp_x86_64产品为例,逐步创建我们自己的产品。

  1. 设备目录
  2. 新建板级配置
  3. 新建产品配置
  4. Android产品配置

1. 创建设备目录
如前所述,一个产品包括四个基本组成部分,每个部分在Android系统中都有指定的位置。这四个元素分别放置在两个不同的目录中:制造商的产品配置放置在“device”目录中,Google官方内置的AOSP产品放置在“build/target”目录中。

在“build/target”目录中,您将找到AndroidProducts.mk和product.mk,而“build/target/board”目录则包含BoardConfig.mk等文件。

我关注的是向“device”目录添加产品,我们将从创建此目录结构开始:

mkdir -p device/[company]/[device]
#例如,如果您想要为公司“Android Champ”和设备“Sample”创建一个新产品,那么请执行以下命令
mkdir -p device/AndroidChamp/Sample

请注意,这是针对“device”目录而不是“product”目录。为了区分二者,可以将“device”看作是与硬件相关的芯片平台级配置的领域,将“product”视为与软件相关的配置的领域。值得强调的是,多个产品可以在同一个设备下共存,允许将不同的软件模块集成到同一硬件板上。这种安排强调了Android产品配置的灵活性和多功能性,适应了各种硬件和软件定制。

2. 创建新的板级配置BoardConfig.mk
在Android系统中,BoardConfig.mk文件起着关键作用,包括硬件芯片架构配置、分区大小设置和其他重要信息。

为了简化流程,您可以直接使用aosp_x86_64产品中的BoardConfig.mk:

include $(SRC_TARGET_DIR)/board/generic_x86_64/BoardConfig.mk

这种简单直接的方法简化了硬件配置方面的工作,并确保与aosp_x86_64产品兼容,使其易于理解和使用。

您需要更改变量的值,例如TARGET_ARCHTARGET_CPU_ABIBOARD_KERNEL_CMDLINEBOARD_SYSTEMIMAGE_PARTITION_SIZE等。

3. 创建新的产品配置sample.mk
我们通过直接继承aosp_x86_64产品的设置来简化产品配置过程,同时进行一些必要的调整:

$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_x86_64.mk)

从aosp_x86_64产品继承产品配置,aosp_x86_64是一个通用的x86_64仿真器映像。

#自定义特定于产品的变量
PRODUCT_NAME := Demo
PRODUCT_DEVICE := sample

在这里,有两个重要的变量需要注意,即PRODUCT_NAMEPRODUCT_DEVICE。这些变量需要我们手动进行定制:
PRODUCT_NAME必须与配置文件的名称保持一致。此变量在确定编译输出目录方面起着关键作用。
PRODUCT_DEVICEBoardConfig.mk密切相关。编译系统使用此变量根据$PRODUCT_DEVICE设置从指定目录加载相应BoardConfig.mk文件。这是确保所有组件按照我们的预期方式协同工作的方法。

4. 创建新的AndroidProducts.mk
在Android中,有一个名为PRODUCT_MAKEFILES的变量在AndroidProducts.mk中定义。该变量列出了您在前面步骤中添加的产品的配置文件。对于本例,我们有一个名为sample.mk的配置文件。

在Android 10中,还有一个名为COMMON_LUNCH_CHOICE的变量。它实际上承担了vendorsetup.sh的角色,vendorsetup.sh是在旧版本中使用的文件。

下面是代码示例:

PRODUCT_MAKEFILES := \ 
    $(LOCAL_DIR)/sample.mk
COMMON_LUNCH_CHOICES := \ 
    demo-eng

这段代码使我们在构建Android时可以简单地选择产品。它在lunch菜单中添加了一个名为“demo-eng”的选项。在这种情况下:
“demo”是产品的名称。
“eng”代表工程版本,包括所有模块,允许调试,并具有完全的系统访问权限(ROOT状态)。
其他版本如“userdebug”用于无ROOT访问的调试,“user”是最终版,用户发布时无法进行调试和ROOT访问。

5. 编译验证
现在,配置了最简单的产品后,您的目录结构如下所示:

androidchamp 
└── sample
    ├── AndroidProducts.mk 
    ├── BoardConfig.mk 
    └── sample.mk

一切准备就绪,现在是时候在虚拟机上进行编译和测试配置了。如果遇到任何问题,请仔细检查之前的步骤,以确定并解决潜在问题。

您可以执行以下命令来在模拟器上编译和运行自定义的Android产品:

source build/envsetup.sh 
lunch demo-eng 
make -j 
emulator

这些命令可以使用模拟器构建和测试您独特的Android产品。如果遇到困难,请确保重新查看之前的步骤,以确保正确设置。

6. 总结
通过本指南,您已经学会了如何向AOSP源代码树中添加新产品,为Android源代码增加了灵活性和适应性,以满足您的特定需求。
现在,您已经具备了进一步探索和根据自己的需求定制Android的能力。

你可能感兴趣的:(AOSP,Android,framework,android,AOSP)