Android实战经验篇-增加系统分区

系列文章转如下链接:

Android Display Graphics系列文章-汇总

Android实战经验篇-系列文章汇总

本文主要包括部分:

一、Android分区说明

1.1 系统分区查看

1.2 分区表修改

1.3 验证新分区

二、源码修改

2.1 generate_extra_images

2.2 fstab

2.3 file_contexts等

Android 系统上添加新的可挂载分区,包括如何修改分区表和 Android 源码及如何验证新分区。本操作经验在Android13、Android14上已验证。

一、Android分区说明

1.1 系统分区查看

从设备端看,一般用df -h 可以查看各分区的情况, 使用mount查看各分区的挂载情况。

例如以下是基线代码原始分区情况

lahaina:/ # df -h
Filesystem       Size Used Avail Use% Mounted on
tmpfs            3.5G 1.7M  3.5G   1% /dev
tmpfs            3.5G    0  3.5G   0% /mnt
/dev/block/sda9   11M 196K   11M   2% /metadata
/dev/block/dm-2  0.9G 998M  3.0M 100% /
/dev/block/dm-5  3.1G 309M  2.8G  10% /mnt/scratch
overlay          3.1G 309M  2.8G  10% /system
overlay          3.1G 309M  2.8G  10% /system_ext
overlay          3.1G 309M  2.8G  10% /product
overlay          3.1G 309M  2.8G  10% /vendor
overlay          3.1G 309M  2.8G  10% /odm
tmpfs            3.5G  12K  3.5G   1% /apex
tmpfs            3.5G 488K  3.5G   1% /linkerconfig
/dev/block/sdf8   27M 1.7M   25M   7% /mnt/vendor/persist
/dev/block/sdg1  220M 163M   57M  75% /vendor/firmware_mnt
/dev/block/sdg5   59M  31M   28M  52% /vendor/dsp
/dev/block/sdf9   64M 2.6M   61M   5% /vendor/bt_firmware
/dev/block/sdg17  30M    0   30M   0% /mnt/vendor/qmcs
/dev/block/dm-6  101G 7.6G   94G   8% /data
tmpfs            3.5G    0  3.5G   0% /data_mirror
/dev/fuse        101G 7.6G   94G   8% /mnt/user/0/emulated

1.2 分区表修改

Qcom的分区表一般位于解包工具的common/config/目录下,例如partition_ext_ddm.xml 位于对应版本的工具包的common/config/ufs 路径下。

如果新增一个4194304KB(4096MB)的new分区,需要在partition_ext_ddm.xml中修改如下。Xml中分区表的配置

<!-- This is LUN 0 - HLOS LUN" -->
<physical_partition>
        <partition label="misc" size_in_kb="1024" type="82ACC91F-357C-4A68-9C8F-689E1B1A23A1" bootable="false" readonly="false" filename="" />
        <partition label="new" size_in_kb="4194304" type="88036CD5-03D5-42BB-8ED1-37E5A88BAA45" bootable="false" readonly="false" filename="new.img" />
        <partition label="metadata" size_in_kb="16384" type=" 988A98C9-2910-4123-AAEC-1CF6B1BC28F9" bootable="false" readonly="false" filename="metadata.img" sparse="true"/>
        <partition label="vbmeta_system_a" size_in_kb="64" type="1344859D-3A6A-4C14-A316-9E696B3A5400" bootable="false" readonly="true" filename="vbmeta_system.img"/>
        <partition label="vbmeta_system_b" size_in_kb="64" type="FE3AB853-5B66-4D4A-BF85-8D90AF1C2C4A" bootable="false" readonly="true" filename="vbmeta_system.img"/>
        <partition label="teedata" size_in_kb="16384" type="4A5DE742-745E-4FDD-BFD8-B6A7AC638772" bootable="false" readonly="false" filename="" />
        <partition label="super" size_in_kb="3276800" type="89A12DE1-5E41-4CB3-8B4C-B1441EB5DA38" bootable="false" readonly="false" filename="super.img" sparse="true"/>
</physical_partition>

分区表参数描述

|------------|--------------------------------------------------------------|
| 参数 | 描述 |
| label | 标签,表示分区名称。 |
| size_in_kb | 分区大小,单位:KB。 |
| type | 分区类型。每个分区对应的值不同,用户设置时可自行修改,修改时长 度与其他分区保持一致且有别于其他分区 type 值即可。 |
| bootable | 分区是否可启动。建议将其设置为 false。 false:不可启动 true:可启动 |
| readonly | 分区的可读写性,取值如下: false:可读写分区 true:只读分区 |
| filename | 镜像文件。用于设置在使用 QFIL 工具下载时是否需要下载该镜像文件。 若不需要下载,设置为空即可。 |
| sparse | 打包过程中是否拆分分区镜像。 true:拆分 false:不拆分 |

说明:这里把new分区添加到了misc 和metadata之间,在super之前,可以避免后续因为super变动影响到这个分区。

1.3 验证新分区

在 Windows 下执行如下 ADB 命令验证分区是否添加成功:

adb shell 
su 
ls -al dev/block/by-name/ | grep new

若出现如下图所示 new 分区,表示分区添加成功:

lahaina:/ # ls -al dev/block/by-name/ | grep new
lrwxrwxrwx 1 root root   15 1970-01-03 07:22 new -> /dev/block/sda9

执行如下命令验证已添加分区是否正常挂载:

adb shell 
su 
mount | grep new 

若命令 mount 后显示有内容,则表示分区挂载成功。从该命令行回显的内容中可以看到,新分区 new 挂载在/mnt/vendor/new 目录下

lahaina:/ # mount | grep new
/dev/block/sda9 on /mnt/vendor/new type ext4 (rw,seclabel,nosuid,nodev,noatime)

执行如下命令检查新分区是否具有所需操作权限:

adb shell //执行 adb 命令进入设备 
su    //获取 su 权限 
cd mnt/vendor/new //进入挂载路径 
touch new.txt    //创建 new 文件(表示具有创建文件的权限) 
mkdir new   //创建 new 文件夹(表示具有创建文件夹的权限) 
ls -al     //查看 new 文件和 new 文件夹是否创建成功 
rm -rf *   //删除此目录下的所有内容(表示具有删除权限) 
ls -al      //查看是否删除成功

二、源码修改

2.1 generate_extra_images

修改target_ap/device/qcom/common/generate_extra_images.mk文件,在编译时生成new.img

+++ b/UM.9.14/device/qcom/common/generate_extra_images.mk
@@ -99,6 +99,36 @@ metadataimage: $(INSTALLED_METADATAIMAGE_TARGET)
 
 endif
 
+ifneq ($(strip $(BOARD_NEWIMAGE_PARTITION_SIZE)),)
+
+TARGET_OUT_NEW := $(PRODUCT_OUT)/new
+
+INSTALLED_NEWIMAGE_TARGET := $(PRODUCT_OUT)/new.img
+
+define build-newimage-target
+    $(call pretty,"Target new fs image: $(INSTALLED_NEWIMAGE_TARGET)")
+    @mkdir -p $(TARGET_OUT_NEW)
+    $(hide)PATH=$(HOST_OUT_EXECUTABLES):$${PATH} $(MKEXTUSERIMG) $(TARGET_OUT_NEW) $@ ext4 new $(BOARD_NEWIMAGE_PARTITION_SIZE)
+    $(hide) chmod a+r $@
+    $(hide) $(call assert-max-image-size,$(INSTALLED_NEWIMAGE_TARGET),$(BOARD_NEWIMAGE_PARTITION_SIZE))
+endef
+#$(hide) $(call assert-max-image-size,$(INSTALLED_NEWIMAGE_TARGET),$(BOARD_NEWIMAGE_PARTITION_SIZE))
+#$(hide)PATH=$(HOST_OUT_EXECUTABLES):$${PATH} $(MKEXTUSERIMG) -s $(TARGET_OUT_NEW) $@ ext4 new $(BOARD_NEWIMAGE_PARTITION_SIZE)
+
+#$(INSTALLED_NEWIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS)
+#	$(build-newimage-target)
+$(INSTALLED_NEWIMAGE_TARGET): $(MKEXTUSERIMG) $(MAKE_EXT4FS)
+	$(build-newimage-target)
+
+ALL_DEFAULT_INSTALLED_MODULES += $(INSTALLED_NEWIMAGE_TARGET)
+ALL_MODULES.$(LOCAL_MODULE).INSTALLED += $(INSTALLED_NEWIMAGE_TARGET)
+droidcore: $(INSTALLED_NEWIMAGE_TARGET)
+
+.PHONY: newimage
+newimage: $(INSTALLED_NEWIMAGE_TARGET)
+
+endif

2.2 fstab

修改fstab,使init在挂载分区时,可以挂载new分区,并挂载到/mnt/vendor/new路径下。

 /dev/block/bootdevice/by-name/persist                   /mnt/vendor/persist    ext4    noatime,nosuid,nodev,barrier=1                       wait
+/dev/block/bootdevice/by-name/new                       /mnt/vendor/new        ext4    noatime,nosuid,nodev,barrier=1  

2.3 file_contexts等

修改init.rc 使其创建 /mnt/vendor/new/路径并restorecon此路径。

在target_ap/device/qcom/sepolicy_vndr/qva/vendor/lahaina/file_contexts 文件中增加设备的context;

注意:这里的/dev/block/platform/soc/4744000.sdhci 具体路径要根据自己项目来。

例如:

 /(vendor|system/vendor)/bin/qwesd                                                  u:object_r:vendor_qwesd_exec:s0
+/dev/block/platform/soc/4744000.sdhci/by-name/new                                  u:object_r:vendor_persist_block_device:s0

详细patch修改见如下链接:

Android Display Graphics系列文章-汇总

Android实战经验篇-系列文章汇总

相关推荐
@OuYang2 小时前
Audio音频输出通道
android
ta叫我小白3 小时前
Kotlin 中 forEach 的 return@forEach 的使用误区
android·开发语言·kotlin
archko3 小时前
试用kotlin multiplatform
android·开发语言·kotlin
C4rpeDime4 小时前
当歌 - RSS 订阅分发平台开发
android
大雄野比5 小时前
UOS系统mysql服务安装
android·mysql·adb
yozyyyqls6 小时前
自定义Compose Pager实现电影卡片列表
android
张二三6 小时前
flutter 开发笔记(九):原生桥接
android·flutter·ios
梅名智6 小时前
Android studio gradle与gradle插件
android·ide·android studio
Hacker_Fuchen7 小时前
攻防世界 ics-07
android
aikongmeng8 小时前
flutter doctor --android-licenses 错误提示
android·flutter