https://source.android.google.cn/devices/bootloader/product-partitions

 

编译 product 分区

Android 9​ 支持使用 Android 编译系统构建 /product 分区。之前,Android 8.x 强制将系统芯片 (SoC) 专属组件从 /system 分区分隔到了 /vendor 分区,不会为从 Android 编译系统构建的原始设备制造商 (OEM) 专属组件提供专用空间。

product 分区简介

许多原始设备制造商 (OEM) 会自定义 AOSP 系统映像,以实施自己的功能并满足运营商的要求。不过,如果进行这类自定义,则无法针对多个软件 SKU 使用单个系统映像,因为映像必须各不相同,才能支持不同的语言区域、运营商等;如果使用单独的 /product 分区来包含自定义项,则可以无法针对多个软件 SKU 使用单个系统映像(/system 分区会托管可在众多软件 SKU 之间共享的通用代码)。/vendor 分区会继续托管 SoC 专用板级 (BSP) 代码,这类代码可以基于指定 SoC 在多台设备之间共享。

使用单独的分区存在一些弊端,例如,难以管理磁盘空间(应该预留一定的空间满足未来增长的空间需求),以及难以在各分区之间维护稳定的应用二进制接口 (ABI)。在决定使用 /product 分区之前,请花些时间考虑一下您的 AOSP 实现的具体情况和可行的缓解策略(例如,在无线下载 (OTA) 更新期间对设备进行重新分区;此操作不是由 Google 来完成,而是由某些 OEM 来完成)。

旧式 /oem 与 /product

/product 分区与旧式 /oem 分区不同:

分区 属性
/oem
  • 不可更新;通常在出厂时刷写一次。
  • 根据品牌信息和颜色等细微差异进行构建。不同的 /oem 分区内容不会使其成为不同的产品软件。
  • 系统分区不依赖于 /oem(仅当在其中找到特定文件时才使用该分区)。
  • 切勿在系统上使用除公共 API 之外的 API。
/product
  • 可更新
  • 搭配系统图像(该分区与系统映像一起更新)
  • 按产品或产品系列构建。
  • 系统分区可以依赖于 /product 分区。
  • 可以使用非公共 API,因为它们同时更新。

出于这些原因,Android 9 支持新的 /product 分区,同时也针对依赖于旧式 /oem 分区的设备保留了对该分区的支持。

/product 组件

/product 分区包含以下组件:

  • 产品专用的系统属性 (/product/build.prop)
  • 产品专用的 RRO (/product/overlay/*.apk)
  • 产品专用的应用 (/product/app/*.apk)
  • 产品专用的特权应用 (/product/priv-app/*.apk)
  • 产品专用的内容库 (/product/lib/*)
  • 产品专用的 Java 库 (/product/framework/*.jar)
  • 产品专用的 Android 框架系统配置(/product/etc/sysconfig/*/product/etc/permissions/*
  • 产品专用的媒体文件 (/product/media/audio/*)
  • 产品专用的 bootanimation 文件

不得使用 custom_images

您不能使用 custom_images,因为它们缺乏对以下各项的支持:

  • 将模块安装到特定目标分区中custom_images 支持将软件工件复制到映像中,但无法将模块安装到特定分区中(通过将其目标分区指定为编译规则的一部分)。
  • Soong 支持。无法使用 Soong 编译系统编译 custom_images
  • OTA 更新支持。custom_images 用作出厂 ROM 映像,无法执行 OTA 更新。

维护分区之间的 ABI

Android 9 中的 /product 分区是 /system 分区的扩展。由于 /product/system 分区之间的 ABI 稳定性较弱,因此必须同时升级这两者,而且 ABI 应基于系统 SDK。如果系统 SDK 不涵盖 /product/system 之间的所有 API 表面,则 OEM 负责在这两个分区之间维护自己的 ABI。

/product 分区和 /system 分区可以相互依赖。不过,在没有 /product 分区的情况下,对通用系统映像 (GSI) 的测试必须能够正常运行。

/product 分区不能对 /vendor 分区有任何依赖,而且 /product 分区和 /vendor 分区之间不允许有任何直接交互(由 SEpolicy 强制执行)。

实现 product 分区

在实现新 product 分区之前,请先了解 AOSP 中的相关 product 分区变化。接下来,为了设置 /product,请添加以下开发板编译标记或 product 编译标记:

  • BOARD_USES_PRODUCTIMAGE
  • BOARD_PRODUCTIMAGE_PARTITION_SIZE
  • BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
  • PRODUCT_PRODUCT_PROPERTIES for /product/build.prop,应该在 $(call inherit-product path/to/device.mk) 内,例如 PRODUCT_PRODUCT_PROPERTIES += product.abc=ok

向 product 分区中安装模块

使用以下编译标记向 product 分区中安装模块。

  • Android.bp 中的 product_specific: true
  • Android.mk 中的 LOCAL_PRODUCT_MODULE := true

启用启动时验证

为防止 /product 分区被恶意软件篡改,您应该为该分区启用 Android 启动时验证 (AVB)(就像为 /vendor/system 分区启用一样)。要启用 AVB,请添加以下编译标记:BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS

转载于:https://www.cnblogs.com/onelikeone/p/11556427.html

更多相关文章

  1. 新版 Android(安卓)Studio 编译输出中文乱码问题
  2. Android(安卓)Build 系统
  3. android 应用如何获取系统权限 以及root系统方法
  4. Android(安卓)Recovery模式
  5. android apk dex odex jar 等文件的 反编译工具
  6. Android(安卓)的source (需安装 git repo)
  7. doubango tinyDEMO 编译
  8. Android(安卓)studio JNI开发
  9. 编译android版本的opencv 2.4.2

随机推荐

  1. Android QQ、微信聊天消息界面设计原理与
  2. android taskAffinity属性
  3. android开发常用知识点备忘录
  4. Android中的常用控件之进度条(ProgressBar
  5. Android之访问网络,使用HttpURLConnection
  6. Eclipse安装ADT的技巧,解决连接不到 https
  7. Android中界面中有多个edittext,如何默认
  8. 传智播客Android视频教程——第五天
  9. android intent 传递list或者对象
  10. 系出名门Android(3) - 对话框(Dialog)和