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实战经验篇-系列文章汇总
相关文章:
Android实战经验篇-增加系统分区
系列文章转如下链接: Android Display Graphics系列文章-汇总 Android实战经验篇-系列文章汇总 本文主要包括部分: 一、Android分区说明 1.1 系统分区查看 1.2 分区表修改 1.3 验证新分区 二、源码修改 2.1 generate_extra_images 2.2 fstab 2…...
深入学习 Python 量化编程
深入学习 Python 量化编程 第一章:Python 基础与量化编程环境搭建 1.1 安装必要的库 首先,你需要安装一些在量化编程中常用的 Python 库。可以通过以下命令安装这些库: pip install numpy pandas matplotlib yfinance backtrader scikit-…...

机器学习笔记——特征工程
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的特征工程方法、正则化方法和简要介绍强化学习。 文章目录 特征工程(Fzeature Engineering)1. 特征提取ÿ…...

4种革新性AI Agent工作流设计模式全解析
文章目录 导读:AI Agent的四种关键设计模式如下:1. 反思2. 工具使用3. 规划4. 多Agent协作 总结内容简介: 导读: AI Agent是指能够在特定环境中自主执行任务的人工智能系统,不仅接收任务,还自主制定和执行…...
【入门级】计算机网络学习
网络安全:前端开发者必知:Web安全威胁——XSS与CSRF攻击及其防范-CSDN博客 三次握手四次挥手:前端网络—三次握手四次挥手_前端三次握手-CSDN博客 http协议和https协议的区别:前端网络—http协议和https协议的区别-CSDN博客 网…...
安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?
Jenkins 是一款功能强大的自动化服务器,在持续集成与交付(CI/CD)领域应用广泛。不过,用户在使用过程中,尤其是首次接触该系统或系统重启后,常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…...

day08_Kafka
文章目录 day08_Kafka课程笔记一、今日课程内容一、消息队列(了解)**为什么消息队列就像是“数据的快递员”?****实际意义**1、产生背景2、消息队列介绍2.1 常见的消息队列产品2.2 应用场景2.3 消息队列中两种消息模型 二、Kafka的基本介绍1、…...

安装conda 环境
conda create -n my_unet5 python3.8 (必须设置3.8版本) conda activate my_unet5...

【dockerros2】ROS2节点通信:docker容器之间/docker容器与宿主机之间
🌀 一个中大型ROS项目常需要各个人员分别完成特定的功能,而后再组合部署,而各人员完成的功能常常依赖于一定的环境,而我们很难确保这些环境之间不会相互冲突,特别是涉及深度学习环境时。这就给团队项目的部署落地带来了…...
使用外网访问在群晖中搭建思源docker
还是要折腾,之前发现用公网IP可以访问就没有折腾,今天ip变了,用不了了,一搜,发现有方法可以用域名访问,哎,太好了! 原文:分享我在 群晖 docker 部署 思源笔记 步骤 - 链…...

深度学习中的EMA技术:原理、实现与实验分析
深度学习中的EMA技术:原理、实现与实验分析 1. 引言 指数移动平均(Exponential Moving Average, EMA)是深度学习中一种重要的模型参数平滑技术。本文将通过理论分析和实验结果,深入探讨EMA的实现和效果。 深度学习中的EMA技术:原理、实现与…...

win32汇编环境,窗口程序中对按钮控件常用操作的示例
;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…...
CentOS 7.9 通过 yum 安装 Docker
文章目录 前言一、删除已安装的 Docker二、网络设置三、设置 yum 源,并安装依赖四、设置 Docker 仓库五、安装及使用 Docker六、镜像仓库总结 前言 CentOS 7.9 过了维护期,Docker 官方文档没有了相关的安装文档。记录一下,备用! …...

【开源免费】基于Vue和SpringBoot的英语知识应用网站(附论文)
本文项目编号 T 138 ,文末自助获取源码 \color{red}{T138,文末自助获取源码} T138,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

工具推荐:PDFgear——免费且强大的PDF编辑工具 v2.1.12
PDFgear——免费且强大的PDF编辑工具 v2.1.12 软件简介 PDFgear 是一款 完全免费的 PDF 软件,支持 阅读、编辑、转换、合并 以及 跨设备签署 PDF 文件,无需注册即可使用。它提供了丰富的 PDF 处理功能,极大提升了 PDF 文件管理的便捷性和效…...

Web渗透测试之XSS跨站脚本 防御[WAF]绕过手法
目录 XSS防御绕过汇总 参考这篇文章绕过 XSS payload XSS防御绕过汇总 服务端知道有网络攻击或者xss攻 Html...

MMDetection框架下的常见目标检测与分割模型综述与实践指南
目录 综述与实践指南 SSD (Single Shot MultiBox Detector) 基本配置和使用代码 RetinaNet 基本配置和使用代码 Faster R-CNN 基本配置和使用代码 Mask R-CNN 基本配置和使用代码 Cascade R-CNN 基本配置和使用代码 总结 综述与实践指南 MMDetection是一个基于Py…...

怎么实现Redis的高可用?
大家好,我是锋哥。今天分享关于【怎么实现Redis的高可用?】面试题。希望对大家有帮助; 怎么实现Redis的高可用? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 为了实现 Redis 的高可用性,我们需要保证在发…...

OpenCV实现Kuwahara滤波
Kuwahara滤波是一种非线性的平滑滤波技术,其基本原理在于通过计算图像模板中邻域内的均值和方差,选择图像灰度值较为均匀的区域的均值来替代模板中心像素的灰度值。以下是Kuwahara滤波的详细原理说明: 一、基本思想 Kuwahara滤波的基本思想…...

WINFORM - DevExpress -> DevExpress总结[安装、案例]
安装devexpress软件 路径尽量不换,后面破解不容易出问题 vs工具箱添加控件例如: ①使用控制台进入DevExpress安装目录: cd C:\Program Files (x86)\DevExpress 20.1\Components\Tools ②添加DevExpress控件: ToolboxCreator.exe/ini:toolboxcreator…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...