Android VNDK限制下的解決方案

你有沒有遇到過這個錯誤呢?

F linker: CANNOT LINK EXECUTABLE "/system/bin/xxx": library "libxxx.so" not foundandroid

首先在android生態裏,通常的應用開發者,不會遇到這個問題。
系統開發者也只有在某些狀況下會遇到這個問題。什麼狀況呢?api

咱們先來了解下什麼是vndk以及其規則。架構

VNDK就是vendor NDK

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是針對硬件廠家的開發規範。框架

谷歌是這樣介紹VNDK的

在理想的 Android 8.0 及更高版本環境中,框架進程不加載供應商共享庫,全部供應商進程僅加載供應商共享庫(和一部分框架共享庫),而框架進程與供應商進程之間的通訊由 HIDL 和硬件 binder 控制。
主要意思是,系統分區和vendor分區隔離,尤爲系統分區內的框架進程不要連接加載vendor下的so庫,規則不容許這樣作,強行加載會報錯,就是文章開頭貼的錯誤。谷歌以這種方式保持系統對底層的統一,限制每一個硬件廠家在底層對系統的不統一的修改。
因此係統開發者若是用框架進程不管是已經存在的仍是新增的去加載vendor下的庫都會遇到這個問題。
可能有人會說,android是開源的,我把這個限制在源碼裏去掉就能夠了啊,別忘了咱們在以前一篇文章裏說過谷歌會考試,這麼作考試會不及格的。不及格就拿不到谷歌的印章,沒有印章,產品想上市麻煩事有不少,因此這幾行代碼代價過高了,不能這麼作。進程

如何知足VNDK的規則呢?

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...產品

相關文章
相關標籤/搜索