Android Framework 常见解决方案(28)system分区自定义方案

1 原理说明

一般在定制系统时,都会做预置apk和各类其他资源,很有可能超出系统默认设置的系统分区大小,也就会导致编译system时因超出默认设置的分区大小而失败。一般的做法是修改android framework时,修改对应项目的BOARD_SYSTEMIMAGE_PARTITION_SIZE的值。

BOARD_SYSTEMIMAGE_PARTITION_SIZE是在 Android 系统构建过程中使用的板级配置变量之一。它在 Android 框架中的主要作用是指定系统镜像(system partition)的大小。系统镜像是 Android 设备上的一个分区,包含了操作系统的核心文件和系统应用。详细解读如下:

  • 分区大小的设置:BOARD_SYSTEMIMAGE_PARTITION_SIZE 的值通常以字节为单位设置。例如,如果你想为系统分区分配 2GB 的空间,你会将此变量设置为 2147483648(即 2GB 的字节数)。
  • 系统镜像的作用:系统镜像包含了启动 Android 系统所需的基本组件,如内核、系统库、框架和必要的系统应用。这些组件对于系统的稳定运行至关重要。
  • 影响因素:设置 BOARD_SYSTEMIMAGE_PARTITION_SIZE 会影响到系统镜像分区的大小,进而影响到可以安装的系统应用数量和更新的频率。如果分区设置得太小,可能会导致空间不足,无法安装新的系统更新或应用。
  • 构建过程中的应用:在构建 Android 系统镜像时,构建系统会读取 BoardConfig.mk 文件中的 BOARD_SYSTEMIMAGE_PARTITION_SIZE 值,并据此创建相应大小的系统镜像分区。这个值是在设备的构建配置中定义的,不同的设备和项目可能有不同的需求。
  • 动态分区:在 Android 7.0(API 级别 24)及以后的版本中,Android 引入了动态分区的概念。动态分区允许系统根据需要动态调整各个分区的大小,而不是在制造时就固定下来。BOARD_SYSTEMIMAGE_PARTITION_SIZE 在这种情况下可能会与其他分区大小参数一起使用,以实现动态调整。
  • 开发者和制造商的考虑:对于开发者和设备制造商来说,合理配置 BOARD_SYSTEMIMAGE_PARTITION_SIZE 是非常重要的。它需要考虑到设备的存储容量、预期的系统更新频率、预装应用的数量等因素。同时,延伸来说,不仅是BOARD_SYSTEMIMAGE_PARTITION_SIZE,其他分区的设置也可以按需自定义设置。

总结来说,BOARD_SYSTEMIMAGE_PARTITION_SIZE 是一个关键的板级配置变量,它决定了 Android 设备上系统镜像分区的大小。这个大小设置需要综合考虑多种因素,以确保系统运行的稳定性和足够的存储空间。在构建 Android 系统时,正确配置这个变量对于确保系统正常运行和更新至关重要。

2 修改方案(通用)

要修改 BOARD_SYSTEMIMAGE_PARTITION_SIZE,在相应项目的 BoardConfig.mk 文件中进行更改。修改后需要重新编译system.img。

修改文件为:AOSP/device/{你的产品配置目录}/BoardConfig.mk,修改内容如下(这里以一个BoardConfig.mk为例,将原本的BOARD_SYSTEMIMAGE_PARTITION_SIZE从3G修改为5G):

# KEYSTONE(I1056bb73cc2f8796ed941b5dd7b333ef15c60891,b/147756744)
BUILD_BROKEN_NINJA_USES_ENV_VARS := SDCLANG_AE_CONFIG SDCLANG_CONFIG SDCLANG_CONFIG_AOSP SDCLANG_SA_ENABLED
BUILD_BROKEN_NINJA_USES_ENV_VARS += TEMPORARY_DISABLE_PATH_RESTRICTIONS
BUILD_BROKEN_USES_BUILD_HOST_SHARED_LIBRARY := true
BUILD_BROKEN_USES_BUILD_HOST_EXECUTABLE := true
BUILD_BROKEN_USES_BUILD_COPY_HEADERS := true
BUILD_BROKEN_USES_BUILD_HOST_STATIC_LIBRARY := true

#Enable VNDK Compliance
BOARD_VNDK_VERSION:=current
RECOVERY_SNAPSHOT_VERSION := current
RAMDISK_SNAPSHOT_VERSION := current
Q_BU_DISABLE_MODULE := true

###### Dynamic Partition Handling ####
ifneq ($(strip $(BOARD_DYNAMIC_PARTITION_ENABLE)),true)
BOARD_BUILD_SYSTEM_ROOT_IMAGE := true
BOARD_VENDORIMAGE_PARTITION_SIZE := 1073741824
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 3221225472 #3G
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 5368709120 #5G
BOARD_PRODUCTIMAGE_PARTITION_SIZE := 838860800
ifeq ($(ENABLE_AB), true)
AB_OTA_PARTITIONS ?= system
endif
else
TARGET_COPY_OUT_PRODUCT := product
TARGET_COPY_OUT_SYSTEM_EXT := system_ext
BOARD_USES_PRODUCTIMAGE := true
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_SYSTEM_EXTIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_BUILD_SYSTEM_ROOT_IMAGE := false
BOARD_SUPER_PARTITION_SIZE := 12884901888
BOARD_SUPER_PARTITION_GROUPS := qti_dynamic_partitions
BOARD_QTI_DYNAMIC_PARTITIONS_PARTITION_LIST := system system_ext product
BOARD_QTI_DYNAMIC_PARTITIONS_SIZE := 6438256640
BOARD_EXT4_SHARE_DUP_BLOCKS := true
ifeq ($(ENABLE_AB), true)
AB_OTA_PARTITIONS ?= system system_ext product vbmeta_system
endif
endif

上一篇:notification+Android笔记


下一篇:一起学习HarmonyOS应用开发——基础篇(3)