为排查在用户手中的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