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实战经验篇-系列文章汇总

相关推荐
幻雨様2 小时前
UE5多人MOBA+GAS 45、制作冲刺技能
android·ue5
Jerry说前后端4 小时前
Android 数据可视化开发:从技术选型到性能优化
android·信息可视化·性能优化
Meteors.5 小时前
Android约束布局(ConstraintLayout)常用属性
android
alexhilton5 小时前
玩转Shader之学会如何变形画布
android·kotlin·android jetpack
whysqwhw9 小时前
安卓图片性能优化技巧
android
风往哪边走9 小时前
自定义底部筛选弹框
android
Yyyy48210 小时前
MyCAT基础概念
android
Android轮子哥11 小时前
尝试解决 Android 适配最后一公里
android
雨白12 小时前
OkHttp 源码解析:enqueue 非同步流程与 Dispatcher 调度
android
风往哪边走12 小时前
自定义仿日历组件弹框
android