关于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}

但是,当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

最终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使用。

为什么要使用VNDK,可以参考Android O的相关设计资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunxiaolin2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值