Android 开发ABI的基础知识

ABI概述

  ABI 是英文单词Application Binary Interface 首字母的缩写,翻译过来就是应用程序二进制接口,它定义了二进制文件尤其是.so 文件如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。Android系统每一个CPU架构对应一个ABI,目前主流的有:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。
  
  so(shared object,共享库)是机器可以直接运行的二进制代码,是Android上的动态链接库,由C/C++ 编译生成。开发Android应用时,当不能满足一定需求时就会用得so 库。如:加解密算法,音视频编解码等。

so的兼容性

不同架构的CPU其对ABI的兼容如下:

  • armeabi设备只兼容armeabi;
  • armeabi-v7a设备兼容armeabi-v7a、armeabi;
  • arm64-v8a设备兼容arm64-v8a、armeabi-v7a、armeabi;
  • x86设备兼容x86、armeabi;
  • mips64设备兼容mips64、mips;
  • mips只兼容mips;

通过上面的兼容性总结如下:

  • armeabi 是大部分CPU都兼容的,除了mipsmips64外,在非armeabi设备上运行性能和兼容性是有损耗的。
  • 64位架构的CPU向下兼容其对应的32位。

知道了ABI、so 的概念和so的兼容性,开发中针对实际项目如何选取适配不同的机型呢?先看三张大厂应用中so的分布图 :


 


 


 

上面三张图分别是花椒直播、微信、支付宝应用中使用so 的信息分布信息,(通过应用Native Libs Monitor 分析得到上图),通过分析得出:

  • 直播app中针对音视频编解码要求比较高,既对性能要求高;也考虑到兼容性和apk的大小等问题选择了armeabi-v7a
  • 微信和支付宝都使用了armeabi 也是根据自身的需求来定的,微信的lib下虽然只有armeabi一个目录,但目录内的文件仍放着armeabi、armeabi-v7a架构的so文件,上图中在so名称最后就可以看出,这样做目的是处理兼容带来的某些性能运算问题。

最终开发过程中选取so 文件要根据项目实际情况通过从各方面综合考虑来定。

在项目中只提供一种ABIso在gradle中配置如下:

android {
   ...
    defaultConfig {
        ndk {
            abiFilters 'armeabi'// 指定ndk需要兼容的ABI(这样其他依赖包里x86,armeabi-v7a之类的so会被过滤掉) 
        }
    }
}
  • 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

คิดถึง643

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值