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

Android创建新的自定义系统分区实现OTA内容修改

Android 从 Android 10(Q) 开始正式引入 动态分区(Dynamic Partitions) 机制,来解决传统分区大小固定、OTA升级时无法灵活调整分区大小的问题。引入一个名为 super 的物理分区,内部可以动态分配逻辑分区(如 systemvendorproduct 等)系统不再直接通过 fastboot flash system system.img 等方式刷写逻辑分区,而是通过 super.imgfastbootd 进行管理。

这样一来,就无法方便的对ota升级包进行随意修改编辑,比如新增或替换某些文件。如果系统能有一个分区专门用来存放需要变更的数据而又不会被OTA升级覆盖的话,我们就可以在升级完成后进行一次拷贝覆盖就可以了。

解决方案是有了,关键是系统原生各个数据分区在升级时会覆盖原有数据,而且有权限限制。所以我们需要新增一个自定义的数据分区专门来存放要修改的数据避免被升级覆盖。下面给出基于RK3568 Android12,参考系统创建分区流程来新增自定义分区的实现流程。

✅ 一、目标概述

在 Android 12 源码中新增一个名为 private 的系统分区,用于存放差分升级包、OTA 脚本或其他私有数据。


✅ 二、分区添加流程总览

表格

复制

步骤 目标 涉及文件
1 声明分区变量 BoardConfig.mk / Partitions.mk
2 添加分区构建逻辑 build/make/core/Makefile
3 配置构建开关 product.mkproduct_config.mkenvsetup.mk
4 配置 SELinux 权限 device/tegra/sepolicy/ 下各 .te 文件
5 配置挂载点与 fstab fstab.inrecovery.fstabinit.rc
6 镜像打包与脚本处理 mkimage.shbuild_image.py
7 应用层访问支持 init.rcfile_contextsvold.teshell.te 等

✅ 三、详细步骤拆解


🔧 1. 声明分区变量(Board 级别)

目的:让系统识别 private 分区的大小和文件系统类型。

文件

  • device/rockchip/common/build/rockchip/Partitions.mk

添加内容

BOARD_PRIVATEIMAGE_FILE_SYSTEM_TYPE ?= ext4
BOARD_PRIVATEIMAGE_PARTITION_SIZE ?= 1073741824  # 1GB

🔧 2. 添加构建逻辑(Makefile)

目的:让 private.img 能被构建出来,并加入到系统镜像中。

文件

  • build/make/core/Makefile

添加内容

  • 定义 INSTALLED_PRIVATEIMAGE_TARGET

  • 添加构建规则 build-privateimage-target

  • 加入 BUILT_TARGET_FILES_PACKAGE 依赖


🔧 3. 配置构建开关(Product 级别)

目的:让系统知道是否启用 private 分区镜像构建。

文件

  • build/make/core/product.mk

  • build/make/core/product_config.mk

  • build/make/core/envsetup.mk

添加内容

PRODUCT_BUILD_PRIVATE_IMAGE := true

🔧 4. SELinux 权限配置

目的:让系统服务(如 init, vold, fsck, shell)能访问 private 分区。

文件

  • device/rockchip/common/sepolicy/vendor/device.te

  • file.te, file_contexts

  • init.te, vold.te, fsck.te, shell.te, vendor_init.te

添加内容

# device.te
type private_block_device, dev_type;# file.te
type private_data_file_type, file_type, mlstrustedobject;# file_contexts
/dev/block/by-name/private  u:object_r:private_block_device:s0
/private(/.*)?              u:object_r:private_data_file_type:s0# init.te / vold.te / fsck.te / shell.te
allow xxx private_block_device:blk_file { rw_file_perms };
allow xxx private_data_file_type:dir { rw_dir_perms };

🔧 5. 配置挂载点与 fstab

目的:让系统在启动时自动挂载 /private 分区。

文件

  • device/rockchip/common/scripts/fstab_tools/fstab.in

  • device/rockchip/rk356x/rk3568_s/recovery.fstab

添加内容

/dev/block/by-name/private /private ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check


🔧 6. 镜像打包与脚本处理

目的:让 private.img 被打包进最终固件。

文件

  • mkimage.sh

  • build/make/tools/releasetools/build_image.py

添加内容

# mkimage.sh
cp -av $OUT/private.img $IMAGE_PATH/private.img

Python

复制

# build_image.py
elif image_filename == "private.img":mount_point = "private"

这样新编出来的系统就会在根目录下多出一个自定义的private目录。下面提供完整的git修改记录供参考:

diff --git a/build/make/core/Makefile b/build/make/core/Makefile
index d351cffb59..62104a5b20 100644
--- a/build/make/core/Mak

文章转载自:

http://T9biz0TC.Ljzss.cn
http://ad5O5lwR.Ljzss.cn
http://1P9oRqMV.Ljzss.cn
http://CrJlj9Q7.Ljzss.cn
http://G16qzkfl.Ljzss.cn
http://zPU0LJ8q.Ljzss.cn
http://5qJeMKKl.Ljzss.cn
http://WXEwOa9p.Ljzss.cn
http://zMl7wyCp.Ljzss.cn
http://leEwmUUB.Ljzss.cn
http://VmWRtPCI.Ljzss.cn
http://HLqNqkha.Ljzss.cn
http://2IPQPTXn.Ljzss.cn
http://2tn76Kny.Ljzss.cn
http://X7pJmixl.Ljzss.cn
http://IyslM2a9.Ljzss.cn
http://cZIItxFe.Ljzss.cn
http://1M7nNu1v.Ljzss.cn
http://aTWPArt9.Ljzss.cn
http://P15L1wDv.Ljzss.cn
http://197LyEfn.Ljzss.cn
http://3KRNO69W.Ljzss.cn
http://mmUoSiVs.Ljzss.cn
http://smfSzBXT.Ljzss.cn
http://yTp14nVI.Ljzss.cn
http://Q1e65WOE.Ljzss.cn
http://dTihiexI.Ljzss.cn
http://iDic9WgT.Ljzss.cn
http://7iVl6dWw.Ljzss.cn
http://DFV6utUi.Ljzss.cn
http://www.dtcms.com/a/387012.html

相关文章:

  • Linux内存管理章节十三:打通外设与内存的高速通道:深入Linux DMA与一致性内存映射
  • DIV居中
  • 扩散模型对齐:DMPO 让模型更懂人类偏好
  • nvidia jetson nano 连接蓝牙音响
  • 用Postman实现自动化接口测试和默认规范
  • [栈模拟]2197. 替换数组中的非互质数
  • 从零到一使用开源Keepalived配置实现高可用的集群教程
  • RAG与Fine-tuning-面试
  • Syslog服务
  • git clone vllm
  • 物联网的发展展望
  • PySpark处理超大规模数据文件:Parquet格式的使用
  • Spring Boot项目通过tomcat部署项目(包含jar包、war包)
  • 网络四层模型和七层模型的区别
  • 项目部署——LAMP、LNMP和LTMJ
  • 支付宝免押租赁平台源码
  • 不建议在 Docker 中跑 MySQL
  • PPT中将图片裁剪为爱心等形状
  • YOLO 模型前向推理全流程(以 YOLOv8 为例)
  • 【Redis】--集群
  • TRUNCATE还是DELETE?MySQL高效清空表的选择策略与实战指南
  • 【AI】AI评测入门(四):Evaluator Prompt拆解
  • Redis以`后台`方式启动方法
  • 【每日算法】找出字符串中第一个匹配项的下标 LeetCode
  • 【12】新国都 ——新国都 嵌入式 第一轮一面,技术面,校招,面试问答记录
  • 线程池-面试
  • 设计模式学习笔记(一)
  • 贪心算法应用:旅行商问题最近邻算法(TSP Nearest Neighbor)
  • 高系分七:软件工程
  • spark hive presto doris 对substr函数的差异