|
供应商原生开发套件,Vendor Native Development Kit,简称VNDK.
问题引发: vndksupport:Could not load demo.so from default namespace:dlopen failed: library “libstdc++.so” not found.
demo.so位于vendor下面,找不到libstdc++.so,而libstdc++.so的库位于system/lib和system/lib64中。 这说明vendor下面的库引用libstdc++.so时,无法找到system/lib中的libstdc++.so。
参考资料: https://source.android.google.cn/devices/architecture/vndk
Android O之后的变化,从 LL-NDK 库中移除 libstdc++.so,不再支持 libstdc++.so,改用 libc++.so。 这导致一些老的平台上依旧使用了 libstdc++.so,而产生了not found问题。
相关目录文件: \system\core\rootdir\etc\
解决方法1: system/core/rootdir/etc/ld.config.txt文件中,[vendor]下,增加:
# Access to system libraries are allowed namespace.default.search.paths += /system/${LIB}/vndk%VNDK_VER% namespace.default.search.paths += /system/${LIB}/vndk-sp%VNDK_VER% namespace.default.search.paths += /system/${LIB} namespace.default.search.paths += /product/${LIB} 1 2 3 4 5 但是,当google/wahoo/BoardConfig.mk中,打开如下编译选项时: BOARD_VNDK_VERSION := current
根据build/make/core/Makefile中的判断:
# ----------------------------------------------------------------- # FINAL_VENDOR_DEFAULT_PROPERTIES will be installed in vendor/default.prop if # property_overrides_split_enabled is true. Otherwise it will be installed in # ROOT/default.prop. ifdef BOARD_VNDK_VERSION ifeq ($(BOARD_VNDK_VERSION),current) FINAL_VENDOR_DEFAULT_PROPERTIES := ro.vndk.version=$(PLATFORM_VNDK_VERSION) else FINAL_VENDOR_DEFAULT_PROPERTIES := ro.vndk.version=$(BOARD_VNDK_VERSION) endif ifdef BOARD_VNDK_RUNTIME_DISABLE FINAL_VENDOR_DEFAULT_PROPERTIES += ro.vndk.lite=true endif else FINAL_VENDOR_DEFAULT_PROPERTIES := ro.vndk.version=$(PLATFORM_VNDK_VERSION) FINAL_VENDOR_DEFAULT_PROPERTIES += ro.vndk.lite=true endif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 最终default.prop中会有ro.vndk.lite=true。当ro.vndk.lite=true时,动态链接器将加载 /system/etc/ld.config.vndk_lite.txt 中的链接器命名空间配置,这仅会隔离 SP-HAL 和 VNDK-SP。 即system/core/rootdir/etc/ld.config.vndk_lite.txt
而system/core/rootdir/etc/ld.config.vndk_lite.txt 中,已经包含了namespace.default.search.paths += /system/${LIB}。
所以
解决方法2: 注释掉**/**/BoardConfig.mk中的编译选项: #BOARD_VNDK_VERSION := current
解决方法3: 找到libstdc++.so,将libstdc++.so文件拷贝到vendor/lib或者vendor/lib64中去。
但是解决方法1和解决方法2更能搞清楚VNDK的原理。
原理 参考文章: https://www.cnblogs.com/blogs-of-lxl/p/11232754.html
VNDK(Vendor Native Development Kit)是一组专门用于vendor实现其HAL的lib库,是供开发商使用的。
所以,简单来说,VNDK是一些so库。VNDK 包含在 system.img 中,但是在运行中时,可供vendor使用。
来源:https://www.cnblogs.com/ericyl/p/13283389.html |