MST8386 新增私有分区

android平台产品开发通常会,产品方案商通常会新增分区存放私有文件,key,bin等等。通过分析releaseimage.sh 文件,
可以看到函数release-images中会调用split-fs-partition,release-fs-partition,make-fs-partition 来创建system,
userdata,vendor,cache,tvservice,tvconfig,tvdatabase,tvcustomer等分区的img文件。

release-images 函数

在这里插入图片描述
make-fs-partition 和 split-fs-partition 最终会call 到build_image.sh 中的gernerate-fs-image来生成image,

gernerate-fs-image函数

# Generate system/userdate/cache/... image
function gernerate-fs-image()
{
    local PARTITION_NAME=$1
    local PARTITION_SIZE=$2
    local PARTITION_ANDROID=$3

    if [ "$PARTITION_NAME" == "userdata" ]; then
        local MOUNT_POINT=data
    else
        local MOUNT_POINT=$PARTITION_NAME
    fi

    local TARGET_OUT=$PRODUCT_OUT/$MOUNT_POINT
    if [ ! -d "$TARGET_OUT" ]; then
        echo "No $TARGET_OUT directory to gernerate image."
        return
    fi

    if [ "$PARTITION_NAME" == "system" -o "$PARTITION_NAME" == "userdata" -o "$PARTITION_NAME" == "cache" -o "$PARTITION_NAME" == "vendor" -o "$PARTITION_NAME" == "systembackup" ]; then
        if [  $PARTITION_NAME == "system" ]; then
            local IMAGE_INFO=$PRODUCT_OUT/obj/PACKAGING/systemimage_intermediates/system_image_info.txt
        else
            local IMAGE_INFO=$PRODUCT_OUT/obj/PACKAGING/"$PARTITION_NAME"_intermediates/"$PARTITION_NAME"_image_info.txt
        fi

        generate-userimage-prop-dictionary $IMAGE_INFO
        ./build/tools/releasetools/build_image.py $TARGET_OUT $IMAGE_INFO $PRODUCT_OUT/$PARTITION_NAME.img $PRODUCT_OUT/system
    else
        make_ext4fs -S $SELINUX_FC -l $PARTITION_SIZE -a $MOUNT_POINT $PRODUCT_OUT/$PARTITION_NAME.img $TARGET_OUT
    fi
}

build_image.py 和 make_ext4fs 就是最终制作img的命令。

手动制作image文件

以make_ext4fs 工具为例

root@ubuntu156:~/m8386$ mkdir -p out/target/product/CV8386H_A/factory                                                                           kehuanyu@ubuntu156:~/m8386$ make_ext4fs -l 209715200 -s -a factory  out/target/product/CV8386H_A/factory.img  out/target/product/CV8386H_A/factory/ Creating filesystem with parameters:
    Size: 209715200
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 6400
    Inode size: 256
    Journal blocks: 1024
    Label: 
    Blocks: 51200
    Block groups: 2
    Reserved block group size: 15
Created filesystem with 11/12800 inodes and 1865/51200 blocks
root@ubuntu156:~/m8386$ ls out/target/product/CV8386H_A/factory.img -al
-rw-r--r-- 1 kehuanyu kehuanyu 5939420 Sep  4 19:20 out/target/product/CV8386H_A/factory.img
root@ubuntu156:~/m8386$ 
root@ubuntu156:~/m8386$ rm -rvf out/target/product/CV8386H_A/factory/                                                                           removed directory: ‘out/target/product/CV8386H_A/factory/’
root@ubuntu156:~/m8386$ rm -rvf out/target/product/CV8386H_A/factory.img 
removed ‘out/target/product/CV8386H_A/factory.img’
root@ubuntu156:~/m8386$ mkdir -p out/target/product/CV8386H_A/factory                                                                          
root@ubuntu156:~/m8386$ 
root@ubuntu156:~/m8386$ make_ext4fs -l 0x0C800000 -s -a factory  out/target/product/CV8386H_A/factory.img  out/target/product/CV8386H_A/factory/
filesystem size too small
root@ubuntu156:~/m8386$ make_ext4fs -l 200M -s -a factory  out/target/product/CV8386H_A/factory.img  out/target/product/CV8386H_A/factory/      Creating filesystem with parameters:
    Size: 209715200
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 6400
    Inode size: 256
    Journal blocks: 1024
    Label: 
    Blocks: 51200
    Block groups: 2
    Reserved block group size: 15
Created filesystem with 11/12800 inodes and 1865/51200 blocks

制作主要有几个步骤:

  1. 创建对应文件目录factory;
  2. -l 指定分区文件的大小; // 注意带参数时为十进制数,不要为十六进制否则报错
  3. -a 指定挂载节点;
  4. 指定img文件名称;
  5. 指定打包目录;// 内置的私有文件提前放置

修改如下:

diff --git a/build_image.sh b/build_image.sh
index ed8130b..445ec0c 100755
--- a/build_image.sh
+++ b/build_image.sh
@@ -110,6 +110,8 @@ function get-configs()
     BOARD_TVCUSTOMERIMAGE_PARTITION_SIZE=$(get_build_var BOARD_TVCUSTOMERIMAGE_PARTITION_SIZE)
     BOARD_TVCERTIFICATEIMAGE_PARTITION_SIZE=$(get_build_var BOARD_TVCERTIFICATEIMAGE_PARTITION_SIZE)
 
+       BOARD_FACTORY_PARTITION_SIZE=$(get_build_var BOARD_FACTORY_PARTITION_SIZE)
+
     [ "$BOARD_SYSTEMBACKUPIMAGE" == "true" ] && BOARD_SYSTEMBACKUPIMAGE_PARTITION_SIZE=$(get_build_var BOARD_SYSTEMBACKUPIMAGE_PARTITION_SIZE)
     [ "$BOARD_CERTIFICATIONIMAGE" == "true" ] && BOARD_CERTIFICATEIMAGE_PARTITION_SIZE=$(get_build_var BOARD_CERTIFICATEIMAGE_PARTITION_SIZE)
     [ "$BOARD_TEEIMAGE" == "true" ] && BOARD_TEEIMAGE_PARTITION_SIZE=$(get_build_var BOARD_TEEIMAGE_PARTITION_SIZE)
@@ -160,6 +162,12 @@ function get-configs()
         echo "No tvcustomer partition size."
         exit 1
     fi
+
+    if [ -z "$BOARD_FACTORY_PARTITION_SIZE" ]; then
+        echo "No factory partition size."
+        exit 1
+    fi
+
     if [ "$BOARD_SYSTEMBACKUPIMAGE" == "true" ]; then
         if [ -z "$BOARD_SYSTEMBACKUPIMAGE_PARTITION_SIZE" ]; then
             echo "No systembackup partition size."
@@ -583,6 +591,8 @@ function gernerate-fs-image()
 
         generate-userimage-prop-dictionary $IMAGE_INFO
         ./build/tools/releasetools/build_image.py $TARGET_OUT $IMAGE_INFO $PRODUCT_OUT/$PARTITION_NAME.img $PRODUCT_OUT/system
+    elif [ "$PARTITION_NAME" == "factory" ]; then
+        make_ext4fs -l $PARTITION_SIZE -s -a $MOUNT_POINT $PRODUCT_OUT/$PARTITION_NAME.img $PRODUCT_OUT/$PARTITION_NAME
     else
         make_ext4fs -S $SELINUX_FC -l $PARTITION_SIZE -a $MOUNT_POINT $PRODUCT_OUT/$PARTITION_NAME.img $TARGET_OUT
     fi
diff --git a/releaseimage.sh b/releaseimage.sh
index 792804a..1792fb7 100755
--- a/releaseimage.sh
+++ b/releaseimage.sh
@@ -33,7 +33,10 @@ function release-images()
         make-fs-partition certificate $BOARD_CERTIFICATEIMAGE_PARTITION_SIZE false
     fi
     # You can make-fs-partition() or make-split-fs-partition() here...
-
+       if [ ! -x "$PRODUCT_OUT/factory" ];then
+               mkdir -p "$PRODUCT_OUT/factory"
+       fi
+       make-fs-partition factory $BOARD_FACTORY_PARTITION_SIZE true
 
     # Copy other prebuilt images
     if [ -d "$PRODUCT_OUT/images/prebuilts" ]; then

完成了分区文件的创建之后,还需要在文件系统启动前设置好fstab ,并指定分区大小

diff --git a/BoardConfig.mk b/BoardConfig.mk
index 33d4f5c..bd63d07 100755
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -42,15 +42,16 @@ TARGET_BOOTLOADER_BOARD_NAME := CV8386H_A
 #7.  optee          (6M)
 #8.  armfw          (64K)
 #9.  system         (1200M)
-#10. userdata       (4400M)
-#11. cache          (1G)
-#12. vendor         (300M)
-#13. tvservice      (160M)
-#14. tvconfig       (19M)
-#15. tvdatabase     (8M)
-#16. tvcustomer     (16M)
-#17. tvcertificate  (8M)
-#18. cm4            (512K)
+#10. userdata       (4200M)
+#11. factory        (200M)
+#12. cache          (1G)
+#13. vendor         (300M)
+#14. tvservice      (160M)
+#15. tvconfig       (19M)
+#16. tvdatabase     (8M)
+#17. tvcustomer     (16M)
+#18. tvcertificate  (8M)
+#10. cm4            (512K)
 BOARD_RECOVERYIMAGE_PARTITION_SIZE      := 0x02000000
 BOARD_BOOTIMAGE_PARTITION_SIZE          := 0x01400000
 BOARD_OPTEEIMAGE_PARTITION_SIZE         := 0x00600000
@@ -60,7 +61,8 @@ BOARD_RTPMIMAGE_PARTITION_SIZE          := 0x00040000
 BOARD_DTBIMAGE_PARTITION_SIZE           := 0x00100000
 BOARD_FRCIMAGE_PARTITION_SIZE           := 0x00100000
 BOARD_SYSTEMIMAGE_PARTITION_SIZE        := 1258291200
-BOARD_USERDATAIMAGE_PARTITION_SIZE      := 4613734400
+BOARD_USERDATAIMAGE_PARTITION_SIZE      := 4404019200
+BOARD_FACTORY_PARTITION_SIZE            := 209715200
 BOARD_CACHEIMAGE_PARTITION_SIZE         := 1073741824
 BOARD_VENDORIMAGE_PARTITION_SIZE        := 314572800
 BOARD_TVSERVICEIMAGE_PARTITION_SIZE     := 0x0A000000
diff --git a/fstab.m7221 b/fstab.m7221
index a8bf2c1..5802369 100755
--- a/fstab.m7221
+++ b/fstab.m7221
@@ -6,6 +6,7 @@
 
 /dev/block/platform/mstar_mci.0/by-name/system          /system             ext4      ro                                                    wait,re
 /dev/block/platform/mstar_mci.0/by-name/userdata        /data               ext4      noatime,nosuid,nodev                                  wait,ch
+/dev/block/platform/mstar_mci.0/by-name/factory         /factory            ext4      noatime,nosuid,nodev                                  wait,ch
 /dev/block/platform/mstar_mci.0/by-name/cache           /cache              ext4      noatime,nosuid,nodev                                  wait,ch
 /dev/block/platform/mstar_mci.0/by-name/vendor          /vendor             ext4      ro                                                    wait,re
 /dev/block/platform/mstar_mci.0/by-name/tvservice       /tvservice          ext4      ro                                                    wait

此处将userdata分区的200M大小挪給factory分区,并在fstab.m7221 指定挂载节点及其他属性。在init.m7221.rc 中完成mount

on fs
    mount_all /fstab.m7221

拓展
如果修改mstar 的supernova 分区的大小,就需要在supernova 的customized.mk 和 BoardConfig.mk 中同时修改大小。
在这里插入图片描述
在这里插入图片描述
需要重点关注releaseimage.sh,build_image.sh,make_usb_upgrade.sh脚本文件。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值