动态链接器解决了 Treble VNDK 设计中的两个难题:
- SP-HAL 共享库及其依赖项(包括 VNDK-SP 库)加载到框架进程中时,应该有一些防止出现符号冲突的机制。
- 和 可能会引入一些在构建时不可见的运行时依赖项,这些依赖项使用静态分析很难检测到。
这两个难题可以通过链接器命名空间机制得到解决。此机制由动态链接器提供,可以隔离不同链接器命名空间中的共享库,以确保具有相同库名称和不同符号的库不会发生冲突。
另一方面,链接器命名空间机制可提供相应的灵活性,从而将可由一个链接器命名空间导出的某些共享库用于另一个链接器命名空间。这些导出的共享库可以成为对其他程序公开的应用编程接口,同时在其链接器命名空间中隐藏实现细节。
例如, 和 是两个共享库。这两个库可以有不同的符号。它们会加载到不同的链接器命名空间中,以便框架模块可以依赖于 ,而 SP-HAL 共享库则可以依赖于 。
另一方面, 是由一个链接器命名空间导出而后又被导入到许多链接器命名空间中的公共库。 的依赖项(例如 )将被加载到 所在的命名空间中。其他命名空间将无法访问这些依赖项。这种机制会在提供公共接口的同时封装实现细节。
动态链接器负责加载 条目中指定的共享库,或由 或 的参数指定的共享库。在这两种情况下,动态链接器都会找出调用方所在的链接器命名空间,并尝试将相关依赖项加载到同一个链接器命名空间中。如果动态链接器无法将共享库加载到指定的链接器命名空间中,它会向关联的链接器命名空间索取导出的共享库。
配置文件格式取决于 INI 文件格式。典型的配置文件如下所示:
配置文件包含以下内容:
- 位于开头的多个“目录-区段”映射属性,用于让动态链接器选择有效的区段。
- 多个链接器命名空间配置区段:
- 每个区段都包含多个命名空间(图形顶点)以及各命名空间之间的多个回退链接(图形弧)。
- 每个命名空间都具有自己的隔离、搜索路径、允许的路径以及可见性设置。
下表详细介绍了各属性的含义。
指向 区段所应用到的目录的路径。
每个属性都会将目录下的可执行文件映射到链接器命名空间配置区段。可能会有 2 个(或 2 个以上)属性具有相同的 ,但却指向不同的目录。
这表示在 区段中指定的配置适用于从 或 加载的可执行文件。
在 区段中指定的配置适用于从 加载的可执行文件。
相应区段的其他命名空间(除 命名空间外)的英文逗号分隔列表。
这表示在 配置中有 3 个命名空间(、 和 )。
回退命名空间的英文逗号分隔列表。
如果在当前命名空间中找不到共享库,动态链接器会尝试从回退命名空间加载共享库。在列表开头指定的命名空间优先级较高。
如果某个共享库或可执行文件请求另一个共享库,而后者无法加载到 命名空间,动态链接器就会尝试从 命名空间加载此共享库。
然后,如果此共享库也无法从 命名空间加载,动态链接器就会尝试从 命名空间加载此共享库。
最后,如果所有尝试都失败,动态链接器就会返回一个错误。
用英文冒号分隔的共享库列表(如果在 命名空间中找不到这些共享库,可以在 命名空间中搜索)。
此属性无法与 一起使用。
这表示回退链接仅接受 或 作为请求的库名称。如果请求的库名称既不是 也不是 ,动态链接器会忽略从 到 命名空间的回退链接。
一个布尔值,用于指示当无法在 命名空间中找到共享库时,能否在 命名空间中搜索到所有这些共享库。
此属性无法与 一起使用。
这表示所有库名称都可以遍历从 到 命名空间的回退链接。
一个布尔值,用于指示动态链接器是否应该检查共享库在什么位置。
如果 为 ,系统只能加载某个 目录(不包含子目录)中的共享库或某个 目录(包含子目录)下的共享库。
如果 为 (默认值),动态链接器不会检查共享库的路径。
这表示只有 中或 下的共享库才能加载到 命名空间。
以英文冒号分隔的目录列表,用于搜索共享库。
如果函数调用 或 条目时未指定完整路径,在 中指定的目录将附加到请求的库名称前面。在列表开头指定的目录优先级较高。
如果 为 ,系统可加载某个 目录(不包含子目录)中的共享库(无论 为何属性)。
例如,如果 为 且 为空,可以加载 ,但无法加载 。
这表示动态链接器会在 中搜索共享库。
以英文冒号分隔的目录列表,用于在启用 AddressSanitizer (ASan) 后搜索共享库。
在启用 ASan 后,系统会忽略 。
这表示在启用 ASan 后,动态链接器会先搜索 ,然后再搜索 。
以英文冒号分隔的目录列表(包含子目录),当 为 时,动态链接器可在其中加载共享库(以及 )。
的子目录下的共享库也可以加载。例如,如果 为 , 和 均可加载。
如果 为 ,系统会忽略 并发出相应警告。
这表示 下的共享库可以加载到隔离的 命名空间。
例如,如果没有 , 就无法将 加载到 命名空间。
以英文冒号分隔的目录列表,在启用 ASan 后,动态链接器可在其中加载共享库。
在启用 ASan 后,系统会忽略 。
这表示在启用 ASan 后, 或 下的共享库可以加载到隔离的 命名空间。
一个布尔值,用于指示程序(不包括 )能否包含带有 的链接器命名空间句柄,以及能否通过将此句柄传递到 来打开链接器命名空间中的共享库。
如果 为 , 在命名空间存在时始终返回此句柄。
如果 为 (默认值),无论命名空间是否存在, 始终返回 。仅当符合以下条件时,共享库才能加载到此命名空间:(1) 具有指向此命名空间的回退链接的其他链接器命名空间请求这些共享库,或者 (2) 此命名空间中的其他共享库或可执行文件请求这些共享库。
这表示 可以返回有效的链接器命名空间句柄。
在 Android 11 中,系统会在运行时在 下创建链接器配置,而不是在 中使用纯文本文件来创建链接器配置。配置是在启动时根据运行时环境生成的,其中包括以下内容:
- 设备是否支持 VNDK
- vendor 分区的目标 VNDK 版本
- product 分区的 VNDK 版本
- 已安装的 APEX 模块
链接器配置是通过解析链接器命名空间之间的依赖关系来创建的。例如,如果 APEX 模块上有包括依赖项更新在内的任何更新,就会生成链接器配置,以反映这些变化。如需详细了解如何创建链接器配置,请参阅 。
有 3 类配置文件。系统会根据 中 和 的值在启动时生成相应的配置。
选择的配置 VTS 要求 搭载 Android 9 或更高版本的设备的必要配置 空 搭载 Android 8.x 的设备的必要配置 空 适用于不支持 Treble 的设备
VNDK Lite 配置会隔离 SP-HAL 和 VNDK-SP 共享库。在 Android 8.0 中,当 为 时,该配置必须是动态链接器的配置文件。
VNDK 配置还会隔离 SP-HAL 和 VNDK-SP 共享库。此外,此配置还会提供全面的动态链接器隔离。它可确保 system 分区中的模块不依赖于 vendor 分区中的共享库,反之亦然。
在 Android 8.1 或更高版本中,VNDK 配置是默认配置,强烈建议您将 设置为 ,以启用全面的动态链接器隔离。
VNDK 配置会隔离 system 分区和 vendor 分区之间的共享库依赖项。下文概述了该配置文件与上一子部分中提到的配置相比有哪些不同:
- 框架进程
- 创建了 、、 和 命名空间。
- 系统会隔离所有命名空间。
- 将系统共享库加载到 命名空间中。
- 将 SP-HAL 加载到 命名空间中。
- 将 VNDK-SP 共享库加载到 命名空间中。
- 供应商进程
- 创建了 、 和 命名空间。
- 隔离 命名空间。
- 将供应商共享库加载到 命名空间中。
- 将 VNDK 和 VNDK-SP 共享库加载到 命名空间中。
- 将 LL-NDK 及其依赖项加载到 命名空间中。
链接器命名空间之间的关系如下所示:

图 1. 链接器命名空间隔离(VNDK 配置)。
在上图中,LL-NDK 和 VNDK-SP 代表以下共享库:
- LL-NDKLL-NDK
- VNDK-SPVNDK-SP
您可以查看设备的 ,了解更多详情。
从 Android 8.0 开始,动态链接器将配置为隔离 SP-HAL 和 VNDK-SP 共享库,以使其符号不会与其他框架共享库发生冲突。链接器命名空间之间的关系如下所示。

LL-NDK 和 VNDK-SP 代表以下共享库:
- LL-NDKLL-NDK
- (不在配置中)
- (已移到配置中的 VNDK-SPVNDK-SP)
- VNDK-SPVNDK-SP
下表列出了框架进程的命名空间配置(摘自 VNDK Lite 配置中的 区段)。
LL-NDK VNDK-SP (适用于 VNDK-SP)
LL-NDK (适用于 RenderScript)
(适用于已编译的 RS 内核) LL-NDK
VNDK-SP
下表列出了供应商进程的命名空间配置(摘自 VNDK Lite 配置中的 区段)。
(已弃用)
(已弃用)
如需了解更多详情,请参阅 。
- 在 Android 11 中,静态 文件会从代码库中移除,而 LinkerConfig 会在运行时生成它们。
- 在 Android 9 中, 链接器命名空间已添加到供应商进程,而且 VNDK 共享库已与默认链接器命名空间隔离开。
- 将 替换为更具体的 。
- Android 9 更改了以下动态链接器配置文件的名称。
Android 8.x Android 9 说明 对于具有运行时链接器命名空间隔离的设备 对于具有 VNDK-SP 链接器命名空间隔离的设备 对于搭载 Android 7.x 或更低版本的旧设备 - 移除了 。
- 添加了 和 分区。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qdvuejs/37861.html