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
制作主要有几个步骤:
- 创建对应文件目录factory;
- -l 指定分区文件的大小; // 注意带参数时为十进制数,不要为十六进制否则报错
- -a 指定挂载节点;
- 指定img文件名称;
- 指定打包目录;// 内置的私有文件提前放置
修改如下:
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脚本文件。