v android ndk,VNDK 构建系统支持  |  Android 开源项目  |  Android Open Source Project

在 Android 8.1 及更高版本中,构建系统内置了 VNDK 支持。如果启用了 VNDK 支持,构建系统就会检查各模块之间的依赖关系,为供应商模块构建特定于供应商的变体,并自动将这些模块安装到指定目录中。

VNDK 构建支持示例

在此示例中,Android.bp 模块的定义定义了一个名为 libexample 的库。vendor_available 属性指示框架模块和供应商模块可以依赖于 libexample:

4ac04d15304539e2c15fe7784512c12d.png

图 1. 已启用 VNDK 支持

框架可执行文件 /system/bin/foo 和供应商可执行文件 /vendor/bin/bar 均依赖于 libexample,并在其 shared_libs 属性中指定了 libexample。

如果框架模块和供应商模块均使用 libexample,将会构建 libexample 的两个变体。核心变体(以 libexample 命名)由框架模块使用,供应商变体(以 libexample.vendor 命名)由供应商模块使用。这两个变体将安装到不同的目录中:

核心变体将安装到 /system/lib[64]/libexample.so 中。

供应商变体将安装到 VNDK APEX 中,因为 vndk.enabled 为 true。

如需了解详情,请参阅模块定义。

配置构建支持

如需为产品设备启用全面的构建系统支持,请将 BOARD_VNDK_VERSION 添加到 BoardConfig.mk:

BOARD_VNDK_VERSION := current

此设置具有全局效应:如果在 BoardConfig.mk 中定义,系统会检查所有模块。由于没有将违规模块列入黑名单或白名单的机制,因此在添加 BOARD_VNDK_VERSION 之前,应清除所有不必要的依赖项。您可以通过在环境变量中设置 BOARD_VNDK_VERSION 来测试和编译模块:

$ BOARD_VNDK_VERSION=current m module_name.vendor

如果启用 BOARD_VNDK_VERSION,系统会移除多个默认的全局头文件搜索路径。其中包括:

frameworks/av/include

frameworks/native/include

frameworks/native/opengl/include

hardware/libhardware/include

hardware/libhardware_legacy/include

hardware/ril/include

libnativehelper/include

libnativehelper/include_deprecated

system/core/include

system/media/audio/include

如果某个模块依赖于上述目录中的头文件,您必须指明与 header_libs、static_libs 和/或 shared_libs 的依赖关系。

VNDK APEX

在 Android 10 及更低版本中,设置了 vndk.enabled 的模块安装在 /system/lib[64]/vndk[-sp]-${VER} 中。在 Android 11 及更高版本中,VNDK 库打包为 APEX 格式,且 VNDK APEX 的名称为 com.android.vndk.v${VER}。VNDK APEX 可以是扁平化的,也可以是非扁平化的,具体取决于设备配置;VNDK APEX 可从规范路径 /apex/com.android.vndk.v${VER} 中获取。

d80f80b5d866c0f432eb70063f5f22f9.png

图 2. VNDK APEX

模块定义

如需使用 BOARD_VNDK_VERSION 构建 Android,您必须在 Android.mk 或 Android.bp 中修改模块定义。此部分介绍了不同种类的模块定义,一些与 VNDK 相关的模块属性,以及在构建系统中实现的依赖项检查。

供应商模块

供应商模块是特定于供应商的可执行文件或共享库(必须将这些模块安装到供应商分区中)。在 Android.bp 文件中,供应商模块必须将 vendor 或 proprietary 属性设为 true。在 Android.mk 文件中,供应商模块必须将 LOCAL_VENDOR_MODULE 或 LOCAL_PROPRIETARY_MODULE 设为 true。

如果定义了 BOARD_VNDK_VERSION,构建系统不允许在供应商模块和框架模块之间建立依赖关系,并且构建系统会在以下情况下发出错误:

未设置 vendor:true 的模块依赖于设置了 vendor:true 的模块,或

设置了 vendor:true 的模块依赖于既未设置 vendor:true 也未设置 vendor_available:true 的非 llndk_library 模块。

依赖项检查适用于 Android.bp 中的 header_libs、static_libs 和 shared_libs,以及 Android.mk 中的 LOCAL_HEADER_LIBRARIES、LOCAL_STATIC_LIBRARIES 和 LOCAL_SHARED_LIBRARIES。

LL-NDK

LL-NDK 共享库是具有稳定 ABI 的共享库。框架模块和供应商模块具有相同的最新实现。对于每个 LL-NDK 共享库,Android.bp 都包含一个 llndk_library 模块定义:

llndk_library {

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值