爲排查在用戶手中的Android設備存在找不到so的問題,需看一下某一so支持什麼CPU格式。熟悉C層庫的同學都知道,C所編譯所得的靜態庫(.a)和動態庫(.so)均爲CPU相關的,不同的CPU環境需運行不同的so。在Android中,可以選用默認的so,即編譯爲armeabi環境的so運行於包括arm v5、arm v7,Intel x86環境。替代將全部CPU的so均打入包中,可能會降低一些性能,但得到的好處是安裝包較小。
好,言歸正傳,拿到一個so後,如何查看其所匹配的CPU呢?答案本身在so中,我們所需做的是使用工具,將該信息從so中讀出。在Mac下,可以通過greadelf和gobjdump兩個命令得到該信息。只是取cpu的話,前述兩命令中的任一個均能實現目標。
打開終端,輸入greadelf,得到如下信息:
-bash: greadelf: command not found
運行gobjdump的結果一樣,原因是Mac環境默認不包含該命令工具。可以選用brew進行安裝
運行下述命令:
brew update
brew install binutils
安裝好之後再次運行greadelf,得到如下信息:
-bash: greadelf: command not found
爲什麼呢?仔細看一下brew install binutils的執行結果,發現有該提示:
If you need to have binutils first in your PATH run:
echo 'export PATH="/usr/local/opt/binutils/bin:$PATH"' >> ~/.bash_profile
想隨處都可運行該命令,需配置環境變量:
sudo touch ~/.bash_profile (首次配置環境變量,需創建該文件)
sudo vi ~/.bash_profile,編輯環境變量,加入export PATH="/usr/local/opt/binutils/bin:$PATH"
source ~/.bash_profile:啓用該環境變量
好,再次運行greadelf,可以看到的提示配置項,命令配置成功
仔細閱讀配置項,發現如下命令即可:
greadelf -A libCube.so
得到如下輸出:
可知該so適合於armv5架構。
再試一下gobjdump:gobjdump -x libCube.so