Android开发如何理解及应对SO文件兼容性问题

什么是armeabi和armeabi-v7a?

做Android开发,经常在工程的libs目录会看到armeabi和armeabi-v7a等,该如何理解呢?armeabi与armeabi-v7a表示支持不同的CPU类型。armeabi是指ARM的通用CPU,而v7a的CPU支持硬件浮点运算。因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力。

Android开发如何理解及应对SO文件兼容性问题?

那么在项目中使用armeabi还是armeabi-v7a呢?

其实这不是一个二选一的问题,首先要分情况:

1. 如果这个SO支持armeabi和armeabi-v7a两个甚至更多版本,那我们的lib目录把这几个都放一个,这样最终App在运行的时候,Android系统会选择最优的版本运行。

2. 如果这个SO只支持armeabi,libs目录只应存在armeabi这一个目录。有时候比方说我们有两个SO文件A.SO和B.SO,A.SO我们有armeabi和armeabi-v7a两个版本,B.SO我们只有armeabi一个版本,这个时候如果armeabi和armeabi-v7a两个目录都存在,在armeabi-v7a下缺失B.SO的情况下,系统依然会去armeabi-v7a目录加载B.SO就会导致加载异常。这个时候要么要把B.SO的armeabi-v7a版本补充好放进去,要么就把armeabi-v7a目录移除。

一般的手机或平板都是用arm的cpu,很多设备都支持多种ABI。例如ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包。但最好是针对特定平台提供相应平台的二进制包,这种情况下运行时就少了一个模拟层(例如x86设备上模拟arm的虚拟层),从而得到更好的性能(归功于最近的架构更新,例如硬件fpu,更多的寄存器,更好的向量化等)。

有一点需要注意,如果你是一个SO文件的提供者,最好提供支持所有的ABI,否则最终用户因为引入你的这个这个SO,将人家原本都支持的ABI都移除,典型的木桶理论。

相关阅读