Android:供应商原生开发套件(VNDK)

更新时间:2023-05-07 21:47:26 阅读: 评论:0

Android:供应商原⽣开发套件(VNDK)
⼀、VNDK概述
  VNDK(Vendor Native Development Kit)是⼀组专门⽤于vendor实现其HAL的lib库,因为⾃Android 8.0以来,Google引⼊了Treble架构,希望对vendor和system分区进⾏解耦处理,期待实现:framwork进程不加载vendor共享库,vendor进程仅加载vendor共享库(和部分framework共享库),⽽framework进程和vendor进程之间通过HIDL和hwbinder来通信。总结为如下⼏点:
platform和Vendor的构建是相互隔离的;
platform lib对应 system.img;
vendor lib对应 vendor.img;
⼤多数情况下,Vendor lib跟系统核⼼不能相互使⽤;Vendor lib不允许dlopen私有的系统库;
合作伙伴不允许为⾃⼰的产品在VNDK新增lib,只能贡献到AOSP;
  这⼀切都是为系统库与Vendor库之间的解耦合,在Android P上采⽤该⽅案,则下⼀个⼤版本Android Q更新,可以直接将新的System Q加上⽼Vendor P,组成新版本Android。
  其中VNDK + Framework libs组成system.img, Vendor libs组成vendor.img。
  Android P新添加命名空间namespace:
System命名空间/system/lib/;
Vendor命名空间有/system/lib/vndk,/system/lib/vndk-sp,/vendor/lib/vndk,/vendor/lib/vndk-sp
⼆、framework和vendor之间库的区分
 2.1 vendor进程可访问的部分framework共享库
  根据特性及使⽤⽅法的差异,可将framework共享库⼤致分为三类:
  (1)已知API/ABI稳定的framework共享库 - 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。
    对于这些库,在Android.bp都包含llndk_library模块的定义,该定义指定了模块名称和符号⽂件:
llndk_library {
name: "libvndksupport",
symbol_file: "",
}
    编译系统会根据符号⽂件为vendor模块⽣成stub共享库,需满⾜条件:未在以_PRIVATE或_PLATFORM结尾的部分中定义,不含#platform-only标记,并且不含
#introduce*标记或者该标记与⽬标匹配。
#
LIBVNDKSUPPORT {
global:
android_load_sphal_library; # vndk
android_unload_sphal_library; # vndk
 local:
*;
};
  (2)可以安全复制两次的framework共享库 - Eligible-VNDK,需要满⾜以下⼏个条件:
a.不与framework之间进⾏IPC通信。
b.与ART虚拟机⽆关。
c.不读写⽂件格式不稳定的⽂件或分区。
d.没有特殊的软件许可。
  (3)除上述两种以外的framework共享库 - FWK-Only,通常具有以下⼏个特点:
a.被视为framework内部实现。
b.不得由vendor访问。
c.不稳定的ABI/API。
d.不会被复制。
 2.2 SP-HAL(Same-Pocess HAL)
SP-HAL是⼀组预先确定的HAL,被加载到framework进程中的vendor共享库。它由链接器命名空间进⾏隔离,必须仅依赖于LL-NDK和VNDK-SP(部分预定义的Eligible-VNDK 库)。⽆论是SP-HAL还是VNDK-SP都是由Google来定义的。
SP-HAL有:libGLESv1_CM_${driver}.so、libGLESv2_${driver}.so、libGLESv3_${driver}.so、libEGL_${driver}.so、vulkan.${driver}.so、derscript@1.0-impl.so、aphics.mapper@2.0-impl.so。
SP-HAL可以访问的VNDK-SP有:@1.0.so、aphics.mapper@2.0.so、derscript@1.0.so (Renderscript)、libRS_internal.so (Renderscript)、libba.so、libc++.so、libcutils.so、libhardware.so、libhidlba.so、libhidltransport.so、libhwbinder.so、libion.so、libutils.so、libz.so。
SP-HAL不可见的VNDK-SP有:libRSCpuRef.so (RS)、libRSDriver.so (RS)、libbacktrace.so、libblas.so (RS)、libbcinfo.so (RS)、liblzma.so、libunwind.so。
包含渲染脚本(Rendor script)的FWK-ONLY库:libft2.so、libmediandk.so。
 2.3 VNDK安全策略
  framework进程对应于policy中的coremain,⽽vendor进程对应于non-coredomain。现将共享库权限整理如下:
类别 coredomain访问⾮coredomain访问分区位置
LL-NDK Y Y system/lib[64]
LL-NDK-Private Y Y system/lib[64]
VNDK-SP/VNDK-SP-Private Y Y system/lib[64]
VNDK-SP-Ext Y Y vendor/lib[64]/vndk-sp
VNDK Y Y system/lib[64]
VNDK-Ext N Y vendor/lib[64]
FWK-ONLY Y N system/lib[64]
FWK-ONLY-RS Y N system/lib[64]
SP-HAL Y Y vendor/lib[64]或vendor/lib[64]/hw
SP-HAL-Dep Y Y vendor/lib[64]vendor/lib[64]/hw
VND-ONLY N Y vendor/lib[64]
类别 coredomain访问⾮coredomain访问分区位置
  为了确保vendor分区中VNDK-SP-Ext、SP-HAL、SP-HAL-Dep库既可以从coredomain访问,也可以从⾮coredomain访问,需要⽤same_process_hal_file标签来标记,如file_contexts中所定义:
/vendor/lib(64)?/hw/libMySpHal\.so        u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/vndk-sp/libBa\.so      u:object_r:same_process_hal_file:s0
/vendor/lib(64)?/libBaInternal\.so      u:object_r:same_process_hal_file:s0
三、VNDK编译
 3.1 VNDK使能
  针对Android 9.0新设备,会强制ro.vndk.version属性⾮空。该值⽤于说明VNDK共享库版本号,存在/vendor/default.prop中。若在makefile中定义的
BOARD_VNDK_VERSION不等于current,则将BOARD_VNDK_VERSION定义的值赋给ro.vndk.version。若不相等,则需要先看makefile中
PLATFORM_VERSION_CODENAME是否为REL,如果是则采⽤PLATFORM_SDK_VERSION的值,否则使⽤PLATFORM_VERSION_CODENAME对应的内容。
  若想从Android 8.0之前版本通过OTA升级⾄Android 9.0,需要在BoardConfig.mk中加⼊以下内容:
PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := fal
  若想从禁⽤了VNDK运⾏时增强功能的Android 8.0以后版本通过OTA升级⾄Android 9.0,需将PRODUCT_USE_VNDK_OVERRIDE := fal添加⾄BoardConfig.mk中,在编译时ro.vndk.lite属性会被设为tru,并会⾃动添加被添加到/vendor/default.prop⽂件中。动态链接器将加载/system/fig.中的链接器命名空间配置,以隔离SP-HAL和VNDK。
  对于first_pai_product属性⼤于27的版本,不能定义ro.vndk.lite属性,⽐如Android 9.0的VTS测试结果中将会出现VtsTreblePlatformVersionTest Fail项。
  VNDK共享库将安装到/system/lib[64]/vndk-${ro.vndk.version}中。
  VNDK-SP共享库将安装到/system/lib[64]/vndk-sp-${ro.vndk.version}中。
  动态链接器配置⽂件将安装到/system/fig.${ro.vndk.version}.txt中。
 3.2 VNDK编译配置
  编译系统包含多种类型的对象,其中包括库(共享、静态或标头)和⼆进制⽂件:
  core:位于system.img中,由system使⽤。vendor、vendor_available、vndk或vndk-sp库不能使⽤此类库。
cc_binary {
name: "libexample",
...
}
  vendor-only(proprietary):位于vendor.img中,由vendor使⽤。
cc_binary {
name: "libexample",
proprietary: true,
...
}
  vendor_available:位于vendor.img中,由vendor使⽤(可能包含core的重复项)。
cc_binary {
name: "libexample",
vendor_available: true,
.
..
}
  vndk:位于system.img中,由vendor使⽤(vendor_available的⼦集)。
cc_binary {
name: "libexample",
vendor_available: true,
vndk: {
enabled: true,
}
...
}
  vndk-sp:位于system.img中,由system间接使⽤(core的⼦集)。
cc_binary {
name: "libexample",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
}
...
}
  llndk:同时由system和vendor使⽤。
cc_binary {
name: "libexample",
...
}
  库的vendor版本在bp⽂件中⽤-D__ANDROID_VNDK__来标记编译。对于vendor模块,在Android.bp中必须将vendor或proprietary设为true,⽽在Android.mk中需将LOCAL_VENDOR_MODULE或LOCAL_PROPRIETARY_MODULE设为true。将当被标记为vendor_available:true时,该库将编译2次,1次为平台编译,被安装
到/system/lib[64]中;1次为vendor编译,被安装到/vendor/lib[64]、/system/lib[64]/vndk或/system/lib[64]/vndk-sp中)。vendor模块可以设置vendor_available,但不得设置abled和vndk.support_system_proces,因为它们由Google定义,即GSI中不包含这些vendor模块。现将三种属性整理如下表:
vendor_available vndk
enabled
vndk
support_same_process说明
true fal fal供应商变体为VND-ONLY。共享库将安装到/vendor/lib[64]中。
true fal true⽆效(编译错误)
true true fal供应商变体为VNDK。共享库将安装到/system/lib[64]/vndk-${VER}中。true true true供应商变体为VNDK-SP。共享库将安装到/system/lib[64]/vndk-sp-${VER}中。fal fal fal没有供应商变体。此模块为FWK-ONLY。
fal
fal true ⽆效(编译错误)fasle
true fal 供应商变体为VNDK-Private 。共享库将安装到/system/lib[64]/vndk-${VER}中。供应商模块不得直接使⽤这些变体。fal fal true 供应商变体为VNDK-SP-Private 。共享库将安装到/system/lib[64]/vndk-sp-${VER}中。供应商模块不得直接使⽤
这些变体。
vendor_available vndk enabled vndk support_same_process 说明  如果启⽤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 。若某个模块依赖于以上⽬录中的headers ,则必须在Android.bp 中指定与
header_libs 、static_libs 和shared_libs 的依赖关系。或在Android.mk 中的中指定LOCAL_HEADER_LIBRARIES 、LOCAL_STATIC_LIBRARIES 和
LOCAL_SHARED_LIBRARIES ,否则编译检查时会报错。
 3.3 VNDK Definition ⼯具
  VNDK Definition tool 可以帮助vendor 将源码树移植到Android 8.0环境。该⼯具会先扫描system.img 和vendor.img 中⼆进制⽂件,然后解析依赖项。还可以指定system.img 与GSI 进⾏对⽐,以确定扩展后的lib 库。
  该⼯具代码路径为:$AOSP/development/vndk/tools/definition-tool/vndk_definition_tool.py 。该脚本⽀持以下参数:
$ python3 ./vndk_definition_tool.py vndk \
--system "${PRODUCT_OUT}/system.img" \
--vendor "${PRODUCT_OUT}/vendor.img" \
--aosp-system "gsi_system_image" \
--load-extra-deps "dlopen.dep" \
--output-format=make
$ python3 ./vndk_definition_tool.py check-dep \
--system "${PRODUCT_OUT}/system.img" \
--vendor "${PRODUCT_OUT}/vendor.img" \
--aosp-system "gsi_system_image" \
--tag-file "eligible-list-v3.0.csv" \
--module-info ${PRODUCT_OUT}/module-info.json \
1> \
2> check_
$ python3 ./vndk_definition_tool.py deps \
--system "${PRODUCT_OUT}/system/" \
--vendor "${PRODUCT_OUT}/vendor/" \
>
  现将脚本⽀持的参数说明整理如下表:
第1个参数
说明vndk
计算VNDK 库集deps
输出⼆进制⽂件依赖信息⽤于debug check-dep
检查eligible 共享库依赖
第2个参数
说明–system
开发项⽬编译⽣成的system.img 路径。–vendor
开发项⽬编译⽣成的vendor.img 路径。–aosp-system AOSP 的system.img ,即由Google 释放的⽤于VTS 测试的GSI ⽂件。
–tag-file
由Google 释放的对framework 共享库进⾏了分类的表格–output-format
 ⾃动⽣成Android.mk (适⽤于vndk )–load-extra-deps
加载外部模块依赖⽂件(vndk 不适⽤)–revert
输出依赖详细情况(适⽤于deps )–module-info 开发项⽬编译⽣成的module-info.json 。(适⽤于check-dep )  dlopen.dep 的内容范例如下:
#libart.so 依赖于libart-compier.so
/system/lib64/libart.so: /system/lib64/libart-compiler.so
  check_ 的内容范例如下:
#libRS_internal.so 对libmediandk.so 的违规依赖
/system/lib/libRS_internal.so
MODULE_PATH: frameworks/rs
/system/lib/libmediandk.so
AImageReader_acquireNextImage
AImageReader_delete
AImageReader_getWindow
AImageReader_new
AImageReader_tImageListener
  的内容范例如下:
#ld-android.so 没有依赖
/system/lib/ld-android.so
#libc.so 依赖libdl.so
/system/lib/libc.so
/system/lib/libdl.so
  各类库对应⽬录:
    vndk-sp – /system/lib[64]/vndk-sp 。
    vndk-sp-ext – /vendor/lib[64]/vndk-sp 。
    extra-vendor-libs – /vendor/lib[64]
  在device/$(VENDOR)/$(DEVICE_NAME)⽬录下创建vndk ⽂件夹,⽤于存放配置vndk 库的Android.mk ,其范例如下:
ifneq ($(filter $(DEVICE_NAME),$(TARGET_DEVICE)),)
##_VNDK_SP_##
VNDK_SP_LIBRARIES := \
##_VNDK_SP_EXT_##
VNDK_SP_EXT_LIBRARIES := \
libpng
##_EXTRA_VENDOR_LIBS_##
EXTRA_VENDOR_LIBRARIES := \
android.hidl.ba @1.0 \
com.qualcomm.qti.ant@1.0 \
com.qualcomm.qti.wifidisplayhal@1.0
#-------------------------------------------------------------------------------
# VNDK Modules
#-------------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)
define define-vndk-lib
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := fal
LOCAL_MULTILIB := first
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)
ifneq ($$(TARGET_2ND_ARCH),)
ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true)
include $$(CLEAR_VARS)
LOCAL_MODULE := $1.$2
LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so
LOCAL_STRIP_MODULE := fal
LOCAL_MULTILIB := 32
LOCAL_MODULE_TAGS := optional
LOCAL_INSTALLED_MODULE_STEM := $1.so
LOCAL_MODULE_SUFFIX := .so
LOCAL_MODULE_RELATIVE_PATH := $3
LOCAL_VENDOR_MODULE := $4
include $$(BUILD_PREBUILT)
endif  # TARGET_TRANSLATE_2ND_ARCH is not true
endif  # TARGET_2ND_ARCH is not empty
endef
$(foreach lib,$(VNDK_SP_LIBRARIES),\
$(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,)))
$(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\
$(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true)))
$(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\
$(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true)))
#-------------------------------------------------------------------------------
# Phony Package
#-------------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := $(DEVICE_NAME)-vndk
LOCAL_MODULE_TAGS := optional
LOCAL_REQUIRED_MODULES := \
$(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \
$(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \
$(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES))
include $(BUILD_PHONY_PACKAGE)
endif  # ifneq ($(filter $(DEVICE_NAME),$(TARGET_DEVICE)),)
  然后在项⽬的makefile中添加下⾯⼀条内容,使得vndk/Android.mk参与编译:
PRODUCT_PACKAGES += $(DEVICE_NAME)-vndk
#查看image类型
file system.img
#将ext4转换为raw类型
out/host/linux-x86/bin/simg2img system.img system.raw.img
mkdir system
#⼿动挂载system分区
sudo mount -o loop,ro system.raw.img system
四、VNDK延伸
 4.1 VNDK扩展
  根据模块中定义的功能,可将模块分为DA模块和DX模块:
   (1)Defining-only-AOSP模块(DA 模块)不会定义AOSP副本中未包含的新功能。
    a.⼀个未经修改的AOSP库就是⼀个DA模块。
    b.如果vendor使⽤SIMD指令重写libexample.so中的函数(不添加新函数),那么修改后的libexample.so将是⼀个DA模块。
   (2)Defining-Extension模块(DX模块)要么会定义新功能,要么没有AOSP副本。
    a.如果vendor向 libexample.so 添加⼀个test函数以访问某些内部数据,那么修改后的libexample.so将是⼀个DX库,⽽这个新增函数将是该库的扩展部分。
    b.如果vendor定义了⼀个名为libexample.so的⾮AOSP库,那么libexmple.so将是⼀个DX库。
  根据模块所使⽤的功能,可将模块分为UA模块和UX模块。
   (1)Using-only-AOSP(UA模块)仅会在其实现过程中使⽤AOSP功能。它们不依赖任何⾮AOSP扩展功能。
    a.⼀个未经修改且完整⽆缺的AOSP库即是⼀个UA模块。
    b.如果修改后的共享库libexample.so仅依赖于其他AOSP API,那么它将是⼀个UA模块。
   (2)Using-Extension 模块(UX模块)会在其实现过程中依赖某些⾮ AOSP 功能。
    a.如果修改后的libexample.so依赖另⼀个名为libexample2.so的⾮AOSP库,那么修改后的libexample.so将是⼀个UX模块。
    b.如果vendor修改后的libexample.so1添加了⼀个新函数,并且其修改后的libexample2.so使⽤libexample1.so中的这个新增函数,那么修改后的libexample2.so将是⼀个UX模块。
 4.2 链接器命名空间
  链接器命名空间机制由动态链接器提供,可以隔离不同链接器命名空间中的共享库,以确保具有相同库名称和不同符号的库不会发⽣冲突。链接器命名空间机制可提供相应的灵活性,从⽽将由⼀个链接器命名空间导出的某些共享库⽤于另⼀个链接器命名空间。这些导出的共享库可能会成为对其他程序公开的应⽤编程接⼝,同时在其链接器命名空间中隐藏实现细节。
  动态链接器负责加载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.arch.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.arch.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.arch.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.arch.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.arch.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 = libba.so:libcutils.so
namespace.vndk.isolated = true
namespace.vndk.arch.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 = fal
namespace.default.arch.paths = /vendor/${LIB}:/system/${LIB}
各字段含义整理如下表:
属性说明⽰例
dir.name 指向[name]区段所应⽤到的⽬录的路径。每个属性
都会将⽬录下的可执⾏⽂件映射到链接器命名空间
配置区段。可能会有2个(或多个)属性具有相同
的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]配置中有3个命名空间(default、sphal和vndk)。
namespace.name.links 回退命名空间的逗号分隔列表。如果在当前命名空
间中找不到共享库,则动态链接器会尝试从回退命
名空间加载共享库。在列表开头指定的命名空间优
先级较⾼。
namespace.sphal.links=default,vndk 如果某个共享库或可执⾏⽂件请求另⼀个共享库,
⽽后者⽆法加载到sphal命名空间,则动态链接器会尝试从default命名空间加载此共享
库。然后,如果此共享库也⽆法从default 命名空间加载,则动态链接器会尝试从vndk命
名空间加载此共享库。最后,如果所有尝试都失败,则动态链接器会返回⼀个错误。
namespace.her.shared_libs ⽤冒号分隔的共享库列表(如果在name命名空间
中找不到这些共享库,则可以在other命名空间中搜
索)。此属性⽆法与
namespace.her.allow_all_shared_libs
⼀起使⽤。
namespace.sphal.link.default.shared_libs=libc.so:libm.so这表⽰回退链接仅接受libc.so或
libm.so作为请求的库名称。如果请求的库名称不是libc.so,也不是libm.so,则动态链接
器会忽略从sphal到default命名空间的回退链接。
namespace.her.allow_all_shared_libs ⼀个布尔值,⽤于指⽰在 name 命名空间中找不到
共享库时,是否所有共享库都可以在other命名空间
中搜索。此属性⽆法与
namespace.her.shared_libs⼀起使
⽤。
namespace.vndk.link.sphal.allow_all_shared_libs=true这表⽰所有库名称都可以遍历从
vndk到sphal命名空间的回退链接。
namespace.name.isolated ⼀个布尔值,⽤于指⽰动态链接器是否应该检查共
享库在什么位置。如果isolated为true,则只有某个
arch.paths⽬录(不包含⼦⽬录)中或
permitted.paths⽬录(包含⼦⽬录)下的共享库才
能加载。如果isolated为fal,则动态链接器不会
检查共享库的路径。
namespace.sphal.isolated=true这表⽰只有arch.paths中或permitted.paths下的共享库
才能加载到sphal命名空间。
namespace.name.arch.paths 以冒号分隔的⽬录列表,⽤于搜索共享库。如果函
数调⽤dlopen()或DT_NEEDED条⽬时未指定完整
路径,则在arch.paths中指定的⽬录将附加到请
求的库名称前⾯。在列表开头指定的⽬录优先级较
⾼。如果isolated为true,则任⼀arch.paths⽬录
(不包含⼦⽬录)中的共享库都可以加载,⽆论
permitted.paths属性如何设置。
namespace.default.arch.paths=/system/${LIB}这表⽰动态链接器会在/system/${LIB}中
搜索共享库。
namespace.name.asan.arch.paths 以冒号分隔的⽬录列表,⽤于在启⽤Address
Sanitizer后搜索共享库。在启⽤ Address Sanitizer
后,系统会忽略namespace.name.arch.paths。
namespace.default.asan.arch.paths=/data/asan/system/${LIB}:/system/${LIB}这表⽰在
启⽤Address Sanitizer后,动态链接器会先搜索/data/asan/system/${LIB},然后再搜索
/system/${LIB}。
namespace.name.permitted.paths 以冒号分隔的⽬录列表(包含⼦⽬录),当
isolated为true时,动态链接器可在其中加载共享库
(除了arch.paths以外)。permitted.paths的⼦
⽬录下的共享库也可以加载。如果isolated为
fal,则系统会忽略 permitted.paths 并发出相应
警告。
namespace.default.permitted.paths=/system/${LIB}/hw这表⽰/system/${LIB}/hw下的共享
库可以加载到隔离的default命名空间。
namespace.name.asan.permitted.paths 以冒号分隔的⽬录列表,在启⽤Address Sanitizer
后,动态链接器可在其中加载共享库。在启⽤
Address Sanitizer后,系统会忽略
namespace.name.permitted.paths。
namespace.default.asan.permitted.paths=/data/asan/system/${LIB}/hw:/system/${LIB}/hw
这表⽰在启⽤Address Sanitizer后,/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为fal(默认
值),则⽆论命名空间是否存
在,android_get_exported_namespace()始终返回
NULL。仅当符合以下条件时,共享库才能加载到
此命名空间:(1)具有指向此命名空间的回退链接的
其他链接器命名空间请求这些共享库;(2)此命名空
间中的其他共享库或可执⾏⽂件请求这些共享库。
namespace.sphal.visible = true这表⽰android_get_exported_namespace(“sphal”)可以返
回有效的链接器命名空间句柄。
  ${android-src}/system/core/rootdir/etc中有3个配置⽂件。系统会根据BoardConfig.mk中 PRODUCT_TREBLE_LINKER_NAMESPACES、BOARD_VNDK_VERSION和BOARD_VNDK_RUNTIME_DISABLE的值选择不同的配置:
PRODUCT_TREBLE_LINKER_NAMESPACES BOARD_VNDK_VERSION BOARD_VNDK_RUNTI
ME_DISABLE选择的配置VTS要求

本文发布于:2023-05-07 21:47:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/867133.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:共享   空间   命名
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图