本文以qcom msm8909 为例增加carrier分区,留文以备后忘:
1、修改分区表partition.xml
diff --git a/non_hlos/common/config/emmc/partition.xml b/non_hlos/common/config/emmc/partition.xml
index 74ca036..11f38bc 100755
--- a/non_hlos/common/config/emmc/partition.xml
+++ b/non_hlos/common/config/emmc/partition.xml
@@ -36,7 +36,9 @@
<partition label="boot" size_in_kb="32768" type="20117F86-E985-4357-B9EE-374BC1D8487D" bootable="false" readonly="true" filename="boot.img"/>
- <partition label="system" size_in_kb="819200" type="97D7B011-54DA-4835-B3C4-917AD6E73D74" bootable="false" readonly="true" filename="system.img" sparse="true"/>
+ <partition label="system" size_in_kb="716800" type="97D7B011-54DA-4835-B3C4-917AD6E73D74" bootable="false" readonly="true" filename="system.img" sparse="true"/>
+ <partition label="carrier" size_in_kb="40960" type="044f61e9-5826-4d9a-838a-dba8407859b8" bootable="false" readonly="false" filename=""/>
<partition label="persist" size_in_kb="32768" type="6C95E238-E343-4BA8-B489-8681ED22AD0B" bootable="false" readonly="true" filename="persist.img" sparse="true"/>
注: 如上的添加方式后续导致 wifi 无法开启的问题,后续通过如下修改解决,即将新增的分区(readonly="false")远离 system(readonly="true")分区,原因待查。
2、修改 fstab ,添加新分区
注意:
1)、针对 normal boot 和 recovery 两种情况,使用了不同的 fstab 文件,需要同步修改
2)、当 fstab.qcom 中添加的新分区是空白可写分区时,需要同步添加 formattable 标签,无此标签可能会导致手机无法启动
diff --git a/qcom/x400/default/fstab_AB_dynamic_partition.qti b/qcom/x400/default/fstab_AB_dynamic_partition.qti
index 1c2d443..1d51c8e 100644
--- a/qcom/x400/default/fstab_AB_dynamic_partition.qti
+++ b/qcom/x400/default/fstab_AB_dynamic_partition.qti
@@ -44,6 +44,7 @@ product /product
# Add fs_mgr flag - sysfs_path=/sys/devices/platform/soc/xxxx.[ufshc|sdhci] to userdata entry, based on UFS|eMMC device.
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt latemount,wait,check,formattable,quota,reservedsize=128M,fileencryption=aes-256-xts:aes-256-cts:v2+inlinecrypt_optimized+wrappedkey_v0,metadata_encryption=aes-256-xts:wrappedkey_v0,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs
/dev/block/bootdevice/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,barrier=1 wait
+/dev/block/bootdevice/by-name/carrier /mnt/carrier ext4 noatime,nosuid,nodev,barrier=1 wait,check,formattable
/dev/block/bootdevice/by-name/misc /misc emmc defaults defaults
/devices/platform/soc/4784000.sdhci/mmc_host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto,encryptable=footer
/devices/platform/soc/1da4000.ufshc_card/host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto,encryptable=footer
diff --git a/qcom/x400/emmc/fstab_AB_dynamic_partition.qti b/qcom/x400/emmc/fstab_AB_dynamic_partition.qti
index d5683f6..bfe6a66 100644
--- a/qcom/x400/emmc/fstab_AB_dynamic_partition.qti
+++ b/qcom/x400/emmc/fstab_AB_dynamic_partition.qti
@@ -44,6 +44,7 @@ product /product
# Add fs_mgr flag - sysfs_path=/sys/devices/platform/soc/xxxx.[ufshc|sdhci] to userdata entry, based on UFS|eMMC device.
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier,inlinecrypt latemount,wait,check,formattable,quota,reservedsize=128M,fileencryption=aes-256-xts:aes-256-cts:v2+emmc_optimized+wrappedkey_v0,metadata_encryption=aes-256-xts:wrappedkey_v0,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs
/dev/block/bootdevice/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,barrier=1 wait
+/dev/block/bootdevice/by-name/carrier /mnt/carrier ext4 noatime,nosuid,nodev,barrier=1 wait,check,formattable
/dev/block/bootdevice/by-name/misc /misc emmc defaults defaults
/devices/platform/soc/4784000.sdhci/mmc_host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto,encryptable=footer
/devices/platform/soc/1da4000.ufshc_card/host* /storage/sdcard1 vfat nosuid,nodev wait,voldmanaged=sdcard1:auto,encryptable=footer
diff --git a/fstab.qcom b/fstab.qcom
index 2a063a1..4cd3d70 100755
--- a/fstab.qcom
+++ b/fstab.qcom
@@ -11,3 +11,6 @@
/dev/block/zram0 none swap defaults zramsize=268435456
/devices/platform/soc/7864900.sdhci/mmc_host* /storage/sdcard vfat nosuid,nodev wait,voldmanaged=sdcard:auto,encryptable=footer
/dev/block/bootdevice/by-name/config /frp emmc defaults defaults
+
+/dev/block/bootdevice/by-name/carrier /carrier ext4 nosuid,nodev,noatime,barrier=1,noauto_da_alloc,discard wait,check,formattable
diff --git a/recovery.fstab b/recovery.fstab
index 4368425..55d5155 100644
--- a/recovery.fstab
+++ b/recovery.fstab
@@ -51,3 +51,5 @@
/dev/block/bootdevice/by-name/sec /sec emmc defaults defaults
/dev/block/bootdevice/by-name/devinfo /devinfo emmc defaults defaults
+/dev/block/bootdevice/by-name/carrier /carrier ext4 noatime,nosuid,nodev,barrier=1,data=ordered wait,check
3、修改rc权限
在当前项目的 init rc 中添加新增分区挂载目录的用户组修改和读写权限修改语句
注意:这里曾尝试将 mount 语句直接添加在如下 init rc 文件内,而不是添加在上述的 fstab 文件中,但是实测未能成功 mount,原因未知。
diff --git a/init.target.rc b/init.target.rc
index dd71e45..48f7368 100755
--- a/init.target.rc
+++ b/init.target.rc
@@ -58,6 +58,21 @@
wait /dev/block/bootdevice/by-name/modem
mount vfat /dev/block/bootdevice/by-name/modem /firmware ro context=u:object_r:firmware_file:s0,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337
+ # XXX BEGIN
+ wait /dev/block/bootdevice/by-name/carrier
+ chown system system /carrier
+ chmod 0771 /carrier
+ restorecon_recursive /carrier
+ # XXX END
on post-fs-data
mkdir /data/tombstones 0771 system system
4、其他分区大小修正
qc8x09/platform/vendor/qcom/ferrum (path: ./LINUX/android/device/qcom/msm8909/)
由于项目没有多余的空间,需要从其它已有分区中匀出空间来给新分区,这里选则了 system 分区,重定义 system 分区大小如下
diff --git a/BoardConfig.mk b/BoardConfig.mk
index 6fcd82c..070da13 100644
--- a/BoardConfig.mk
+++ b/BoardConfig.mk
@@ -114,7 +114,11 @@
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x01000000
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x01000000
-BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800
+# XXX BEGIN
+# modify by xxx 20200630
+# shrink system from 800M to 700M for new added partitions carrier(40M)
+BOARD_SYSTEMIMAGE_PARTITION_SIZE := 734003200
+# XXX END
BOARD_USERDATAIMAGE_PARTITION_SIZE := 1038090240
BOARD_USBIMAGE_PARTITION_SIZE := 1020000000
BOARD_CACHEIMAGE_PARTITION_SIZE := 268435456
5、增加selinux权限
qc8x09/device/qcom/sepolicy (path: ./LINUX/android/device/qcom/sepolicy/)
为新分区添加必要的 selinux 规则语句
diff --git a/Android.mk b/Android.mk
index f7836f6..7a1e140 100644
--- a/Android.mk
+++ b/Android.mk
@@ -5,5 +5,6 @@
device/qcom/sepolicy \
device/qcom/sepolicy/common \
device/qcom/sepolicy/test \
- device/qcom/sepolicy/$(TARGET_BOARD_PLATFORM)
+ device/qcom/sepolicy/$(TARGET_BOARD_PLATFORM) \
+ device/qcom/sepolicy/$(TARGET_PRODUCT)
endif
diff --git a/x400/file_contexts b/x400/file_contexts
new file mode 100644
index 0000000..04ca251
--- /dev/null
+++ b/x400/file_contexts
@@ -0,0 +1,6 @@
+##################################
+# Primary storage device nodes
+
+/carrier(/.*)? u:object_r:persist_file:s0
附录:
qcom 建议步骤:how to add a new partition?
这个是高通 case 中给出的新增分区步骤
If customer want to create a new partition for their own use, here are some steps can be followed.
1.add a new line in partition.xml, you can following the above item of partition.
2.replace the GUID for your partition, you can generate a unique GUID from www.guidgen.com website.
3.set the correct partition size and name.
4.set the correct property of this partition for "bootable" and "readonly" items.
Here is an example of oem partition:
<partition label="oem" size_in_kb="4096" type="A695B44A-F1D3-4558-8D37-65CFC0596ABD" bootable="false" readonly="true" filename=""/>
5.
6.run the python script to generate the GPT header file and rawprogram*.xml for download.
# python ../common/build/build.py
7.
kba-200507195814_2_how_to_add_one_new_partition_in_dynamic_partition_for_android_q..pdf