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

Android 编译 product 分区的更多相关文章

  1. Android编译环境折腾记

    题记:感觉是时候写点什么了=_=! 第一次安装了ubuntu14.04.5,官网下载的iso,官网下的jar,编译android4.x需要安装jdk6,更高的版本会有问题,baidu到很多搭建环境的步 ...

  2. [Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程

    本文转载自:[Android 编译(一)] Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  3. Android编译过程详解(一)

    Android编译过程详解(一) 注:本文转载自Android编译过程详解(一):http://www.cnblogs.com/mr-raptor/archive/2012/06/07/2540359 ...

  4. Android编译过程详解(三)

    前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量. 1. build/core/config.mk 109 ...

  5. Android编译环境(1) - 编译Native C的模块

    Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准的Android.mk. Android.mk文件本身是比 ...

  6. Android——编译release版签名系统

    http://blog.csdn.net/jscese/article/details/24243171 在我的第一篇博客里面http://blog.csdn.net/jscese/article/d ...

  7. Android编译系统环境初始化过程分析

    Android源代码在编译之前,要先对编译环境进行初始化,其中最主要就是指定编译的类型和目标设备的型号.Android的编译类型主要有eng.userdebug和user三种,而支持的目标设备型号则是 ...

  8. android 编译模块

    android 编译模块 在写完.c文件之后,需要加载到android上进行测试.使用arm-linux-gcc编译,并添加到android开发板上运行失败. 由于android与linux不同,需要 ...

  9. Android编译命令

    目录 说在前面 编译流程 编译指令 代码编译 代码检索 其他指令 说在前面 从最开始接触Android系统开始,每次进行代码编译都需要网上搜索编译指令.后来大致熟悉了Android的编译体系,加深了对 ...

随机推荐

  1. Xshell6和Xftp6 破解免安装版,无窗口多开限制

    免安装无窗口限制破解版 链接:https://pan.baidu.com/s/1wpFE499qoTjqHrPdQmTn4g提取码:2xcn 如上面的链接失效,可使用以下的链接: https://pa ...

  2. secureCRT 中各种传输协议分析 启动daemon运行守护进程(转)

    转载链接:http://blog.sina.com.cn/s/blog_61798d5d01018yk4.html [Telnet]著名的终端访问协议,传统的网络服务程序,如FTP.POP和Telne ...

  3. Python的路径操作(os模块与pathlib模块)

    Python的路径操作(os模块与pathlib模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.os.path模块(Python 3.4版本之前推荐使用该模块) #!/u ...

  4. MongoDB 分片问题汇总

    分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机 ...

  5. 项目Alpha冲刺(团队)-第八天冲刺

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队) 团队名称:为了交项目干杯 作业目标:描述第八天冲刺的项目进展.问题困难.心得体会 队员姓名与学号 队员学号 ...

  6. 浏览器 Web Storage - sessionStorage & localStorage

    storage事件 当储存的数据发生变化时,会触发storage事件.我们可以指定这个事件的回调函数. window.addEventListener("storage",onSt ...

  7. JavaScript Array 對象

    JavaScript array 對象 array對象,是用於在單個變量中存儲多個值的一種變量類型. 創建array對象的語法: new array(); new array(size); new a ...

  8. AtCoder Beginner Contest 127 解题报告

    传送门 非常遗憾.当天晚上错过这一场.不过感觉也会掉分的吧.后面两题偏结论题,打了的话应该想不出来. A - Ferris Wheel #include <bits/stdc++.h> u ...

  9. LightOJ - 1322 - Worst Case Trie(DP)

    链接: https://vjudge.net/problem/LightOJ-1322 题意: In Computer Science Trie or prefix tree is a data st ...

  10. B/S之大文件分段上传、断点续传

    4GB以上超大文件上传和断点续传服务器的实现 随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上 ...