当前位置: 首页 > article >正文

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


http://www.kler.cn/a/472775.html

相关文章:

  • 上门按摩系统架构与功能分析
  • Node.js JXcore 打包教程
  • HTMLElement、customElements及元素拓展
  • 快速入门Spring Cloud Alibaba,轻松玩转微服务
  • php 多进程那点事,用 swoole 如何解决呢 ?
  • 使用高云小蜜蜂GW1N-2实现MIPI到LVDS(DVP)转换案例分享
  • 智慧农业应用场景|珈和科技高标准农田信息化监管平台解决方案
  • 后端服务集成ElasticSearch搜索功能技术方案
  • Java 后端开发常用的技术栈
  • 嵌入式软件C语言面试常见问题及答案解析(三)
  • ARM V7 A架构指令集:聚焦分支指令
  • Nginx实现接口复制
  • MDX语言的计算机基础
  • 《Hands on Large Language Models》(深入浅出大型语言模型)实战书探秘
  • AJAX技术入门与应用实践
  • IREE和TensorRT性能对比
  • 软件开发阶段说明
  • Linux_进程池
  • C# OpenCV机器视觉:角点检测
  • 【Uniapp-Vue3】Vue3的模板语法插值表达式用法
  • vulnhub靶场【DC系列】之7
  • n 维数组(张量)关于轴 axis 的理解
  • bash相关习题复习
  • Java语言的多线程编程
  • linux 查看服务、端口的命令
  • C# .NetCore 中使用 System.Text.Json 序列化 JSON 示例