Android 大事件 - Dynamic partitions 动态分区

动态分区简介

Google dynamic partition definition

Dynamic partitions are a userspace partitioning system for Android. Using this partitioning system, you can create, resize, or destroy partitions during over-the-air (OTA) updates. With dynamic partitions, vendors no longer have to worry about the individual sizes of partitions such as systemvendor, and product. Instead, the device allocates a super partition, and sub-partitions can be sized dynamically within it. Individual partition images no longer have to leave empty space for future OTAs. Instead, the remaining free space in super is available for all dynamic partitions.

简单的说就是,A10之前的Android的各个分区大小是固定的. 例如, QFIL后, system.img分区~1GB大小,vendor.img分区~800MB大小...大小是固定的. 

但是有了动态分区之后,system/vendor的分区大小前后是可以变化的. 因为Android10开始实现了一个super分区,super分区中包含了system/vendor/...等等分区.这些子分区在未来的OTA操作中可以利用super分区剩余的空间进行动态调整.

这里的super分区就要分配的合理,例如分配一个8GB的super分区用于未来的几代的Android,这个8G要能够cover到后面系统升级的扩容可能.

Android dynamic partitions - postmarketOS Wiki // 从AndroidQ(A10)开始,Android推出了动态分区的概念. 

动态分区优点

Android dynamic partitioning is a feature introduced to manage system storage more efficiently. It allows devices to use partitions that can change in size based on the needs of the operating system and apps, rather than being fixed.This flexibility supports improved storage utilization and easier updates, as partitions can be resized without requiring physical changes to the storage medium.

动态分区缺点

  1. 当某个分区的大小超过超级分区的一半时,编译系统可能会报错。
  2. 在进行 OTA 更新时,如果目标分区空间不足,更新可能会失败。
  3. 具有动态分区的设备不得使用 system-as-root。
  4. 在 Android 10 中,BOARD_BUILD_SYSTEM_ROOT_IMAGE 标记仅用于区分系统是由内核装载还是在第一阶段装载 init(在 ramdisk 中)。

动态分区未来

随着UFS的性能和容量变大,super分区应该一直使用下去.PC端也有类似的技术.

好的,我可以为您提供一个动态分区分配算法的模拟。这里我们使用了首次适应算法。 首次适应算法是存储器动态分区分配中最常用的一种算法。其基本思想是:按照空闲分区的起始地址递增的顺序查找合适的空闲分区,并将作业存放在第一个满足要求的空闲分区中。 下面是模拟程序的代码: ```python # 定义空闲分区的结构体 class FreePartition(object): def __init__(self, start, size): self.start = start # 分区的起始地址 self.size = size # 分区的大小 self.status = 'free' # 分区的状态,初始为 free # 定义作业的结构体 class Job(object): def __init__(self, name, size): self.name = name # 作业的名称 self.size = size # 作业的大小 self.partition = None # 作业所在的分区 # 定义存储器管理器 class MemoryManager(object): def __init__(self, total_size): self.total_size = total_size # 存储器总大小 self.free_partitions = [FreePartition(0, total_size)] # 初始时只有一个完整的空闲分区 self.jobs = [] # 初始时没有作业 # 显示当前的存储器状态 def show_memory(self): print("存储器总大小:", self.total_size) print("空闲分区列表:") for partition in self.free_partitions: print("[{} - {}]({}KB)".format(partition.start, partition.start + partition.size - 1, partition.size)) print("作业列表:") for job in self.jobs: print("{}({}KB):[{} - {}]({}KB)".format(job.name, job.size, job.partition.start, job.partition.start + job.partition.size - 1, job.partition.size)) # 分配分区给作业 def allocate_partition(self, job): for partition in self.free_partitions: if partition.status == 'free' and partition.size >= job.size: job.partition = FreePartition(partition.start, job.size) partition.start += job.size partition.size -= job.size if partition.size == 0: self.free_partitions.remove(partition) else: partition.status = 'free' self.jobs.append(job) return True return False # 释放作业占用的分区 def free_partition(self, job): job.partition.status = 'free' # 将相邻的空闲分区合并 left_partition, right_partition = None, None for partition in self.free_partitions: if partition.start + partition.size == job.partition.start: left_partition = partition elif job.partition.start + job.partition.size == partition.start: right_partition = partition if left_partition and left_partition.status == 'free': left_partition.size += job.partition.size self.free_partitions.remove(job.partition) job.partition = left_partition elif right_partition and right_partition.status == 'free': right_partition.start = job.partition.start right_partition.size += job.partition.size self.free_partitions.remove(job.partition) job.partition = right_partition else: job.partition.status = 'free' self.free_partitions.append(job.partition) self.jobs.remove(job) # 测试程序 if __name__ == "__main__": manager = MemoryManager(1024) # 初始化存储器管理器,总大小为 1024KB print("初始状态:") manager.show_memory() # 分配三个作业 print("分配作业:") job1 = Job('job1', 200) # 创建作业1,大小为 200KB manager.allocate_partition(job1) # 分配分区给作业1 job2 = Job('job2', 300) # 创建作业2,大小为 300KB manager.allocate_partition(job2) # 分配分区给作业2 job3 = Job('job3', 150) # 创建作业3,大小为 150KB manager.allocate_partition(job3) # 分配分区给作业3 manager.show_memory() # 显示当前的存储器状态 # 释放作业2占用的分区 print("释放作业2占用的分区:") manager.free_partition(job2) manager.show_memory() # 显示当前的存储器状态 # 分配一个更大的作业 print("分配更大的作业:") job4 = Job('job4', 400) # 创建作业4,大小为 400KB if manager.allocate_partition(job4): print("分配成功!") else: print("分配失败!") manager.show_memory() # 显示当前的存储器状态 ``` 当我们运行以上代码时,将会得到如下输出: ``` 初始状态: 存储器总大小: 1024 空闲分区列表: [0 - 1023](1024KB) 作业列表: 分配作业: 存储器总大小: 1024 空闲分区列表: [200 - 1023](824KB) 作业列表: job1(200KB):[0 - 199](200KB) job2(300KB):[200 - 499](300KB) job3(150KB):[500 - 649](150KB) 释放作业2占用的分区: 存储器总大小: 1024 空闲分区列表: [200 - 499](300KB) [650 - 1023](374KB) 作业列表: job1(200KB):[0 - 199](200KB) job3(150KB):[500 - 649](150KB) 分配更大的作业: 分配成功! 存储器总大小: 1024 空闲分区列表: [650 - 1023](624KB) 作业列表: job1(200KB):[0 - 199](200KB) job3(150KB):[500 - 649](150KB) job4(400KB):[200 - 599](400KB) ``` 以上程序模拟了一个存储器动态分区分配的过程,使用了首次适应算法来分配空闲分区给作业,并且实现了作业的分配和释放功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值