Android動態選擇性載入so檔案
阿新 • • 發佈:2019-01-08
先說問題,專案中只提供了 armeabi 目錄下的基礎so檔案,對於大多數的機型都是支援的,但是在最近使用的一個第三方庫中,只提供了 v6、v7 跟 x86 機型的so檔案,將v7中so放在 armeabi 下面,在 x86 的機子上會 crash,如果再在lib下加一個 x86 的目錄來支援 x86 機子的話,so 檔案的大小又會導致 apk 的大小增加不少。考慮到這些因素,在儘量少的增加apk大小的基礎上。選擇了根據cpu架構型別動態載入so。
做法就是將沒有提供armeabi的第三方庫中x86資料夾放在專案 assets 資料夾中,根據這篇文章中說的:動態載入so的檔案只能放在兩個地方 lib跟本地 data/data/package 資料目錄下。所以在專案首頁中放了個子執行緒,判斷是不是x86機子,是的話就把 assets 中的 x86 檔案中的so檔案複製到本地資料目錄下,在載入使用的時候又判斷了下是不是 x86 的機子。選擇性的載入lib中的so還是本地資料目錄下的so。這裡有個疑問,有沒有辦法直接將assets下的檔案直接複製到lib目錄下,感覺這裡會涉及些許可權問題,有知道的麻煩告訴一下。
程式碼就不貼了,上面文字寫的挺全的。至於識別機型,用的是 Build.SUPPORTED_ABIS,這個陣列存的機子支援的abi,會順序存在陣列中,但這個api只支援 api21以上的機子。一般x86的機子順序第一個支援的abi應該是 x86 或者 x86_64。