zoukankan      html  css  js  c++  java
  • Android 编译 product 分区

    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

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/onelikeone/p/11556427.html
Copyright © 2011-2022 走看看