南岸瑾年 發表於 2020-7-11 14:07:00

关于Android 供应商原生开发套件(VNDK)引发的问题

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