在AOSP源代码树中添加新Product
在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产品为例,逐步创建我们自己的产品。
- 设备目录
- 新建板级配置
- 新建产品配置
- 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_ARCH
、TARGET_CPU_ABI
、BOARD_KERNEL_CMDLINE
、BOARD_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_NAME
和PRODUCT_DEVICE
。这些变量需要我们手动进行定制:
PRODUCT_NAME
必须与配置文件的名称保持一致。此变量在确定编译输出目录方面起着关键作用。
PRODUCT_DEVICE
与BoardConfig.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的能力。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!