当前位置:   article > 正文

[探索 Android 设备分区]-安卓手机分区扫盲!折腾狂必看~~_android12 展锐平台将a/b升级转换为non a/b升级方式

android12 展锐平台将a/b升级转换为non a/b升级方式

##################################################

目录

安卓系统是怎么分区的?

用户权限扫盲/为什么需要 root 手机

示例获取安卓 5.0.2 手机信息以及系统分区

详解安卓 6.0 系统分区

传统安卓的 non-A/B 分区

传统分区介绍

传统系统升级方案

安卓 7.0 之后的 A/B 和 VAB 分区结构

A/B 主备分区

A/B 分区的系统升级方式以及优缺点

A/B 分区结构

虚拟 AB 分区

安卓 10 之后的动态分区

Shared System Image/SSI 概念

动态分区和 super 概念

示例一个 Android 10 的默认分区方案


##################################################

安卓系统是怎么分区的?

——————————

用户权限扫盲/为什么需要 root 手机

        root 明明是一个名词 表示超级管理员

        但是却发展成了一个动词 表示获取手机最高权限

        当我们进入系统后 发现提示符为 $ 表示普通用户权限

普通用户权限

        普通用户享有的权限是受限的

        linuxer 都明白 Linux 系统权限是怎么一回事

        而 Android 就是 Java 版的 Linux 系统所以权限概念也差不多:

        超级用户:

root

提示符为 #

超级用户权限可以干任何事情

完全控制手机 使用手机未开放的功能

甚至可以卸载系统软件和控制硬件

        普通用户:

普通 user 权限次于 root 权限

提示符为 $

只能执行系统设置允许之内的操作

例如 设置手机密码/重启关机/卸载第三方应用软件

而且不允许我们查看和对某些分区文件进行操作例如上传文件和下载拷贝

虽然有着普通软件做不到的权限 但是不够自由

        软件权限:

一般的第三方应用软件权限都是最低的/不一般的权限

使用的时候会先向用户发起请求得到授权才同意执行

例如我们常见的 录音/录屏/定位 啊什么的你都可以设置相应的权限

        以下是以普通用户身份进行的一系列操作:

  1. Microsoft Windows [版本 6.3.9600]
  2. (c) 2013 Microsoft Corporation。保留所有权利。
  3. C:\Users\byme>cd /adb /* 进入程序目录 */
  4. C:\adb>adb devices /* 查看连接设备信息 */
  5. List of devices attached
  6. 8P5SSOHQINAYZPMF device
  7. C:\adb>adb devices -l /* 查看连接设备的详细信息 */
  8. List of devices attached
  9. 8P5SSOHQINAYZPMF device product:GN5005 model:GN5005 device:GIONEE_G1605A t
  10. ransport_id:1
  11. C:\adb>adb shell /* 获取设备终端 */
  12. shell@GIONEE_G1605A:/ $ getprop ro.product.model /* 查看机型 */
  13. GN5005
  14. shell@GIONEE_G1605A:/ $ settings get secure android_id /* 查看安卓 ID */
  15. b53a46e7ac129a55
  16. shell@GIONEE_G1605A:/ $ getprop ro.build.version.release /* 查看安卓系统版本 */
  17. 6.0
  18. shell@GIONEE_G1605A:/ $ cat /proc/cpuinfo /* 查看 CPU 信息 */
  19. Processor : AArch64 Processor rev 3 (aarch64)
  20. processor : 0
  21. model name : AArch64 Processor rev 3 (aarch64)
  22. BogoMIPS : 26.00
  23. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32
  24. CPU implementer : 0x41
  25. CPU architecture: 8
  26. CPU variant : 0x0
  27. CPU part : 0xd03
  28. CPU revision : 3
  29. Hardware : MT6737
  30. shell@GIONEE_G1605A:/ $ cat /proc/meminfo /* 查看内存使用情况 */
  31. MemTotal: 2930964 kB
  32. MemFree: 1169904 kB
  33. MemAvailable: 2178420 kB
  34. Buffers: 14320 kB
  35. Cached: 1024216 kB
  36. SwapCached: 0 kB
  37. Active: 620368 kB
  38. Inactive: 844280 kB
  39. Active(anon): 426168 kB
  40. Inactive(anon): 3476 kB
  41. Active(file): 194200 kB
  42. Inactive(file): 840804 kB
  43. Unevictable: 0 kB
  44. Mlocked: 0 kB
  45. SwapTotal: 1465480 kB
  46. SwapFree: 1465480 kB
  47. Dirty: 0 kB
  48. Writeback: 0 kB
  49. AnonPages: 426080 kB
  50. Mapped: 263612 kB
  51. Shmem: 3580 kB
  52. Slab: 68384 kB
  53. SReclaimable: 24012 kB
  54. SUnreclaim: 44372 kB
  55. KernelStack: 20480 kB
  56. PageTables: 21884 kB
  57. NFS_Unstable: 0 kB
  58. Bounce: 0 kB
  59. WritebackTmp: 0 kB
  60. CommitLimit: 2930960 kB
  61. Committed_AS: 25283700 kB
  62. VmallocTotal: 260046784 kB
  63. VmallocUsed: 201108 kB
  64. VmallocChunk: 259735280 kB
  65. shell@GIONEE_G1605A:/ $ dumpsys battery /* 获取电量信息 */
  66. Current Battery Service state:
  67. AC powered: false
  68. USB powered: true
  69. Wireless powered: false
  70. status: 2
  71. status: 1
  72. health: 2
  73. present: true
  74. present: false
  75. level: 74
  76. level: 50
  77. scale: 100
  78. voltage: 4204
  79. temperature: 350
  80. technology: Li-ion
  81. shell@GIONEE_G1605A:/ $

        执行有限的操作 例如你想查看个设备挂载情况都没权限:

  1. shell@GIONEE_G1605A:/ $ ls /dev
  2. opendir failed, Permission denied
  3. 1|shell@GIONEE_G1605A:/ $ ls
  4. acct
  5. cache
  6. charger
  7. config
  8. custom
  9. d
  10. data
  11. default.prop
  12. dev
  13. enableswap.sh
  14. etc
  15. factory_init.project.rc
  16. factory_init.rc
  17. factory_init.usb.rc
  18. file_contexts
  19. fstab.mt6735
  20. init
  21. init.aee.rc
  22. init.c2k.rc
  23. init.common_svc.rc
  24. init.environ.rc
  25. init.mal.rc
  26. init.modem.rc
  27. init.mt6735.rc
  28. init.mt6735.usb.rc
  29. init.project.rc
  30. init.rc
  31. init.recovery.mt6735.rc
  32. init.trace.rc
  33. init.trustonic.rc
  34. init.usb.rc
  35. init.volte.rc
  36. init.xlog.rc
  37. init.zygote32.rc
  38. init.zygote64_32.rc
  39. meta_init.c2k.rc
  40. meta_init.modem.rc
  41. meta_init.project.rc
  42. meta_init.rc
  43. mnt
  44. nvdata
  45. oem
  46. persist
  47. proc
  48. property_contexts
  49. protect_f
  50. protect_s
  51. root
  52. sbin
  53. sdcard
  54. seapp_contexts
  55. selinux_version
  56. sepolicy
  57. service_contexts
  58. storage
  59. sys
  60. system
  61. ueventd.mt6735.rc
  62. ueventd.rc
  63. vendor
  64. verity_key
  65. shell@GIONEE_G1605A:/ $ exit
  66. C:\adb>

——————————

示例获取安卓 5.0.2 手机信息以及系统分区

        安卓 5 分区就不详细解释了 命令全都贴这边:

  1. C:\adb>adb devices /* 查看连接设备信息 */
  2. List of devices attached
  3. f7cdc8c device
  4. C:\adb>adb devices -l /* 查看连接设备的详细信息 */
  5. List of devices attached
  6. f7cdc8c device product:PD1401CL model:vivo_X5M device:PD1401CL tr
  7. ansport_id:3
  8. C:\adb>adb shell getprop ro.product.model /* 查看机型 */
  9. vivo X5M
  10. C:\adb>adb shell settings get secure android_id /* 查看安卓 ID */
  11. 266e0dcc556e1c31
  12. C:\adb>adb shell getprop ro.build.version.release /* 查看安卓系统版本 */
  13. 5.0.2
  14. C:\adb>adb shell cat /proc/cpuinfo /* 查看 CPU 信息 */
  15. processor : 0
  16. model name : ARMv7 Processor rev 1 (v7l)
  17. BogoMIPS : 38.40
  18. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  19. ivt vfpd32 evtstrm
  20. CPU implementer : 0x41
  21. CPU architecture: 7
  22. CPU variant : 0x0
  23. CPU part : 0xd03
  24. CPU revision : 1
  25. processor : 1
  26. model name : ARMv7 Processor rev 1 (v7l)
  27. BogoMIPS : 38.40
  28. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  29. ivt vfpd32 evtstrm
  30. CPU implementer : 0x41
  31. CPU architecture: 7
  32. CPU variant : 0x0
  33. CPU part : 0xd03
  34. CPU revision : 1
  35. processor : 2
  36. model name : ARMv7 Processor rev 1 (v7l)
  37. BogoMIPS : 38.40
  38. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  39. ivt vfpd32 evtstrm
  40. CPU implementer : 0x41
  41. CPU architecture: 7
  42. CPU variant : 0x0
  43. CPU part : 0xd03
  44. CPU revision : 1
  45. processor : 3
  46. model name : ARMv7 Processor rev 1 (v7l)
  47. BogoMIPS : 38.40
  48. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  49. ivt vfpd32 evtstrm
  50. CPU implementer : 0x41
  51. CPU architecture: 7
  52. CPU variant : 0x0
  53. CPU part : 0xd03
  54. CPU revision : 1
  55. processor : 4
  56. model name : ARMv7 Processor rev 1 (v7l)
  57. BogoMIPS : 38.40
  58. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  59. ivt vfpd32 evtstrm
  60. CPU implementer : 0x41
  61. CPU architecture: 7
  62. CPU variant : 0x0
  63. CPU part : 0xd03
  64. CPU revision : 1
  65. processor : 5
  66. model name : ARMv7 Processor rev 1 (v7l)
  67. BogoMIPS : 38.40
  68. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  69. ivt vfpd32 evtstrm
  70. CPU implementer : 0x41
  71. CPU architecture: 7
  72. CPU variant : 0x0
  73. CPU part : 0xd03
  74. CPU revision : 1
  75. processor : 6
  76. model name : ARMv7 Processor rev 1 (v7l)
  77. BogoMIPS : 38.40
  78. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  79. ivt vfpd32 evtstrm
  80. CPU implementer : 0x41
  81. CPU architecture: 7
  82. CPU variant : 0x0
  83. CPU part : 0xd03
  84. CPU revision : 1
  85. processor : 7
  86. model name : ARMv7 Processor rev 1 (v7l)
  87. BogoMIPS : 38.40
  88. Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva id
  89. ivt vfpd32 evtstrm
  90. CPU implementer : 0x41
  91. CPU architecture: 7
  92. CPU variant : 0x0
  93. CPU part : 0xd03
  94. CPU revision : 1
  95. Hardware : Qualcomm Technologies, Inc MSM8939_BC
  96. Revision : 0000
  97. Serial : 0000000000000000
  98. Processor : ARMv7 Processor rev 1 (v7l)
  99. C:\adb>adb shell cat /proc/meminfo /* 查看内存使用情况 */
  100. MemTotal: 1956260 kB
  101. MemFree: 420112 kB
  102. Buffers: 17228 kB
  103. Cached: 998884 kB
  104. SwapCached: 0 kB
  105. Active: 438508 kB
  106. Inactive: 874096 kB
  107. Active(anon): 296624 kB
  108. Inactive(anon): 372 kB
  109. Active(file): 141884 kB
  110. Inactive(file): 873724 kB
  111. Unevictable: 0 kB
  112. Mlocked: 0 kB
  113. HighTotal: 1588220 kB
  114. HighFree: 180884 kB
  115. LowTotal: 368040 kB
  116. LowFree: 239228 kB
  117. SwapTotal: 0 kB
  118. SwapFree: 0 kB
  119. Dirty: 0 kB
  120. Writeback: 0 kB
  121. AnonPages: 296648 kB
  122. Mapped: 169920 kB
  123. Shmem: 528 kB
  124. Slab: 49552 kB
  125. SReclaimable: 17648 kB
  126. SUnreclaim: 31904 kB
  127. KernelStack: 11640 kB
  128. PageTables: 19624 kB
  129. NFS_Unstable: 0 kB
  130. Bounce: 0 kB
  131. WritebackTmp: 0 kB
  132. CommitLimit: 978128 kB
  133. Committed_AS: 30802344 kB
  134. VmallocTotal: 516096 kB
  135. VmallocUsed: 137396 kB
  136. VmallocChunk: 167964 kB
  137. C:\adb>adb shell dumpsys battery /* 获取电量信息 */
  138. Current Battery Service state:
  139. AC powered: false
  140. USB powered: true
  141. Wireless powered: false
  142. status: 2
  143. health: 2
  144. present: true
  145. level: 94
  146. scale: 100
  147. voltage: 4287
  148. temperature: 336
  149. technology: Li-ion
  150. C:\adb>adb shell ls /* 查看根目录 */
  151. acct
  152. cache
  153. charger
  154. config
  155. d
  156. data
  157. default.prop
  158. dev
  159. etc
  160. file_contexts
  161. firmware
  162. fstab.qcom
  163. init
  164. init.PD1401CL.rc
  165. init.PD1401CLT.rc
  166. init.PD1415A.rc
  167. init.PD1419C.rc
  168. init.PD1420L.rc
  169. init.PD1421CA.rc
  170. init.PD1421F_EX.rc
  171. init.PD1421V.rc
  172. init.PD1422F_EX.rc
  173. init.PD1422V.rc
  174. init.PD1502.rc
  175. init.PD1502A.rc
  176. init.PD1502F_EX.rc
  177. init.PD1503.rc
  178. init.PD1503F_EX.rc
  179. init.PD1505.rc
  180. init.PD1510.rc
  181. init.PD1510F_EX.rc
  182. init.PD1515A.rc
  183. init.at.rc
  184. init.class_main.sh
  185. init.environ.rc
  186. init.mdm.sh
  187. init.qcom.bms.sh
  188. init.qcom.class_core.sh
  189. init.qcom.early_boot.sh
  190. init.qcom.factory.rc
  191. init.qcom.rc
  192. init.qcom.sh
  193. init.qcom.syspart_fixup.sh
  194. init.qcom.usb.rc
  195. init.qcom.usb.sh
  196. init.rc
  197. init.target.rc
  198. init.trace.rc
  199. init.usb.rc
  200. init.vivo.rc
  201. init.vivo.usb.rc
  202. init.vivo.usb.sh
  203. init.zygote32.rc
  204. mnt
  205. oem
  206. persist
  207. proc
  208. property_contexts
  209. res
  210. root
  211. sbin
  212. sdcard
  213. seapp_contexts
  214. selinux_version
  215. sepolicy
  216. service_contexts
  217. storage
  218. sys
  219. system
  220. tombstones
  221. ueventd.qcom.rc
  222. ueventd.rc
  223. vendor
  224. verity_key
  225. C:\adb>adb shell df /* 获取分区信息 */
  226. Filesystem Size Used Free Blksize
  227. /dev 942.7M 72.0K 942.6M 4096
  228. /sys/fs/cgroup 942.7M 12.0K 942.7M 4096
  229. /mnt/asec 942.7M 0.0K 942.7M 4096
  230. /mnt/obb 942.7M 0.0K 942.7M 4096
  231. /system 2.3G 1.6G 759.9M 4096
  232. /oem 59.0M 44.0K 58.9M 4096
  233. /data 3.9G 475.1M 3.4G 4096
  234. /cache 290.6M 508.0K 290.1M 4096
  235. /persist 27.5M 124.0K 27.4M 4096
  236. /firmware 64.0M 51.3M 12.6M 16384
  237. /mnt/media_rw/sdcard0: Permission denied
  238. /mnt/secure/asec: Permission denied
  239. /storage/sdcard0 7.4G 21.8M 7.4G 32768
  240. C:\adb>

        如果是系统还没启动开没有挂载那么多乱七八糟的 加载界面可以看到更干净一点的:

  1. C:\adb>adb shell
  2. shell@PD1401CL:/ $ df
  3. Filesystem Size Used Free Blksize
  4. /dev 942.7M 72.0K 942.6M 4096
  5. /sys/fs/cgroup 942.7M 12.0K 942.7M 4096
  6. /mnt/asec 942.7M 0.0K 942.7M 4096
  7. /mnt/obb 942.7M 0.0K 942.7M 4096
  8. /system 2.3G 1.6G 759.9M 4096
  9. /oem 59.0M 44.0K 58.9M 4096
  10. /data 3.9G 406.9M 3.5G 4096
  11. /cache 290.6M 512.0K 290.1M 4096
  12. /persist 27.5M 124.0K 27.4M 4096
  13. /firmware 64.0M 51.3M 12.6M 16384
  14. shell@PD1401CL:/ $

——————————

详解安卓 6.0 系统分区

        在终端中输入 df 查看分区挂载情况:

  1. C:\adb>adb shell /* 获取一个终端访问设备 */
  2. shell@GIONEE_G1605A:/ $ df /* 查看设备的挂载情况 */
  3. Filesystem Size Used Free Blksize
  4. /dev 1.4G 120.0K 1.4G 4096
  5. /sys/fs/cgroup 1.4G 12.0K 1.4G 4096
  6. /mnt 1.4G 0.0K 1.4G 4096
  7. /system 3.9G 3.9G 54.4M 4096
  8. /cache 387.4M 2.4M 385.0M 4096
  9. /protect_f 5.8M 60.0K 5.8M 4096
  10. /protect_s 5.8M 56.0K 5.8M 4096
  11. /nvdata 27.5M 2.0M 25.5M 4096
  12. /storage 1.4G 0.0K 1.4G 4096
  13. /data 9.6G 512.8M 9.1G 4096
  14. /mnt/runtime/default/emulated: Permission denied
  15. /storage/emulated 9.6G 512.8M 9.1G 4096
  16. /mnt/runtime/read/emulated: Permission denied
  17. /mnt/runtime/write/emulated: Permission denied
  18. 1|shell@GIONEE_G1605A:/ $

        这些分区通常用于:

  1. /dev /* 用于存放设备驱动 */
  2. /sys/fs/cgroup /* 任意进程进行分组化管理的功能 操作接口以 文件/目录 的方式组织在操作系统的该目录下 用以限制一个进程组能够使用的资源上限 例如 CPU/内存/磁盘/网络带宽 还能够对进程进行优先级设置、审计以及将进程挂起和恢复等操作 Android 操作系统也就凭借着这个技术为每个应用程序分配不同的 cgroup 将每个程序进行隔离达到了一个应用程序不会影响其她应用程序环境的目的 */
  3. /mnt /* 设备默认挂载点 直接理解为挂载设备的目录 */
  4. /system /* 存放系统文件 就是我们刷 ROM 的分区 安卓的系统目录 里面存放的都是系统文件 */
  5. /cache /* 缓存数据存放分区 */
  6. /protect_f /* 正常情况下 protect_f 中的 A 文件和 protect_s 中的 B 文件是相同的 因为写的时候都会去写两个 nvram 文件 具有 NVRAM_CATEGORY_IMPORTAN_L4 属性的 NVRAM LID 会存在 protect_f 分区 */
  7. /protect_s /* 如果还具有 NVRAM_ATTR_MULTIPLE 属性会存一个 B 文件到 protect_s 中 protect_s 是对 protect_f 中部分 NVRAM 的复制 主要存储着 SIM Lock 数据 */
  8. /nvdata /* nvdata 分区是我们可以直接读写的分区 一般也称为 binregion 分区 是一个备份分区 备份 NVRAM LID 有此分区一般也存在 protect_f 和 protect_s 或 protect_1 和 protect_2 分区 */
  9. /storage /* 存储卡位置 */
  10. /data /* 用户程序目录 就是我们装 APK 安装包的分区 */
  11. /mnt/runtime/default/emulated /* 默认操作主存储 如果有外置存储则切换操作外置存储 */
  12. /storage/emulated /* 该目录下的 0 为手机的内部储存根目录 1 表示手机的内存卡储存根目录 */
  13. /mnt/runtime/read/emulated /* 读外置存储 */
  14. /mnt/runtime/write/emulated /* 写外置存储 */

        关于外置存储的实现:

  1. ./storage/emulated/0 是手机的内部储存根目录
  2. 类似于虚拟 sd 卡目录的一个 快捷方式/软链接
  3. 是可以直接访问的一个目录 被作为 sd 卡使用了
  4. 这也是为什么现在安卓的手机不需要插存储卡就能使用了
  5. 她的实际目录应该是
  6. ./data/media/0
  7. 直接访问这个要 root 权限
  8. 但被挂载成 ./storage/emulated/0
  9. 为了实现动态的外置存储权限 Android 会挂载三个目录到 /dev/fuse 来对应同一个外置存储
  10. 三个目录分别是
  11. /mnt/runtime/default/${label}
  12. /mnt/runtime/read/${label}
  13. /mnt/runtime/write/${label}
  14. 这三个目录代表不同的权限
  15. 当一个应用进程取得了读外置存储的权限
  16. 那么她将使用
  17. /mnt/runtime/read/${label}
  18. 目录来操作外置存储
  19.     
  20. 当一个应用程序取得了写外置存储的权限
  21. 那么她将使用
  22. /mnt/runtime/write/${label}
  23. 目录来操作外置存储
  24.     
  25. 当一个应用程序没有获取操作外置存储的权限
  26. 将使用
  27. /mnt/runtime/default/${label}
  28. 目录来操作主存储
  29.     
  30. 三个 fuse 目录最终都会作用于外置存储的 media 目录
  31.         只不过对目录下的可进行的操作权限是不同的
  32.     
  33. Android 的 FUSE file-system daemon 会根据应用程序进程使用的 fuse 目录来决定是否可以读写外置存储的 media 目录下数据

##################################################

传统安卓的 non-A/B 分区

——————————

传统分区介绍

        安卓传统的 non-A/B 分区主要有

  1. /boot
  2. /system
  3. /vendor
  4. /userdata
  5. /cache
  6. /recovery
  7. /misc

        分区作用:

  1. /boot
  2. Boot 引导分区
  3. 存放启动和引导的文件
  4. 包含 Kernel/内核 和 Ramdisk/虚拟内存
  5. 开机启动相关引导
  6. 如果 boot 分区损坏通常就卡在开机第一个 LOGO 界面
  7. /system
  8. System 系统分区
  9. 存放整个安卓操作系统和系统预装软件
  10. 此分区损坏会卡在开机的第二屏 就是开机的动画界面 无法进入系统
  11. /vendor
  12. Vendor 包含了开发厂商私有的可执行程序、库、系统服务和 app 等
  13. 可以将此分区看做是 system 分区的补充
  14. 厂商定制 ROM 的一些功能都可以放在此分区
  15. 该分区主要包含开发厂商的定制应用与库文件
  16. 部分厂商会把 Vendor 分区置于 System 分区中便于后期更新维护
  17. /userdata
  18. Data 数据分区
  19. 存放用户数据,包括应用、音视频、图片、文档、系统设置等
  20. 擦除这个分区相当于清空所有软件的数据
  21. 包括各种软件和文件资料还有系统的各项设置
  22. 但是不会影响手机的正常启动
  23. /cache
  24. 缓存区
  25. 可以帮助你快速的打开系统最常访问的数据和应用程序
  26. 不需要重复加载
  27. 擦除缓存的话并不会影响个人数据而新的缓存也会在后续生成进来
  28. /recovery
  29. Recovery 恢复分区
  30. 存放着一个小 linux 系统用于恢复和更新其她分区的内容
  31. 包含一个简易的 Linux 系统 类似于 Windows PE 可以理解为一个非常简易的操作系统
  32. 用于恢复和维护手机还可以对其他分区进行 重启/Reboot 擦除/Wipe Data 等操作
  33. 所以说我们刷机刷系统的时候 很多都是在这个 Recovery 分区进行的
  34. 不过现在也出现了越来越多不存在 Recovery 分区的手机
  35. /misc
  36. 主要用于 Android 系统和 bootloader 通信
  37. 使 Android 系统能够重启进入 recovery 系统并执行相应操作

——————————

传统系统升级方案

        传统手机分区的 OTA 升级过程比较简单:

  1. Android 系统收到服务端下发的 OTA 推送将 OTA 包下载至 cache 分区
  2. OTA 包下载完成后将向 misc 分区写入指令
  3. 表明下次启动时进入 recovery 模式并使用该 OTA 包进行升级
  4. 重启手机
  5. 重启后最先进入 bootloader
  6. bootloader 会先判断按键组合以及电源寄存器等
  7. 随后会读取 misc 分区的内容并解析
  8. 由于前面中已经向 misc 分区写入了指令所以这时 bootloader 读取指令后会引导启动 recovery
  9. 进入 recovery 后读取 cache 分区中的 OTA 包
  10. 并解析其中的升级脚本按照其指令对系统各个分区进行升级
  11. 如果 recovery 自身也需要升级
  12. 会在此过程中向 system 中写入 recovery-from-boot.p 文件
  13. 这是一个 recovery 升级所需要的 patch
  14. 最后 recovery 会清除 misc 分区并重启手机
  15. 重启后最先进入 bootloader 判断按键组合和电源寄存器以及 misc 分区内容等
  16. 默认情况会启动 Android 系统 此时已经是 OTA 升级后的新版本系统
  17. 新版本 Android 系统启动后会检查是否存在 recovery-from-boot.p 文件
  18. 如果存在则会对 recovery 进行升级

##################################################

安卓 7.0 之后的 A/B 和 VAB 分区结构

——————————

A/B 主备分区

        从 Android 7.0 开始 Google 引入了新的 OTA 升级方式

A/B System Updates

        这种升级方式将 Boot、System 等分区变为两套

Slot A 主分区
Slot B 备用分区

        也就是 AB 分区:

  1. A/B 分区结构顾名思义将系统分区分成了 A 和 B 两个 槽/slot
  2. 手机启动时会选择 A 槽或者 B 槽启动
  3. 运行过程中仅使用当前槽位的分区
  4. 一旦当前运行槽出现问题系统仍可以选择另一个槽进行启动
  5. 从而保证系统良好的可用性

        平时用的叫主分区 没有在使用的是备用分区

  1. 示例分区结构
  2. Slot A
  3. Boot
  4. System
  5. Slot B
  6. Boot
  7. System
  8. Cache
  9. Data

——————————

A/B 分区的系统升级方式以及优缺点

        系统升级的时候可以无缝升级

系统运行时 Slot A、Cache、Data 不影响
在后台 Slot B 升级系统
升级完成后
重启手机
此时主分区和备用分区自动切换

        在此过程中仅重启操作是会被用户感知的 这个重启与普通重启的耗时没有什么区别

        这样升级方便省时 还能防止升级失败导致卡机

当系统无法成功启动时就会切回之前的分区并不会影响用户当前运行的系统

        缺点也是很明显 总要有一个分区拿来做备份用吧

所以会占用双倍的 System 分区空间!

        不过

由于 A/B 分区结构可以实现一边从服务端获取 OTA 数据一边直接写入待升级的槽

不需要临时存储 OTA 包的空间

因此不再需要再在 cache 或 userdata 分区预留足够空间了

——————————

A/B 分区结构

        Google 定义了 A/B 槽的几种标识

  1. bootable 标识该槽的系统是否可以启动
  2. 有时也用 unbootable 来标识 例如高通 含义与 bootable 相反
  3. successful 标识该槽的系统是否成功启动过
  4. 仅当该槽系统能够启动、运行、进行 OTA 升级时才会从用户态标记该槽为 successful
  5. active 标识该槽是否是当前运行的系统
  6. 两个槽中只有一个能标记为 active

        系统重启后 在 zygote 启动前
init 会调用 update_verifier 服务通过 dm-verity 机制校验本次升级的镜像
        通过后则会被标记为 successful
        如果系统当前 active 的槽反复多次启动都没能标记为 successful

则将该槽标记为 unbootable 并将另外一个槽标记为 active

        A/B 分区结构详解:

  1. bootloader 分区
  2. 功能同传统 non-A/B 分区的 bootloader
  3. 只是此处会根据 A/B 槽的 bootable、successful、active 等标识来选择启动哪个槽
  4. 根据不同厂商的实现可以是唯一的不区分 A/B 的 bootloader 也可以自定义
  5. boot_a 分区和 boot_b 分区
  6. 包含 kernel 和 recovery 的 ramdisk
  7. recovery 打包在 boot 分区中
  8. 所以不再需要 recovery 分区
  9. 并且 recovery 系统也不再负责 OTA 升级转而由 Android 系统中 update_engine 服务负责
  10. 此时 recovery 仅负责双清等其她操作
  11. 这里需要说明一下 recovery 集成在 boot 中是由 TARGET_NO_RECOVERY 和 BOARD_USES_RECOVERY_AS_BOOT 等变量决定的
  12. system_a 分区和 system_b 分区
  13. 功能同传统的 system 分区一样
  14. 只是区分了 A 和 B 两个槽
  15. vendor_a 分区和 vendor_b 分区
  16. 功能同 non-A/B 的 vendor 分区
  17. 只是区分了 A 和 B 两个槽
  18. data 分区
  19. 功能同 non-A/B 的 userdata
  20. 并且用户数据仅存储一份 不区分 A/B
  21. misc 分区
  22. 功能同 non-A/B 的 misc 且不区分 A/B
  23. persist 分区
  24. 用来存储一些持久化数据
  25. 不会随着 双清 或 OTA 等操作被清除
  26. 也不区分 A/B
  27. 示例分区:
  28. Slot A
  29. /boot_a
  30. recovery_a
  31. /system_a
  32. /vendor_a
  33. Slot B
  34. /boot_b
  35. recovery_b
  36. /system_b
  37. /vendor_b
  38. /cache
  39. /data
  40. /misc
  41. /persist

——————————

虚拟 AB 分区

        为解决占用双倍 System 分区问题,采用新的 虚拟 AB 分区 VAB
        于是就又有了 Virtual A/B System Updates
        出厂搭载 Android 11 的机型普遍采用这种方式:

  1. Boot
  2. System
  3. Cache
  4. Date

        对于 Boot 和 System 分区来说,两代系统,相同文件共用
        不同文件存于虚拟 A/B 分区

        虽然解决了空间占用问题
        但是不管是 A/B 分区还是 VAB 分区
        由于 Recovery 分区被并到了 Boot 分区中导致要想刷第三方的 Recovery 就会比较麻烦一点
        例如临时 TWRP 镜像
        于是不推荐使用 Recovery 来刷机 而是通过更底层的 fastboot 来操作

##################################################

安卓 10 之后的动态分区

——————————

Shared System Image/SSI 概念

        为了进一步让原生 Android 和各厂商的软件进行解耦
        使设备代码的移植/系统大版本的升级 变得更加友好
        Google 引入了 SSI/Shared System Image 概念

  1. SSI 是指
  2. 在 Android 版本相同的情况下各个 Android 设备的 ROM 镜像中
  3. system.img 都是由该版本的原生 AOSP 或厂商定制代码编译出的
  4. 是多产品共同使用的与具体硬件设备无关的系统镜像
  5. 而且她与具体硬件设备、产品型号有关的代码会被放在其她分区中

——————————

动态分区和 super 概念

        自 Android Q 即安卓 10.0 之后系统支持 动态分区/dynamic partition

  1.         她将多个系统只读分区包括
  2. system
  3. product
  4. vendor
  5. odm
  6.         或者其她厂商自定义分区合并为一个 super 分区

        物理分区只有 super 分区的概念而没有 system 等分区

  1. 因此使用 fastboot 刷机时是无法直接通过命令进行刷机的:
  2. fastboot flash system system.img
  3. 而只能刷写 super 分区:
  4. fastboot flash super super.img

        super 分区不区分 A/B 槽

一个 super 分区中包含了 A/B 两套只读分区
并且其中的只读分区也不需要显式指定分区大小
因为都是在用户态中动态分配挂载的
只要这些只读分区的总大小不超过 super 分区的物理大小即可

        示例一个 super 物理逻辑分区:

  1. system
  2. system_ext
  3. product interface
  4. product
  5. vendor interface
  6. vendor
  7. [odm]
  8. [odm]

        简单描述一下 super 物理分区中包含的几个逻辑分区的内容

  1. system 逻辑分区即 SSI
  2. 这里存放通用 Android 系统组件
  3. 原则上不同厂商不同型号的设备都通用
  4. product 逻辑分区
  5. 该 产品 分区是与特定产品有关的模块
  6. 包括对于 Android 系统的定制化
  7. vendor 逻辑分区
  8. 厂商对系统的定制
  9. 例如对 Android 系统附加的功能
  10. 包括一些闭源的程序等
  11. odm
  12. 此为可选的分区
  13. 包含 SOC 附加的程序
  14. 这些内容可以集成在 vendor 中也可以单独分离出 odm 分区

        额外知识 看看就好:

  1. 考虑到有些场景下还是需要单独刷写 system 或其她 super 中的逻辑分区
  2. Android 新增了一个用户态的 fastbootd 程序用来在用户态中完成这个工作
  3. 有时候我们在调试阶段也需要修改 system 等分区中的内容
  4. 通常会采用以下方式写入:
  5. adb root /* 获取 root 权限 */
  6. adb disable-verity /* 关闭 dm-verity */
  7. adb reboot /* 重启使生效 */
  8. adb root /* 再次获取 root 权限 */
  9. adb remount /* 重新以读写方式挂载 */
  10. 由于动态分区中每个分区是连续排列不需要预留空间的
  11. 因此写入时可能会造成空间不足
  12. 为了解决这个问题引入了 overlay 文件系统保证对原分区的修改在 upper 层中
  13. 意为挂载在进行从而不影响原分区数据

——————————

示例一个 Android 10 的默认分区方案

        安卓 10 系统确实跟以前的分区差别蛮大的:

  1. C:\adb>adb shell getprop ro.build.version.release
  2. 10
  3. C:\adb>adb shell df -h
  4. Filesystem Size Used Avail Use% Mounted on
  5. /dev/block/dm-6 2.1G 2.1G 0 100% /
  6. tmpfs 2.7G 1.4M 2.7G 1% /dev
  7. tmpfs 2.7G 0 2.7G 0% /mnt
  8. tmpfs 2.7G 0 2.7G 0% /apex
  9. /dev/block/dm-5 25M 28K 24M 1% /patch_hw
  10. /dev/block/dm-7 6.6M 6.6M 0 100% /cust
  11. /dev/block/dm-8 1.4G 1.4G 0 100% /hw_product
  12. /dev/block/dm-9 129M 129M 0 100% /odm
  13. /dev/block/dm-10 985M 985M 0 100% /preload
  14. /dev/block/dm-11 381M 381M 0 100% /vendor
  15. /dev/block/dm-12 4.9M 4.9M 0 100% /vendor/preavs
  16. /dev/block/dm-13 132K 132K 0 100% /version
  17. none 2.7G 0 2.7G 0% /mnt/update_engine
  18. /dev/block/mmcblk0p71 109G 107G 1.7G 99% /data
  19. /dev/block/dm-14 93M 93M 0 100% /preas
  20. /dev/block/mmcblk0p65 97M 132K 89M 1% /cache
  21. overlay 93M 93M 0 100% /system/product/priv-app
  22. overlay 93M 93M 0 100% /system/product/app
  23. overlay 93M 93M 0 100% /system/product/etc/permissions
  24. /dev/block/loop2 232K 36K 192K 16% /apex/com.android.apex.cts.OOXX@N
  25. /dev/block/loop3 4.9M 4.9M 0 100% /apex/com.android.conscrypt@AOOXXOOXX
  26. /dev/block/loop4 5.6M 5.6M 0 100% /apex/com.android.media@OOXXAYMDA
  27. /dev/block/loop5 22M 22M 0 100% /apex/com.android.media.swcodec@OOXXOOXXA
  28. /dev/block/loop6 1.7M 1.6M 0 100% /apex/com.android.resolv@OOXXAOOXX
  29. /dev/block/loop7 102M 102M 0 100% /apex/com.android.runtime@N
  30. /dev/block/loop8 840K 812K 12K 99% /apex/com.android.tzdata@OOXXAOOXX
  31. none 2.7G 0 2.7G 0% /sys/fs/cgroup
  32. /data/media 108G 107G 1.7G 99% /storage/emulated
  33. /data/misc_ce/0/kdfs/storage 109G 107G 1.7G 99% /mnt/mdfs/.hmdfs
  34. /data/media/0 109G 107G 1.7G 99% /mnt/mdfs/sdcard
  35. /mnt/media_rw/222E-1201 29G 11G 19G 37% /storage/NNNE-NNNN
  36. mdfs 1.7G 0 1.7G 0% /mnt/mdfs/groups
  37. C:\adb>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/134541
推荐阅读
相关标签
  

闽ICP备14008679号