供應商原生開發套件,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使用。
