在某个项目中,有一个需求,需要新增一个xxx分区,这个分区类似于vendor/oem分区,名字为指定的。此处有点好奇,为什么不直接使用oem分区,而是另外弄一个分区名出来。
功能实现点
- 在root目录下新增分区的挂载目录,将自定义分区的内容生成一个img。
- 配置方案,将需要拷进自动以分区的模块、文件等配置好。
- 在dts中加入xxx分区的支持。
- 增加init解析rc的路径,支持xxx/etc/init下的rc文件。
- 修改PackageManagerService,启动时包扫描增加xxx/app下的apk支持。
- 修改PATH环境变量,使xxx/bin在PATH环境路径下。
- 修改Android library路径,使JNI能找到xxx/lib中的so。
- 修改烧写分区,使xxx.img刷入到flash中。
Android custom images
AndroidP提供了build_custom_images的task,Makefile的路径如下:
android/build/make/core/tasks/build_custom_images.mk
android/build/make/core/tasks/tools/build_custom_image.mk
第一个Makefile定义了custom_images这个目标,已经声明了一些需要设置的参数:
custom_image_parameter_variables := \
CUSTOM_IMAGE_MOUNT_POINT \
CUSTOM_IMAGE_PARTITION_SIZE \
CUSTOM_IMAGE_FILE_SYSTEM_TYPE \
CUSTOM_IMAGE_DICT_FILE \
CUSTOM_IMAGE_MODULES \
CUSTOM_IMAGE_COPY_FILES \
CUSTOM_IMAGE_SELINUX \
CUSTOM_IMAGE_SUPPORT_VERITY \
CUSTOM_IMAGE_SUPPORT_VERITY_FEC \
CUSTOM_IMAGE_VERITY_BLOCK_DEVICE \
CUSTOM_IMAGE_AVB_HASH_ENABLE \
CUSTOM_IMAGE_AVB_ADD_HASH_FOOTER_ARGS \
CUSTOM_IMAGE_AVB_HASHTREE_ENABLE \
CUSTOM_IMAGE_AVB_ADD_HASHTREE_FOOTER_ARGS \
CUSTOM_IMAGE_AVB_KEY_PATH \
CUSTOM_IMAGE_AVB_ALGORITHM \
这些变量的含义在代码的上方有注释,其中PRODUCT_CUSTOM_IMAGE_MAKEFILES这个变量是自定义的分区image的mk文件,image(分区)的名字就是mk的名字。然后调用第二个Makefile文件去编译生成img。
在这里,原生的Makefile中没找到自动添加custom_images这个目标的方式,只能通过`make custom_images`的方式去生成。为了在make的时候自动生成custom_images,可做以下修改:
diff --git a/core/tasks/build_custom_images.mk b/core/tasks/build_custom_images.mk
index c9b07da57..93c06ab1d 100644
--- a/core/tasks/build_custom_images.mk
+++ b/core/tasks/build_custom_images.mk
@@ -50,7 +50,10 @@
#
# To build all those images, run "make custom_images".
-ifneq ($(filter $(MAKECMDGOALS),custom_images),)
+# ifneq ($(filter $(MAKECMDGOALS),custom_images),)
+ifneq ($(PRODUCT_CUSTOM_IMAGE_MAKEFILES),)
+
+$(DEFAULT_GOAL): custom_images
在$(DEFAULT_GOAL)中添加custom_images这个目标,在core/tasks/build_custom_images.mk中修改判断条件,当PRODUCT_CUSTOM_IMAGE_MAKEFILES变量非空时即生成custom_images这个目标。
core/tasks/tools/build_custom_image.mk中的my_staging_dir是指定生成custom_images中间文件目录的地方,默认是方案out目录下obj/PACKAGING/xxxx_intermediates/xxx下,我改到方案out目录下的xxx目录下。
custom_image mk配置
在BoardConfig.mk中增加PRODUCT_CUSTOM_IMAGE_MAKEFILES的配置,如下:
PRODUCT_CUSTOM_IMAGE_MAKEFILES += device/xxx/xxx/xxx.mk
BOARD_ROOT_EXTRA_FOLDERS += xxx
BOARD_ROOT_EXTRA_FOLDERS变量的值是指在root目录下创建一个目录,这个主要是为xxx分区提供好挂载点。
然后就是我们需要根据自己的需求写xxx.mk&#x