關於Android 供應商原生開發套件(VNDK)引發的問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM