Пространство имен компоновщика

Динамический компоновщик решает две проблемы при разработке Treble VNDK:

  • Общие библиотеки SP-HAL и их зависимости, включая библиотеки VNDK-SP, загружаются в процессы платформы. Должны быть какие-то механизмы для предотвращения конфликтов символов.
  • dlopen() и android_dlopen_ext() могут вводить некоторые зависимости времени выполнения, которые не видны во время сборки и их сложно обнаружить с помощью статического анализа.

Эти две проблемы могут быть решены с помощью механизма пространства имен компоновщика . Этот механизм обеспечивается динамическим компоновщиком. Он может изолировать общие библиотеки в разных пространствах имен компоновщика, чтобы библиотеки с одинаковым именем, но с разными символами не конфликтовали.

С другой стороны, механизм пространства имен компоновщика обеспечивает гибкость, позволяющую экспортировать некоторые общие библиотеки из пространства имен компоновщика и использовать их в другом пространстве имен компоновщика. Эти экспортированные общие библиотеки могут стать интерфейсами прикладного программирования, общедоступными для других программ, при этом детали их реализации скрываются в пространствах имен компоновщика.

Например, /system/lib[64]/libcutils.so и /system/lib[64]/vndk-sp-${VER}/libcutils.so — это две общие библиотеки. Эти две библиотеки могут иметь разные символы. Они загружаются в разные пространства имен компоновщика, поэтому модули платформы могут зависеть от /system/lib[64]/libcutils.so , а общие библиотеки SP-HAL могут зависеть от /system/lib[64]/vndk-sp-${VER}/libcutils.so .

С другой стороны, /system/lib[64]/libc.so — это пример общедоступной библиотеки, которая экспортируется пространством имен компоновщика и импортируется во многие пространства имен компоновщика. Зависимости /system/lib[64]/libc.so , такие как libnetd_client.so , загружаются в пространство имен, в котором находится /system/lib[64]/libc.so . Другие пространства имен не будут иметь доступа к этим зависимостям. Этот механизм инкапсулирует детали реализации, обеспечивая при этом общедоступные интерфейсы.

Как это работает

Динамический компоновщик отвечает за загрузку общих библиотек, указанных в записях DT_NEEDED , или общих библиотек, указанных аргументом dlopen() или android_dlopen_ext() . В обоих случаях динамический компоновщик находит пространство имен компоновщика, в котором находится вызывающая сторона, и пытается загрузить зависимости в то же пространство имен компоновщика. Если динамический компоновщик не может загрузить общую библиотеку в указанное пространство имен компоновщика, он запрашивает у связанного пространства имен компоновщика экспортированные общие библиотеки.

Формат файла конфигурации

Формат файла конфигурации основан на формате файла INI. Типичный файл конфигурации выглядит так:

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

Файл конфигурации включает в себя:

  • Несколько свойств сопоставления разделов каталога в начале, позволяющие динамическому компоновщику выбрать эффективный раздел.
  • Несколько разделов конфигурации пространств имен компоновщика:
    • Каждый раздел содержит несколько пространств имен (вершины графа) и несколько резервных связей между пространствами имен (дуги графа).
    • Каждое пространство имен имеет свою собственную изоляцию, пути поиска, разрешенные пути и настройки видимости.

В таблицах ниже подробно описано значение каждого свойства.

Свойство сопоставления разделов каталога

Свойство Описание Пример

dir. name

Путь к каталогу, к которому относится раздел [ name ] .

Каждое свойство сопоставляет исполняемые файлы в каталоге с разделом конфигурации пространств имен компоновщика. Могут существовать два (или более) свойства с одинаковым name , но указывающие на разные каталоги.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Это указывает на то, что конфигурация, указанная в разделе [system] применяется к исполняемым файлам, загружаемым из /system/bin или /system/xbin .

Конфигурация, указанная в разделе [vendor] применяется к исполняемым файлам, загружаемым из /vendor/bin .

Свойства отношения

Свойство Описание Пример
additional. namespaces

Разделенный запятыми список дополнительных пространств имен (помимо пространства имен default ) для раздела.

additional. namespaces = sphal, vndk

Это указывает на то, что в конфигурации [system] есть три пространства имен ( default , sphal и vndk ).

namespace. name . links

Список резервных пространств имен, разделенный запятыми.

Если общая библиотека не может быть найдена в текущем пространстве имен, динамический компоновщик пытается загрузить общую библиотеку из резервных пространств имен. Пространство имен, указанное в начале списка, имеет более высокий приоритет.

namespace. sphal. links = default, vndk

Если общая библиотека или исполняемый файл запрашивает общую библиотеку, которую невозможно загрузить в пространство имен sphal , динамический компоновщик пытается загрузить общую библиотеку из пространства имен default .

А затем, если общую библиотеку также невозможно загрузить из пространства имен default , динамический компоновщик пытается загрузить общую библиотеку из пространства имен vndk .

Наконец, если все попытки завершаются неудачей, динамический компоновщик возвращает ошибку.

namespace. name . link. other . shared_libs

Список общих библиотек, разделенных двоеточиями, которые можно искать в other пространствах имен, если эти библиотеки не найдены в пространстве name .

Это свойство нельзя использовать с namespace. name . link. other . allow_all_shared_libs .

namespace. sphal. link. default. shared_libs = libc.so: libm.so

Это означает, что резервная ссылка принимает в качестве запрошенного имени библиотеки только libc.so или libm.so Динамический компоновщик игнорирует резервную ссылку из sphal в пространство имен default если имя запрошенной библиотеки не libc.so или libm.so .

namespace. name . link. other . allow_all_shared_libs

Логическое значение, указывающее, можно ли искать все общие библиотеки в other пространстве имен, если эти библиотеки не могут быть найдены в пространстве name .

Это свойство нельзя использовать с namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

Это указывает на то, что все имена библиотек могут проходить через резервную ссылку из vndk в пространство имен sphal .

Свойства пространства имен

Свойство Описание Пример
namespace. name . isolated

Логическое значение, указывающее, должен ли динамический компоновщик проверять, где находится общая библиотека.

Если isolated установлено значение true , могут быть загружены только те общие библиотеки, которые находятся в одном из каталогов search.paths (исключая подкаталоги) или в одном из каталогов permitted.paths (включая подкаталоги).

Если isolated установлено значение false (по умолчанию), динамический компоновщик не проверяет путь к общим библиотекам.

namespace. sphal. isolated = true

Это означает, что в пространство имен sphal можно загрузить только общие библиотеки из search.paths или из permitted.paths .

namespace. name . search.paths

Список каталогов, разделенных двоеточиями, для поиска общих библиотек.

Каталоги, указанные в search.paths добавляются к имени запрошенной библиотеки, если вызовы функций dlopen() или записи DT_NEEDED не указывают полный путь. Каталог, указанный в начале списка, имеет более высокий приоритет.

Если isolated установлено значение true , общие библиотеки, находящиеся в одном из каталогов search.paths (за исключением подкаталогов), могут быть загружены независимо от свойства permitted.paths .

Например, если search.paths — это /system/${LIB} , а permitted.paths пусто, /system/${LIB}/libc.so можно загрузить, но /system/${LIB}/vndk/libutils.so загрузить нельзя.

namespace. default. search.paths = /system/${LIB}

Это означает, что динамический компоновщик ищет в /system/${LIB} общие библиотеки.

namespace. name . asan.search.paths

Список каталогов, разделенных двоеточиями, для поиска общих библиотек, когда включен AddressSanitizer (ASan) .

namespace. name . search.paths игнорируется, когда ASan включен.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

Это означает, что когда ASan включен, динамический компоновщик сначала ищет /data/asan/system/${LIB} , а затем ищет /system/${LIB} .

namespace. name . permitted.paths

Список каталогов (включая подкаталоги), разделенных двоеточиями, в которые динамический компоновщик может загружать общие библиотеки (в дополнение к search.paths ), если isolated , имеет значение true .

Также можно загрузить общие библиотеки, находящиеся в подкаталогах permitted.paths . Например, если permitted.paths равен /system/${LIB} , можно загрузить как /system/${LIB}/libc.so , так и /system/${LIB}/vndk/libutils.so .

Если isolated установлено значение false , permitted.paths игнорируются и выдается предупреждение.

namespace. default. permitted.paths = /system/${LIB}/hw

Это означает, что общие библиотеки в /system/${LIB}/hw могут быть загружены в изолированное пространство имен default .

Например, без permitted.paths libaudiohal.so не сможет загрузить /system/${LIB}/hw/audio.a2dp.default.so в пространство имен default .

namespace. name . asan.permitted.paths

Список каталогов, разделенных двоеточиями, в которые динамический компоновщик может загружать общие библиотеки при включенном ASan .

namespace. name . permitted.paths игнорируется, когда ASan включен.

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

Это означает, что когда ASan включен, общие библиотеки в /data/asan/system/${LIB}/hw или /system/${LIB}/hw могут быть загружены в изолированное пространство имен default .

namespace. name . visible

Логическое значение, указывающее, может ли программа (кроме libc ) получить дескриптор пространства имен компоновщика с помощью android_get_exported_namespace() и открыть общую библиотеку в пространстве имен компоновщика, передав дескриптор в android_dlopen_ext() .

Если visible имеет true , android_get_exported_namespace() всегда возвращает дескриптор, если пространство имен существует.

Если visible имеет значение false (по умолчанию), android_get_exported_namespace() всегда возвращает NULL независимо от наличия пространства имен. Общие библиотеки можно загрузить в это пространство имен только в том случае, если (1) они запрошены другим пространством имен компоновщика, имеющим резервную ссылку на это пространство имен, или (2) они запрошены другими общими библиотеками или исполняемыми файлами в этом пространстве имен.

namespace. sphal. visible = true

Это указывает на то, что android_get_exported_namespace("sphal") может возвращать действительный дескриптор пространства имен компоновщика.

Создание пространства имен компоновщика

В Android 11 конфигурация компоновщика создается во время выполнения в /linkerconfig вместо использования простых текстовых файлов в ${android-src}/system/core/rootdir/etc . Конфигурация генерируется во время загрузки на основе среды выполнения и включает в себя следующие элементы:

  • Если устройство поддерживает VNDK
  • Целевая версия VNDK раздела поставщика
  • Версия VNDK раздела продукта
  • Установленные модули APEX

Конфигурация компоновщика создается путем разрешения зависимостей между пространствами имен компоновщика. Например, если в модулях APEX имеются какие-либо обновления, включающие обновления зависимостей, конфигурация компоновщика создается с учетом этих изменений. Более подробную информацию о создании конфигурации компоновщика можно найти в ${android-src}/system/linkerconfig .

Изоляция пространства имен компоновщика

Существует три типа конфигурации. В зависимости от значения PRODUCT_TREBLE_LINKER_NAMESPACES и BOARD_VNDK_VERSION в BoardConfig.mk соответствующая конфигурация генерируется во время загрузки.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Выбранная конфигурация Требование СДС
true current VNDK Обязательно для устройств с Android 9 или более поздней версии.
Пустой VNDK Lite Обязательно для устройств с Android 8.x.
false Пустой Legacy Для устройств без высоких частот

Конфигурация VNDK Lite изолирует общие библиотеки SP-HAL и VNDK-SP. В Android 8.0 это должен быть файл конфигурации для динамического компоновщика, если PRODUCT_TREBLE_LINKER_NAMESPACES имеет true .

Конфигурация VNDK также изолирует общие библиотеки SP-HAL и VNDK-SP. Кроме того, эта конфигурация обеспечивает полную динамическую изоляцию компоновщика. Это гарантирует, что модули в системном разделе не будут зависеть от общих библиотек в разделах поставщика и наоборот.

В Android 8.1 или более поздней версии конфигурация VNDK является конфигурацией по умолчанию, и настоятельно рекомендуется включить полную динамическую изоляцию компоновщика, задав для BOARD_VNDK_VERSION значение current .

Конфигурация ВНДК

Конфигурация VNDK изолирует зависимости общей библиотеки между системным разделом и разделами поставщика. По сравнению с конфигурациями, упомянутыми в предыдущем подразделе, различия заключаются в следующем:

  • Рамочные процессы

    • создаются пространства имен default , vndk , sphal и rs .
    • Все пространства имен изолированы.
    • Общие системные библиотеки загружаются в пространство имен default .
    • SP-HAL загружаются в пространство имен sphal .
    • Общие библиотеки VNDK-SP загружены в пространство имен vndk .
  • Процессы поставщиков

    • создаются пространства имен default , vndk и system .
    • Пространство имен default изолировано.
    • Общие библиотеки поставщика загружаются в пространство имен default .
    • Общие библиотеки VNDK и VNDK-SP загружаются в пространство имен vndk .
    • LL-NDK и его зависимости загружаются в пространство имен system .

Взаимосвязь между пространствами имен компоновщика показана ниже.

Граф пространства имен компоновщика, описанный в конфигурации VNDK.

Рисунок 1. Изоляция пространства имен компоновщика (конфигурация VNDK).

На изображении выше LL-NDK и VNDK-SP обозначают следующие общие библиотеки:

  • ЛЛ-НДК
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • ВНДК-СП
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

Более подробную информацию можно найти в файле /linkerconfig/ld.config.txt устройства.

Конфигурация ВНДК Lite

Начиная с Android 8.0, динамический компоновщик настроен на изоляцию общих библиотек SP-HAL и VNDK-SP, чтобы их символы не конфликтовали с другими общими библиотеками платформы. Взаимосвязь между пространствами имен компоновщика показана ниже.

Граф пространства имен компоновщика, описанный в конфигурации VNDK Lite.
Рисунок 2. Изоляция пространства имен компоновщика (конфигурация VNDK Lite)

LL-NDK и VNDK-SP обозначают следующие общие библиотеки:

  • ЛЛ-НДК
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (нет в конфигурации)
    • libsync.so
    • libvndksupport.so
    • libz.so (в конфигурации перенесен в VNDK-SP )
  • ВНДК-СП
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

В таблице ниже перечислены конфигурации пространств имен для процессов платформы, взятые из раздела [system] конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs ЛЛ-НДК
link.vndk.shared_libs ВНДК-СП
link.rs.shared_libs libRS_internal.so
vndk (для ВНДК-СП) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs ЛЛ-НДК
rs (для RenderScript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data (для скомпилированного ядра RS)
isolated true
visible true
links default,vndk
link.default.shared_libs ЛЛ-НДК
libmediandk.so
libft2.so
link.vndk.shared_libs ВНДК-СП

В таблице ниже представлена ​​конфигурация пространств имен для процессов поставщика, взятая из раздела [vendor] в конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (устарело)
/product/${LIB} (устарело)
isolated false

Более подробную информацию можно найти в файле /linkerconfig/ld.config.txt устройства.

История документа

Изменения Android 11

  • В Android 11 статические файлы ld.config.*.txt удаляются из базы кода, и вместо этого LinkerConfig генерирует их во время выполнения.

Изменения в Android 9

  • В Android 9 пространство имен компоновщика vndk добавляется к процессам поставщика, а общие библиотеки VNDK изолируются от пространства имен компоновщика по умолчанию.
  • Замените PRODUCT_FULL_TREBLE на более конкретный PRODUCT_TREBLE_LINKER_NAMESPACES .
  • Android 9 меняет имена следующих файлов конфигурации динамического компоновщика.
    Андроид 8.х Андроид 9 Описание
    ld.config.txt.in ld.config.txt Для устройств с изоляцией пространства имен компоновщика во время выполнения
    ld.config.txt ld.config.vndk_lite.txt Для устройств с изоляцией пространства имен компоновщика VNDK-SP.
    ld.config.legacy.txt ld.config.legacy.txt Для устаревших устройств под управлением Android 7.x или более ранней версии.
  • Удалите android.hardware.graphics.allocator@2.0.so .
  • Добавлены разделы product и odm .
,

Динамический компоновщик решает две проблемы при разработке Treble VNDK:

  • Общие библиотеки SP-HAL и их зависимости, включая библиотеки VNDK-SP, загружаются в процессы платформы. Должны быть какие-то механизмы для предотвращения конфликтов символов.
  • dlopen() и android_dlopen_ext() могут вводить некоторые зависимости времени выполнения, которые не видны во время сборки и их сложно обнаружить с помощью статического анализа.

Эти две проблемы могут быть решены с помощью механизма пространства имен компоновщика . Этот механизм обеспечивается динамическим компоновщиком. Он может изолировать общие библиотеки в разных пространствах имен компоновщика, чтобы библиотеки с одинаковым именем, но с разными символами не конфликтовали.

С другой стороны, механизм пространства имен компоновщика обеспечивает гибкость, позволяющую экспортировать некоторые общие библиотеки из пространства имен компоновщика и использовать их в другом пространстве имен компоновщика. Эти экспортированные общие библиотеки могут стать интерфейсами прикладного программирования, общедоступными для других программ, при этом детали их реализации скрываются в пространствах имен компоновщика.

Например, /system/lib[64]/libcutils.so и /system/lib[64]/vndk-sp-${VER}/libcutils.so — это две общие библиотеки. Эти две библиотеки могут иметь разные символы. Они загружаются в разные пространства имен компоновщика, поэтому модули платформы могут зависеть от /system/lib[64]/libcutils.so , а общие библиотеки SP-HAL могут зависеть от /system/lib[64]/vndk-sp-${VER}/libcutils.so .

С другой стороны, /system/lib[64]/libc.so — это пример общедоступной библиотеки, которая экспортируется пространством имен компоновщика и импортируется во многие пространства имен компоновщика. Зависимости /system/lib[64]/libc.so , такие как libnetd_client.so , загружаются в пространство имен, в котором находится /system/lib[64]/libc.so . Другие пространства имен не будут иметь доступа к этим зависимостям. Этот механизм инкапсулирует детали реализации, обеспечивая при этом общедоступные интерфейсы.

Как это работает

Динамический компоновщик отвечает за загрузку общих библиотек, указанных в записях DT_NEEDED , или общих библиотек, указанных аргументом dlopen() или android_dlopen_ext() . В обоих случаях динамический компоновщик находит пространство имен компоновщика, в котором находится вызывающая сторона, и пытается загрузить зависимости в то же пространство имен компоновщика. Если динамический компоновщик не может загрузить общую библиотеку в указанное пространство имен компоновщика, он запрашивает у связанного пространства имен компоновщика экспортированные общие библиотеки.

Формат файла конфигурации

Формат файла конфигурации основан на формате файла INI. Типичный файл конфигурации выглядит так:

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

Файл конфигурации включает в себя:

  • Несколько свойств сопоставления разделов каталога в начале, позволяющие динамическому компоновщику выбрать эффективный раздел.
  • Несколько разделов конфигурации пространств имен компоновщика:
    • Каждый раздел содержит несколько пространств имен (вершины графа) и несколько резервных связей между пространствами имен (дуги графа).
    • Каждое пространство имен имеет свою собственную изоляцию, пути поиска, разрешенные пути и настройки видимости.

В таблицах ниже подробно описано значение каждого свойства.

Свойство сопоставления разделов каталога

Свойство Описание Пример

dir. name

Путь к каталогу, к которому относится раздел [ name ] .

Каждое свойство сопоставляет исполняемые файлы в каталоге с разделом конфигурации пространств имен компоновщика. Могут существовать два (или более) свойства с одинаковым name , но указывающие на разные каталоги.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Это указывает на то, что конфигурация, указанная в разделе [system] применяется к исполняемым файлам, загружаемым из /system/bin или /system/xbin .

Конфигурация, указанная в разделе [vendor] применяется к исполняемым файлам, загружаемым из /vendor/bin .

Свойства отношения

Свойство Описание Пример
additional. namespaces

Разделенный запятыми список дополнительных пространств имен (помимо пространства имен default ) для раздела.

additional. namespaces = sphal, vndk

Это указывает на то, что в конфигурации [system] есть три пространства имен ( default , sphal и vndk ).

namespace. name . links

Список резервных пространств имен, разделенный запятыми.

Если общая библиотека не может быть найдена в текущем пространстве имен, динамический компоновщик пытается загрузить общую библиотеку из резервных пространств имен. Пространство имен, указанное в начале списка, имеет более высокий приоритет.

namespace. sphal. links = default, vndk

Если общая библиотека или исполняемый файл запрашивает общую библиотеку, которую невозможно загрузить в пространство имен sphal , динамический компоновщик пытается загрузить общую библиотеку из пространства имен default .

А затем, если общую библиотеку также невозможно загрузить из пространства имен default , динамический компоновщик пытается загрузить общую библиотеку из пространства имен vndk .

Наконец, если все попытки завершаются неудачей, динамический компоновщик возвращает ошибку.

namespace. name . link. other . shared_libs

Список общих библиотек, разделенных двоеточиями, которые можно искать в other пространствах имен, если эти библиотеки не найдены в пространстве name .

Это свойство нельзя использовать с namespace. name . link. other . allow_all_shared_libs .

namespace. sphal. link. default. shared_libs = libc.so: libm.so

Это означает, что резервная ссылка принимает в качестве запрошенного имени библиотеки только libc.so или libm.so Динамический компоновщик игнорирует резервную ссылку из sphal в пространство имен default если имя запрошенной библиотеки не libc.so или libm.so .

namespace. name . link. other . allow_all_shared_libs

Логическое значение, указывающее, можно ли искать все общие библиотеки в other пространстве имен, если эти библиотеки не могут быть найдены в пространстве name .

Это свойство нельзя использовать с namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

Это указывает на то, что все имена библиотек могут проходить через резервную ссылку из vndk в пространство имен sphal .

Свойства пространства имен

Свойство Описание Пример
namespace. name . isolated

Логическое значение, указывающее, должен ли динамический компоновщик проверять, где находится общая библиотека.

Если isolated задано значение true , можно загружать только те общие библиотеки, которые находятся в одном из каталогов search.paths (исключая подкаталоги) или в одном из каталогов permitted.paths (включая подкаталоги).

Если isolated установлено значение false (по умолчанию), динамический компоновщик не проверяет путь к общим библиотекам.

namespace. sphal. isolated = true

Это означает, что в пространство имен sphal можно загрузить только общие библиотеки из search.paths или из permitted.paths .

namespace. name . search.paths

Список каталогов, разделенных двоеточиями, для поиска общих библиотек.

Каталоги, указанные в search.paths добавляются к имени запрошенной библиотеки, если вызовы функций dlopen() или записи DT_NEEDED не указывают полный путь. Каталог, указанный в начале списка, имеет более высокий приоритет.

Если isolated установлено значение true , общие библиотеки, находящиеся в одном из каталогов search.paths (за исключением подкаталогов), могут быть загружены независимо от свойства permitted.paths .

Например, если search.paths — это /system/${LIB} , а permitted.paths пусто, /system/${LIB}/libc.so можно загрузить, но /system/${LIB}/vndk/libutils.so загрузить нельзя.

namespace. default. search.paths = /system/${LIB}

Это означает, что динамический компоновщик ищет в /system/${LIB} общие библиотеки.

namespace. name . asan.search.paths

Список каталогов, разделенных двоеточиями, для поиска общих библиотек, когда включен AddressSanitizer (ASan) .

namespace. name . search.paths игнорируется, когда ASan включен.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

Это означает, что когда ASan включен, динамический компоновщик сначала ищет /data/asan/system/${LIB} , а затем ищет /system/${LIB} .

namespace. name . permitted.paths

Список каталогов (включая подкаталоги), разделенных двоеточиями, в которые динамический компоновщик может загружать общие библиотеки (в дополнение к search.paths ), если isolated , имеет значение true .

Также можно загрузить общие библиотеки, находящиеся в подкаталогах permitted.paths . Например, если permitted.paths равен /system/${LIB} , можно загрузить как /system/${LIB}/libc.so , так и /system/${LIB}/vndk/libutils.so .

Если isolated установлено значение false , permitted.paths игнорируются и выдается предупреждение.

namespace. default. permitted.paths = /system/${LIB}/hw

Это означает, что общие библиотеки в /system/${LIB}/hw могут быть загружены в изолированное пространство имен default .

Например, без permitted.paths libaudiohal.so не сможет загрузить /system/${LIB}/hw/audio.a2dp.default.so в пространство имен default .

namespace. name . asan.permitted.paths

Список каталогов, разделенных двоеточиями, в которые динамический компоновщик может загружать общие библиотеки при включенном ASan .

namespace. name . permitted.paths игнорируется, когда ASan включен.

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

Это означает, что когда ASan включен, общие библиотеки в /data/asan/system/${LIB}/hw или /system/${LIB}/hw могут быть загружены в изолированное пространство имен default .

namespace. name . visible

Логическое значение, указывающее, может ли программа (кроме libc ) получить дескриптор пространства имен компоновщика с помощью android_get_exported_namespace() и открыть общую библиотеку в пространстве имен компоновщика, передав дескриптор в android_dlopen_ext() .

Если visible имеет true , android_get_exported_namespace() всегда возвращает дескриптор, если пространство имен существует.

Если visible имеет значение false (по умолчанию), android_get_exported_namespace() всегда возвращает NULL независимо от наличия пространства имен. Общие библиотеки могут быть загружены в это пространство имен только в том случае, если (1) они запрошены другим пространством имен компоновщика, имеющим резервную ссылку на это пространство имен, или (2) они запрошены другими общими библиотеками или исполняемыми файлами в этом пространстве имен.

namespace. sphal. visible = true

Это указывает на то, что android_get_exported_namespace("sphal") может возвращать действительный дескриптор пространства имен компоновщика.

Создание пространства имен компоновщика

В Android 11 конфигурация компоновщика создается во время выполнения в /linkerconfig вместо использования простых текстовых файлов в ${android-src}/system/core/rootdir/etc . Конфигурация генерируется во время загрузки на основе среды выполнения и включает в себя следующие элементы:

  • Если устройство поддерживает VNDK
  • Целевая версия VNDK раздела поставщика
  • Версия VNDK раздела продукта
  • Установленные модули APEX

Конфигурация компоновщика создается путем разрешения зависимостей между пространствами имен компоновщика. Например, если в модулях APEX имеются какие-либо обновления, включающие обновления зависимостей, конфигурация компоновщика создается с учетом этих изменений. Более подробную информацию о создании конфигурации компоновщика можно найти в ${android-src}/system/linkerconfig .

Изоляция пространства имен компоновщика

Существует три типа конфигурации. В зависимости от значения PRODUCT_TREBLE_LINKER_NAMESPACES и BOARD_VNDK_VERSION в BoardConfig.mk соответствующая конфигурация генерируется во время загрузки.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Выбранная конфигурация Требование СДС
true current VNDK Обязательно для устройств с Android 9 или более поздней версии.
Пустой VNDK Lite Обязательно для устройств с Android 8.x.
false Пустой Legacy Для устройств без высоких частот

Конфигурация VNDK Lite изолирует общие библиотеки SP-HAL и VNDK-SP. В Android 8.0 это должен быть файл конфигурации для динамического компоновщика, если PRODUCT_TREBLE_LINKER_NAMESPACES имеет true .

Конфигурация VNDK также изолирует общие библиотеки SP-HAL и VNDK-SP. Кроме того, эта конфигурация обеспечивает полную динамическую изоляцию компоновщика. Это гарантирует, что модули в системном разделе не будут зависеть от общих библиотек в разделах поставщика и наоборот.

В Android 8.1 или более поздней версии конфигурация VNDK является конфигурацией по умолчанию, и настоятельно рекомендуется включить полную динамическую изоляцию компоновщика, задав для BOARD_VNDK_VERSION значение current .

Конфигурация ВНДК

Конфигурация VNDK изолирует зависимости общей библиотеки между системным разделом и разделами поставщика. По сравнению с конфигурациями, упомянутыми в предыдущем подразделе, различия заключаются в следующем:

  • Рамочные процессы

    • создаются пространства имен default , vndk , sphal и rs .
    • Все пространства имен изолированы.
    • Общие системные библиотеки загружаются в пространство имен default .
    • SP-HAL загружаются в пространство имен sphal .
    • Общие библиотеки VNDK-SP загружены в пространство имен vndk .
  • Процессы поставщиков

    • создаются пространства имен default , vndk и system .
    • Пространство имен default изолировано.
    • Общие библиотеки поставщика загружаются в пространство имен default .
    • Общие библиотеки VNDK и VNDK-SP загружаются в пространство имен vndk .
    • LL-NDK и его зависимости загружаются в пространство имен system .

Взаимосвязь между пространствами имен компоновщика показана ниже.

Граф пространства имен компоновщика, описанный в конфигурации VNDK.

Рисунок 1. Изоляция пространства имен компоновщика (конфигурация VNDK).

На изображении выше LL-NDK и VNDK-SP обозначают следующие общие библиотеки:

  • ЛЛ-НДК
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • ВНДК-СП
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

Более подробную информацию можно найти в файле /linkerconfig/ld.config.txt устройства.

Конфигурация ВНДК Lite

Начиная с Android 8.0, динамический компоновщик настроен на изоляцию общих библиотек SP-HAL и VNDK-SP, чтобы их символы не конфликтовали с другими общими библиотеками платформы. Взаимосвязь между пространствами имен компоновщика показана ниже.

Граф пространства имен компоновщика, описанный в конфигурации VNDK Lite.
Рисунок 2. Изоляция пространства имен компоновщика (конфигурация VNDK Lite)

LL-NDK и VNDK-SP обозначают следующие общие библиотеки:

  • ЛЛ-НДК
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (нет в конфигурации)
    • libsync.so
    • libvndksupport.so
    • libz.so (в конфигурации перенесен в VNDK-SP )
  • ВНДК-СП
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

В таблице ниже перечислены конфигурации пространств имен для процессов платформы, взятые из раздела [system] конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs ЛЛ-НДК
link.vndk.shared_libs ВНДК-СП
link.rs.shared_libs libRS_internal.so
vndk (для ВНДК-СП) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs ЛЛ-НДК
rs (для RenderScript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data (для скомпилированного ядра RS)
isolated true
visible true
links default,vndk
link.default.shared_libs ЛЛ-НДК
libmediandk.so
libft2.so
link.vndk.shared_libs ВНДК-СП

В таблице ниже представлена ​​конфигурация пространств имен для процессов поставщика, взятая из раздела [vendor] в конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (устарело)
/product/${LIB} (устарело)
isolated false

Более подробную информацию можно найти в файле /linkerconfig/ld.config.txt устройства.

История документа

Изменения Android 11

  • В Android 11 статические файлы ld.config.*.txt удаляются из базы кода, и вместо этого LinkerConfig генерирует их во время выполнения.

Изменения в Android 9

  • В Android 9 пространство имен компоновщика vndk добавляется к процессам поставщика, а общие библиотеки VNDK изолируются от пространства имен компоновщика по умолчанию.
  • Замените PRODUCT_FULL_TREBLE на более конкретный PRODUCT_TREBLE_LINKER_NAMESPACES .
  • Android 9 меняет имена следующих файлов конфигурации динамического компоновщика.
    Андроид 8.х Андроид 9 Описание
    ld.config.txt.in ld.config.txt Для устройств с изоляцией пространства имен компоновщика во время выполнения
    ld.config.txt ld.config.vndk_lite.txt Для устройств с изоляцией пространства имен компоновщика VNDK-SP.
    ld.config.legacy.txt ld.config.legacy.txt Для устаревших устройств под управлением Android 7.x или более ранней версии.
  • Удалите android.hardware.graphics.allocator@2.0.so .
  • Добавлены разделы product и odm .
,

Динамический компоновщик решает две проблемы при разработке Treble VNDK:

  • Общие библиотеки SP-HAL и их зависимости, включая библиотеки VNDK-SP, загружаются в процессы платформы. Должны быть какие-то механизмы для предотвращения конфликтов символов.
  • dlopen() и android_dlopen_ext() могут вводить некоторые зависимости времени выполнения, которые не видны во время сборки и их сложно обнаружить с помощью статического анализа.

Эти две проблемы могут быть решены с помощью механизма пространства имен компоновщика . Этот механизм обеспечивается динамическим компоновщиком. Он может изолировать общие библиотеки в разных пространствах имен компоновщика, чтобы библиотеки с одинаковым именем, но с разными символами не конфликтовали.

С другой стороны, механизм пространства имен компоновщика обеспечивает гибкость, позволяющую экспортировать некоторые общие библиотеки из пространства имен компоновщика и использовать их в другом пространстве имен компоновщика. Эти экспортируемые общие библиотеки могут стать интерфейсами прикладного программирования, которые являются общедоступными для других программ, скрывая детали их реализации в их пространствах имен линкеров.

Например, /system/lib[64]/libcutils.so и /system/lib[64]/vndk-sp-${VER}/libcutils.so /LIB= 64^/VNDK-P-$ Эти две библиотеки могут иметь разные символы. Они загружены в разные пространства имен линкеров, так что фреймворные модули могут зависеть от общих библиотеков /system/lib[64]/libcutils.so и sp-hal-hal могут зависеть от /system/lib[64]/vndk-sp-${VER}/libcutils.so 64^/vndk-p-$

С другой стороны, /system/lib[64]/libc.so является примером публичной библиотеки, которая экспортируется пространством имен линкера и импортируется во многие пространства имен линкеров. Зависимости /system/lib[64]/libc.so , такие как libnetd_client.so , загружаются в пространство имен, в котором находится /system/lib[64]/libc.so . Другие пространства имен не будут иметь доступ к этим зависимостям. Этот механизм инкапсулирует детали реализации при предоставлении общественных интерфейсов.

Как это работает

Динамический линкер несет ответственность за загрузку общих библиотек, указанных в записях DT_NEEDED или общих библиотек, указанных в аргументе dlopen() или android_dlopen_ext() . В обоих случаях динамический линкер находит пространство имен линкеров, где проживает вызывающий абонент, и пытается загрузить зависимости в одно и то же пространство имен линкеров. Если динамический лингер не может загрузить общую библиотеку в указанное пространство имен линкеров, он просит пространство имен ссылок на экспортируемые общие библиотеки.

Формат файла конфигурации

Формат файла конфигурации основан на формате файла INI. Типичный файл конфигурации выглядит следующим образом:

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

Файл конфигурации включает в себя:

  • Несколько свойств отображения каталогов в начале для динамического линкера, чтобы выбрать эффективный раздел.
  • Несколько разделов конфигурации имен линкеров:
    • Каждый раздел содержит несколько пространств имен (графические вершины) и несколько запасных ссылок между пространствами имен (графические дуги).
    • Каждое пространство имен имеет свою собственную изоляцию, пути поиска, разрешенные пути и настройки видимости.

Таблицы ниже описывают значение каждого свойства подробно.

Свойство картирования каталогов

Свойство Описание Пример

dir. name

Путь к каталогу, к которому применяется раздел [ name ] .

Каждое свойство отображает исполняемые файлы в разделе конфигурации имен линкера. Там может быть два (или более) свойства, которые имеют одинаковое name , но указывают на разные каталоги.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Это указывает на то, что конфигурация, указанная в разделе [system] применяется к исполняемым файлам, которые загружаются из /system/bin или /system/xbin .

Конфигурация, указанная в разделе [vendor] применяется к исполняемым файлам, которые загружаются из /vendor/bin .

Свойства отношения

Свойство Описание Пример
additional. namespaces

Разделенный запятой список дополнительных пространств имен (в дополнение к пространству имен default ) для раздела.

additional. namespaces = sphal, vndk

Это указывает на то, что в конфигурации [system] есть три пространства имен ( default , sphal и vndk ).

namespace. name . links

Разделенный запятой список запасных пространств имен.

Если общая библиотека не может быть найдена в текущем пространстве имен, динамический линкетер пытается загрузить общую библиотеку из пространства имен отступления. Пространство имен, указанное в начале списка, имеет более высокий приоритет.

namespace. sphal. links = default, vndk

Если общая библиотека или исполняемая запрашивается общая библиотека, которую нельзя загрузить в пространство имен sphal , динамический линкетер пытается загрузить общую библиотеку из пространства имен default .

И затем, если общая библиотека также не может быть загружена из пространства имен default , динамический линкер пытается загрузить общую библиотеку из пространства имен vndk .

Наконец, если все попытки сбой, динамический линкетер возвращает ошибку.

namespace. name . link. other . shared_libs

Список общих библиотек, разделяемый толстой кишкой, который можно искать в other пространствах имен, когда эти библиотеки не могут быть найдены в пространстве имен name .

Это свойство не может быть использовано с namespace. name . link. other . allow_all_shared_libs .

namespace. sphal. link. default. shared_libs = libc.so: libm.so

Это указывает на то, что запасная ссылка принимает только libc.so или libm.so в качестве запрошенного названия библиотеки. Динамический лингер игнорирует отступление от sphal на пространство имен default , если запрашиваемое название библиотеки не libc.so или libm.so

namespace. name . link. other . allow_all_shared_libs

Логическое значение, которое указывает, можно ли найти все общие библиотеки в other пространстве имен, когда эти библиотеки не могут быть найдены в пространстве имен name .

Это свойство не может быть использовано с namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

Это указывает на то, что все имена библиотеки могут пройти через запасную ссылку от vndk до пространства имен sphal .

Свойства пространства имен

Свойство Описание Пример
namespace. name . isolated

Логическое значение, которое указывает, должен ли динамический линкер проверить, где находится общая библиотека.

Если isolated являются true , то только общие библиотеки, которые находятся в одном из каталогов search.paths (за исключением подкаталогов) или находятся под одним из permitted.paths каталогов (включая подкаталоги).

Если isolated false (по умолчанию), динамический линкер не проверяет путь общих библиотек.

namespace. sphal. isolated = true

Это указывает на то, что только общие библиотеки в search.paths или по permitted.paths Путы могут быть загружены в пространство имен sphal .

namespace. name . search.paths

Список каталогов, разделенный толстой кишкой для поиска общих библиотек.

Каталоги, указанные в search.paths приготовляются к запрошенному имени библиотеки, если функции вызовы dlopen() или DT_NEEDED , не указывают полный путь. Каталог, указанный в начале списка, имеет более высокий приоритет.

Когда isolated , true , общие библиотеки, которые находятся в одном из каталогов search.paths Путы (за исключением подкаталогов) могут быть загружены независимо от permitted.paths свойства.

Например, если search.paths is /system/${LIB} /system/${LIB}/vndk/libutils.so /system/${LIB}/libc.so permitted.paths

namespace. default. search.paths = /system/${LIB}

Это указывает на то, что динамический линкер Searches /system/${LIB} для общих библиотек.

namespace. name . asan.search.paths

Список каталогов, разделяемый толстой кишкой для поиска общих библиотек, когда включен адресанитизатор (ASAN) .

namespace. name . search.paths игнорируется, когда Asan включен.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

Это указывает на то, что когда ASAN включен, сначала динамический поиск линкера /data/asan/system/${LIB} , а затем ищет /system/${LIB} .

namespace. name . permitted.paths

Расположенный в толстой кишке список каталогов (включая подкаталоги), где динамический линкер может загружать общие библиотеки (в дополнение к search.paths ), когда isolated является true .

Общие библиотеки, которые находятся в подназок permitted.paths Платы также могут быть загружены. /system/${LIB}/vndk/libutils.so /system/${LIB} /system/${LIB}/libc.so permitted.paths

Если isolated false , permitted.paths . Путы игнорируются, а предупреждение испускается.

namespace. default. permitted.paths = /system/${LIB}/hw

Это указывает на то, что общие библиотеки под /system/${LIB}/hw могут быть загружены в изолированное пространство имен default .

Например, без permitted.paths Paths, libaudiohal.so не может загрузить /system/${LIB}/hw/audio.a2dp.default.so default /,

namespace. name . asan.permitted.paths

Распыленный толстой кишкой список каталогов, в котором динамический линкер может загружать общие библиотеки, когда ASAN включен.

namespace. name . permitted.paths игнорируются, когда асан включен.

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

Это указывает на то, что когда ASAN включен общие библиотеки в соответствии с /data/asan/system/${LIB}/hw или /system/${LIB}/hw может быть загружен в изолированное пространство имен default .

namespace. name . visible

Логическое значение, которое указывает, может ли программа (кроме libc ) получить рукоятку пространства имен линкеров с помощью android_get_exported_namespace() и открыть общую библиотеку в пространстве имен линкеров, передавая ручку android_dlopen_ext() .

Если visible true , android_get_exported_namespace() всегда возвращает ручку, если пространство имен существует.

Если visible false (по умолчанию), android_get_exported_namespace() всегда возвращает NULL независимо от наличия пространства имен. Общие библиотеки могут быть загружены в это пространство имен только в том случае, если (1) их запрашивают другое пространство имен линкеров, которое имеет отступную ссылку на это пространство имен, или (2) их запрошены другие общие библиотеки или исполняемые файлы в этом пространстве имен.

namespace. sphal. visible = true

Это указывает на то, что android_get_exported_namespace("sphal") может вернуть действительный рукояток имен линкеров.

Лингер -пространство пространства пространства

В Android 11 конфигурация линкера создается во время выполнения под /linkerconfig вместо использования простых текстовых файлов в ${android-src}/system/core/rootdir/etc . Д. Конфигурация генерируется во время загрузки на основе среды выполнения, которая включает в себя следующие элементы:

  • Если устройство поддерживает VNDK
  • Целевая версия VNDK раздела поставщика
  • Версия VNDK Product Partition
  • Установленные модули Apex

Конфигурация линкера создается путем разрешения зависимостей между пространствами имен линкера. Например, если есть какие -либо обновления на модулях APEX, которые включают обновления зависимостей, конфигурация линкера генерируется отражает эти изменения. Более подробную информацию для создания конфигурации линкера можно найти в ${android-src}/system/linkerconfig .

Изоляция пространства имен линкеров

Есть три типа конфигурации. В зависимости от значения PRODUCT_TREBLE_LINKER_NAMESPACES и BOARD_VNDK_VERSION в BoardConfig.mk , соответствующая конфигурация генерируется во время загрузки.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Выбранная конфигурация Требование VTS
true current VNDK Обязательный для устройств, запущенных с Android 9 или выше
Пустой VNDK Lite Обязательно для устройств, запущенных с Android 8.x
false Пустой Legacy Для нерабельных устройств

Vndk Lite Configuration изоляты SP-HAL и VNDK-SP Shared Bibraries. В Android 8.0 это должен быть файл конфигурации для динамического линкера true когда PRODUCT_TREBLE_LINKER_NAMESPACES .

Конфигурация VNDK также изолирует общие библиотеки SP-HAL и VNDK-SP. Кроме того, эта конфигурация обеспечивает полную динамическую изоляцию линкера. Это гарантирует, что модули в системном разделе не будут зависеть от общих библиотек в разделах поставщиков и наоборот.

В Android 8.1 или выше конфигурация VNDK является конфигурацией по умолчанию, и настоятельно рекомендуется включить полную динамическую изоляцию линкера путем установки BOARD_VNDK_VERSION для current .

Конфигурация VNDK

Конфигурация VNDK изолирует зависимости общей библиотеки между системным разделом и разделами поставщиков. По сравнению с конфигурациями, упомянутыми в предыдущем подразделе, различия описаны следующим образом:

  • Структуры процессов

    • Созданы пространства имен default , vndk , sphal и rs .
    • Все пространства имен изолированы.
    • Системные общие библиотеки загружаются в пространство имен default .
    • SP-докладчики загружаются в пространство имен sphal .
    • VNDK-SP совместные библиотеки загружены в пространство имен vndk .
  • Процессы продавца

    • Созданы пространства имен vndk и имен system default .
    • Пространство имен default изолировано.
    • Общие библиотеки поставщика загружаются в пространство имен default .
    • Общие библиотеки VNDK и VNDK-SP загружаются в пространство имен vndk .
    • LL-NDK и его зависимости загружаются в пространство имен system .

Связь между пространством имен линкеров показана ниже.

График пространства имен линкеров, описанный в конфигурации VNDK

Рисунок 1. Изоляция пространства имен линкеров (конфигурация VNDK).

На изображении выше, LL-NDK и VNDK-SP СООТВЕТСТВЕННОСТЬ для следующих общих библиотек:

  • Ll-ndk
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • Vndk-Sp
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

Вы можете найти более подробную информацию в /linkerconfig/ld.config.txt с устройства.

Vndk Lite Configuration

По состоянию на Android 8.0, динамический линкер настроен на изоляцию общих библиотек SP-HAL и VNDK-SP, так что их символы не противоречат другим библиотекам обмена. Связь между пространством имен линкера показана ниже.

График пространства имен линкера, описанный в конфигурации VNDK Lite
Рисунок 2. Выделение пространства имен линкеров (конфигурация VNDK Lite)

LL-NDK и VNDK-SP СТАДАЕТ Следующие общие библиотеки:

  • Ll-ndk
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (не в конфигурации)
    • libsync.so
    • libvndksupport.so
    • libz.so (перемещен в VNDK-SP в конфигурации)
  • Vndk-Sp
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

В таблице ниже перечислены конфигурация пространств имен для фреймворных процессов, которая выхищена в разделе [system] в конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs Ll-ndk
link.vndk.shared_libs Vndk-Sp
link.rs.shared_libs libRS_internal.so
vndk (для vndk-sp) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs Ll-ndk
rs (для рендеров) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
/data (для скомпилированного ядра RS)
isolated true
visible true
links default,vndk
link.default.shared_libs Ll-ndk
libmediandk.so
libft2.so
link.vndk.shared_libs Vndk-Sp

В приведенной ниже таблице представлена ​​конфигурация пространств имен для процессов поставщиков, которая выходит из раздела [vendor] в конфигурации VNDK Lite.

Пространство имен Свойство Ценить
default search.paths /odm/${LIB}
/odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (устарело)
/product/${LIB} (устарел)
isolated false

Более подробную информацию можно найти в /linkerconfig/ld.config.txt с устройства.

История документов

Android 11 изменяется

  • В Android 11 статический ld.config.*.txt удаляются из CodeBase, а LinkerConfig вместо этого генерирует их во время выполнения.

Android 9 изменяется

  • В Android 9 пространство имен линкеров vndk добавляется в процессы поставщиков, а общие библиотеки VNDK изолированы из пространства имен линкеров по умолчанию.
  • Замените PRODUCT_FULL_TREBLE на более конкретный PRODUCT_TREBLE_LINKER_NAMESPACES .
  • Android 9 изменяет имена следующих файлов конфигурации динамического линкера.
    Android 8.x Android 9 Описание
    ld.config.txt.in ld.config.txt Для устройств с изоляцией пространства имен линкера среды.
    ld.config.txt ld.config.vndk_lite.txt Для устройств с изоляцией пространства имен линкеров VNDK-SP.
    ld.config.legacy.txt ld.config.legacy.txt Для устаревших устройств под управлением Android 7.x или ниже
  • Удалите android.hardware.graphics.allocator@2.0.so .
  • Перегородки product и odm добавляются.