Android-添加分区

本文的目标是在Raspberry 4B上添加一个test分区。

Android Code Base:

https://github.com/raspberry-vanilla/android_local_manifest/tree/android-12.1

添加一个分区需要的步骤:

  1. 配置test分区的大小和分区格式
  2. 配置make testimage编译脚本
  3. 在out下创建test目录
  4. 配置SEPolicy
  5. 将test.img打包到固件
  6. 启动时挂载test分区

牵涉到的文件:

  1. build/make/core/main.mk
  2. build/make/core/Makefile
  3. build/make/core/envsetup.mk
  4. build/make/tools/releasetools/build_image.py
  5. build/make/tools/releasetools/common.py
  6. build/make/core/board_config.mk
  7. BoardConfig.mk
  8. system/core/rootdir/Android.mk
  9. device.te
  10. file_contexts
  11. mkimg.sh
  12. fstab.rpi4

代码修改:

配置test分区大小和类型

BoardConfig.mk

@@ -61,7 +61,9 @@ BOARD_BOOTIMAGE_PARTITION_SIZE := 134217728 # 128M
 BOARD_SYSTEMIMAGE_PARTITION_SIZE := 2147483648 # 2048M
 BOARD_USERDATAIMAGE_PARTITION_SIZE := 134217728 # 128M
 BOARD_VENDORIMAGE_PARTITION_SIZE := 268435456 # 256M
+BOARD_TESTIMAGE_PARTITION_SIZE := 134217728 #128M
 BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE := ext4
+BOARD_TESTIMAGE_FILE_SYSTEM_TYPE := ext4
 TARGET_USERIMAGES_SPARSE_EXT_DISABLED := true
 TARGET_USERIMAGES_USE_EXT4 := true

添加test目标,支持make testimage编译

build/make/core/main.mk

@@ -1512,6 +1512,9 @@ endif
.PHONY: cacheimage
cacheimage: $(INSTALLED_CACHEIMAGE_TARGET)
 
+.PHONY: testimage
+testimage: $(INSTALLED_TESTIMAGE_TARGET)
+
.PHONY: bptimage
bptimage: $(INSTALLED_BPTIMAGE_TARGET)
 
@@ -1588,6 +1591,7 @@ droidcore-unbundled: $(filter $(HOST_OUT_ROOT)/%,$(modules_to_install)) \
    $(INSTALLED_VBMETA_VENDORIMAGE_TARGET) \
    $(INSTALLED_USERDATAIMAGE_TARGET) \
    $(INSTALLED_CACHEIMAGE_TARGET) \
+    $(INSTALLED_TESTIMAGE_TARGET) \
    $(INSTALLED_BPTIMAGE_TARGET) \
    $(INSTALLED_VENDORIMAGE_TARGET) \
    $(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \

make testimage 的脚本实现

build/make/core/Makefile

@@ -1634,6 +1634,10 @@ $(if $(filter $(2),cache),\
     $(hide) echo "cache_selinux_fc=$(SELINUX_FC)" >> $(1)
     $(hide) echo "building_cache_image=$(BUILDING_CACHE_IMAGE)" >> $(1)
 )
+$(if $(filter $(2),test),\
+    $(if $(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "test_fs_type=$(BOARD_TESTIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
+    $(if $(BOARD_TESTIMAGE_PARTITION_SIZE),$(hide) echo "test_size=$(BOARD_TESTIMAGE_PARTITION_SIZE)" >> $(1))
+)
 $(if $(filter $(2),vendor),\
     $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "vendor_fs_type=$(BOARD_VENDORIMAGE_FILE_SYSTEM_TYPE)" >> $(1))
     $(if $(BOARD_VENDORIMAGE_FILE_SYSTEM_COMPRESS),$(hide) echo "vendor_f2fs_compress=$(BOARD_VENDORIMAGE_FILE_SYSTEM_COMPRESS)" >> $(1))
@@ -2874,6 +2878,37 @@ platform:
 .PHONY: platform-java
 platform-java:
        echo "Warning: 'platform-java' is obsolete"
+
+# -----------------------------------------------------------------
+# test partition image
+INTERNAL_TESTIMAGE_FILES := \
+    $(filter $(TARGET_OUT_TEST)/%,$(ALL_DEFAULT_INSTALLED_MODULES))
+
+testimage_intermediates := \
+    $(call intermediates-dir-for,PACKAGING,test)
+BUILT_TESTIMAGE_TARGET := $(PRODUCT_OUT)/test.img
+
+define build-testimage-target
+  $(call pretty,"Target test fs image: $(INSTALLED_TESTIMAGE_TARGET)")
+  @mkdir -p $(TARGET_OUT_TEST)
+  @mkdir -p $(testimage_intermediates) && rm -rf $(testimage_intermediates)/test_image_info.txt
+  $(call generate-image-prop-dictionary, $(testimage_intermediates)/test_image_info.txt,test,skip_fsck=true)
+  PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$PATH \
+      $(BUILD_IMAGE) \
+          $(TARGET_OUT_TEST) $(testimage_intermediates)/test_image_info.txt \
+          $(INSTALLED_TESTIMAGE_TARGET) $(TARGET_OUT)
+  $(call assert-max-image-size,$(INSTALLED_TESTIMAGE_TARGET),$(BOARD_TESTIMAGE_PARTITION_SIZE))
+endef
+
+# We just build this directly to the install location.
+INSTALLED_TESTIMAGE_TARGET := $(BUILT_TESTIMAGE_TARGET)
+$(INSTALLED_TESTIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_TESTIMAGE_FILES)
+       $(build-testimage-target)
+
+.PHONY: testimage-nodeps
+testimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS)
+       $(build-testimage-target)
+
 
 # -----------------------------------------------------------------
 # data partition image

配置test文件输出目录的环境变量

build/make/core/envsetup.sh

@@ -618,6 +619,7 @@ $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS := $(TARGET_OUT_DATA
   $(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_METRIC_TESTS \
 
 TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache
+TARGET_OUT_TEST := $(PRODUCT_OUT)/test
 .KATI_READONLY := TARGET_OUT_CACHE
 
 TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)

将test 目录打包为test.img

build/make/tools/releasetools/build_image.py

@@ -680,6 +680,9 @@ def ImagePropFromGlobalDict(glob_dict, mount_point):
     copy_prop("cache_fs_type", "fs_type")
     copy_prop("cache_size", "partition_size")
     copy_prop("cache_selinux_fc", "selinux_fc")
+  elif mount_point == "test":
+    copy_prop("test_fs_type", "fs_type")
+    copy_prop("test_size", "partition_size")
   elif mount_point == "vendor":
     copy_prop("avb_vendor_hashtree_enable", "avb_hashtree_enable")
     copy_prop("avb_vendor_add_hashtree_footer_args",
@@ -911,6 +914,8 @@ def main(argv):
       mount_point = "data"
     elif image_filename == "cache.img":
       mount_point = "cache"
+    elif image_filename == "test.img":
+      mount_point = "test"
     elif image_filename == "vendor.img":
       mount_point = "vendor"
     elif image_filename == "odm.img":

build/make/tools/releasetools/common.py

@@ -811,6 +811,7 @@ def LoadInfoDict(input_file, repacking=False):
   makeint("vendor_size")
   makeint("userdata_size")
   makeint("cache_size")
+  makeint("test_size")
   makeint("recovery_size")
   makeint("fstab_version")

build/make/core/board_config.mk

@@ -84,6 +84,7 @@ _board_strip_readonly_list += BOARD_VENDOR_DLKMIMAGE_PARTITION_SIZE
 _board_strip_readonly_list += BOARD_VENDOR_DLKMIMAGE_FILE_SYSTEM_TYPE
 _board_strip_readonly_list += BOARD_ODM_DLKMIMAGE_PARTITION_SIZE
 _board_strip_readonly_list += BOARD_ODM_DLKMIMAGE_FILE_SYSTEM_TYPE
+_board_strip_readonly_list += BOARD_TESTIMAGE_PARTITION_SIZE
 
 # Logical partitions related variables.
 _board_strip_readonly_list += BOARD_SYSTEMIMAGE_PARTITION_RESERVED_SIZE

在rootdir创建test目录

@@ -154,6 +154,7 @@ ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
 else
   LOCAL_POST_INSTALL_CMD += ; ln -sf /data/cache $(TARGET_ROOT_OUT)/cache
 endif
+LOCAL_POST_INSTALL_CMD += ; mkdir -p $(TARGET_ROOT_OUT)/test
 ifdef BOARD_ROOT_EXTRA_SYMLINKS
 # BOARD_ROOT_EXTRA_SYMLINKS is a list of <target>:<link_name>.
   LOCAL_POST_INSTALL_CMD += $(foreach s, $(BOARD_ROOT_EXTRA_SYMLINKS),\

添加/test 目录SE Policy类型

device.te

@@ -1 +1,2 @@
 type vcio_device, dev_type, mlstrustedobject;
+type test_file, dev_type;

file_contexts

@@ -50,3 +50,6 @@
 
 # V4L2
 /vendor/bin/hw/android\.hardware\.media\.c2@1\.0-service-v4l2(.*)?           u:object_r:mediacodec_exec:s0
+
+# Label
+/test(/.*)? u:object_r:test_file:s0

添加打包部分

原始树莓派分区 boot system vendor userdata, 全部是主分区。
新增一个分区情况如下, 由于一个磁盘主分区最多只能4个,树莓派刚好用完,增加一个则需要将主分区换位扩展分区,在扩展分区创建逻辑分区。
修改脚本后,启动分区 boot 依然使用主分区p1, system使用主分区p2
创建一个扩展分区p3,用于创建逻辑分区 (vendor test 三个逻辑分区分别为p5 p6), userdata 主分区 p3 

mkimg.sh

@@ -30,11 +30,19 @@ echo 2
 echo
 echo +2048M
 echo n
-echo p
+echo e
 echo 3
 echo
+echo +512M
+echo n
+echo l
+echo
 echo +256M
 echo n
+echo l
+echo
+echo +128M
+echo n
 echo p
 echo
 echo
@@ -60,7 +69,9 @@ sudo dd if=${OUTDIR}/boot.img of=/dev/mapper/${LOOPDEV}p1 bs=1M
 echo "Copying system..."
 sudo dd if=${OUTDIR}/system.img of=/dev/mapper/${LOOPDEV}p2 bs=1M
 echo "Copying vendor..."
-sudo dd if=${OUTDIR}/vendor.img of=/dev/mapper/${LOOPDEV}p3 bs=1M
+sudo dd if=${OUTDIR}/vendor.img of=/dev/mapper/${LOOPDEV}p5 bs=1M
+echo "Copying cchao..."
+sudo dd if=${OUTDIR}/test.img of=/dev/mapper/${LOOPDEV}p6 bs=1M
 echo "Creating userdata..."
 sudo mkfs.ext4 /dev/mapper/${LOOPDEV}p4 -I 512 -L userdata

添加启动挂载

修改后,分区编号有变,需要对应起来

fstab.rpi4

#<src>                                   <mnt_point>  <type>  <mnt_flags and options>                             <fs_mgr_flags>
 /dev/block/mmcblk0p2                     /system      ext4    ro,barrier=1                                        wait,first_stage_mount
-/dev/block/mmcblk0p3                     /vendor      ext4    rw,barrier=1                                        wait,first_stage_mount
+/dev/block/mmcblk0p5                     /vendor      ext4    rw,barrier=1                                        wait,first_stage_mount
+/dev/block/mmcblk0p6                     /test        ext4    rw,barrier=1                                        wait,first_stage_mount
 /dev/block/mmcblk0p4                     /data        ext4    noatime,nosuid,nodev,nomblk_io_submit,errors=panic  wait,check,formattable,encryptable=footer,quota

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值