F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not foundandroid
首先在android生态里,通常的应用开发者,不会遇到这个问题。
系统开发者也只有在某些状况下会遇到这个问题。什么状况呢?api
咱们先来了解下什么是vndk以及其规则。架构
SDK(software development kit),NDK(native development kit)都不陌生吧,尤为是android应用开发者来讲,就是某某开发包包含了api及其规范等等使得你开发的apk能够在android上运行。
那么怎么理解,vendor native development kit呢,这要从android整个软硬件框架及其生态提及,开发者常说的android其实指的是AOSP,而一个完整的android生态,至少包含四个个部分,一个是android,一个是硬件厂家芯片,屏幕,整机等等,一个是应用开发者,一个是消费者(是硬件消费者同时也是软件,内容消费者)。
能够看到android在产品架构上起了一个承上启下的做用,将硬件厂家和开发者链接在一块儿。
这里有一个看似矛盾的地方,android是谷歌开源的,而谷歌是一个商业公司不是慈善机构。谷歌开源的目的是推广它的广告系统从中得利,可是太开放版本混乱体验不一致反过来会损害它的利益。因此须要在开放的同时进行控制。
若是SDK,NDK是应用开发者的开发规范,那VNDK是针对硬件厂家的开发规范。框架
在理想的 Android 8.0 及更高版本环境中,框架进程不加载供应商共享库,全部供应商进程仅加载供应商共享库(和一部分框架共享库),而框架进程与供应商进程之间的通讯由 HIDL 和硬件 binder 控制。
主要意思是,系统分区和vendor分区隔离,尤为系统分区内的框架进程不要连接加载vendor下的so库,规则不容许这样作,强行加载会报错,就是文章开头贴的错误。谷歌以这种方式保持系统对底层的统一,限制每一个硬件厂家在底层对系统的不统一的修改。
因此系统开发者若是用框架进程不管是已经存在的仍是新增的去加载vendor下的库都会遇到这个问题。
可能有人会说,android是开源的,我把这个限制在源码里去掉就能够了啊,别忘了咱们在以前一篇文章里说过谷歌会考试,这么作考试会不及格的。不及格就拿不到谷歌的印章,没有印章,产品想上市麻烦事有不少,因此这几行代码代价过高了,不能这么作。进程
VNDK给出了解决方案
方案1.把vendor下的资源经过供应商进程的方式暴露出来,框架进程经过hidl或者硬件binder的方式与供应商进程通讯达到访问vendor资源的目的。
方案2.若是vendor下的资源好比so库,可以从vendor下完全脱离,也能够拷贝一份到system下,这样合理的避开了这个问题,并且还省掉了开发供应商进程的成本,以及hidl或binder通讯的消耗。资源
在框架进程必需要加载这个库的状况下,若是vendor下的so库能完全脱离vendor,拷贝一份在system是最佳的方案。
为何不是直接挪到system下,而是要拷贝一份呢?由于so放在vendor下就是由于vendor要用,而vendor进程只能加载一部分谷歌容许的框架so,因此这个库若是不是谷歌容许的so只放在system下那vendor也加载不到了。这种状况两边都要放。开发
用框架进程去加载一个vendor下的共享库,vendor/lib/libxxx.so, vendor/lib64/libxxx.so,这个库是芯片厂家提供的。
报告错误,F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not found。
正准备将vendor下的libxxx.so拷贝到system下,修改脚本的时候注意到一个叫libxxx_system.so被拷贝到了system下,libxxx_system.so与libxxx.so同名,只是多了_system后缀。
忽然一个想法闪过“libxxx_system.so就是libxxx.so在system的拷贝”,初步经过3个步骤获得了确认
1.看大小两个差很少
2.看连接的库,两个so连接的库同样,并且都是谷歌容许的框架的so
3.看符号表基本同样
而后框架进程改为连接system/lib/libxxx_system.so和system/lib64/libxxx_system.so编译经过,运行经过,问题解决。看来芯片厂家已经作了相关的预案。get
仅献给遇到此问题的朋友,F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not found。源码
VNDK详细介绍:https://source.android.com/de...产品