谈谈Android的so

本文详细介绍了Android的ABI和.so文件的关系,ABI定义了二进制文件的格式规范,.so是动态链接库。文章探讨了为何使用.so,如何为不同ABI生成.so,查看系统ABI支持的方法,x86设备对arm的支持,以及apk安装时的.so选择。此外,还讲解了.so的加载方式、减小包大小的策略以及在处理.so文件时应注意的问题。
摘要由CSDN通过智能技术生成

一般情况下,我们不需要关心so。但是当APP使用的第三方SDK中包含了so文件,或者自己需要使用NDK开发某些功能,就有必要去好好了解下so的一些知识。

出处: Allen’s Zone
作者: Allen Feng

什么是ABI和so

早期的Android设备只支持ARMv5的CPU架构,随着Android系统的快速发展,搭载Android的硬件平台也早已多样化了,又加入了ARMv7,x86,MIPS,ARMv8,MIPS64和x86_64。
每一种CPU架构,都定义了一种ABI(Application Binary Interface,应用二进制接口),ABI定义了其所对应的CPU架构能够执行的二进制文件(如.so文件)的格式规范,决定了二进制文件如何与系统进行交互。
ABI及支持的指令集
每一种ABI的详细介绍可以参见官方的介绍ABI Management

so(shared object,共享库)是机器可以直接运行的二进制代码,是Android上的动态链接库,类似于Windows上的dll。每一个Android应用所支持的ABI是由其APK提供的.so文件决定的,这些so文件被打包在apk文件的lib/目录下,其中abi可以是上面表格中的一个或者多个。
例如,解压一个apk文件后,在lib目录下可以看到如下文件:

lib
|
├── armeabi
│   └── libmath.so
├── armeabi-v7a
│   └── libmath.so
├── mips
│   └── libmath.so
└── x86
    └── libmath.so

说明该应用所支持的ABI为armeabi, armeabi-v7a, mips, 和x86。

注:可以使用aapt命令快速查看apk支持的abi

~ aapt dump badging baidutieba.apk | grep abi
native-code: 'armeabi' 'mips' 'x86'

为什么使用so

  • so机制让开发者最大化利用已有的C和C++代码,达到重用的效果,利用软件世界积累了几十年的优秀代码;
  • so是二进制,没有解释编译的开消,用so实现的功能比纯java实现的功能要快;
  • so内存分配不受Dalivik/ART的单个应用限制,减少OOM;
  • 相对于java代码,二进制代码的反编译难度更大,一些核心代码可以考虑放在so中。

为指定的ABI生成so

默认情况下,NDK只会为armeabi生成.so文件,若需要生成支持其他ABI的.so文件,可以在Application.mk文件中指定APP_ABI参数:

APP_ABI := armeabi-v7a

APP_ABI参数可以被指定多个值以支持多个ABI:

APP_ABI := armeabi armeabi-v7a x86

当然,你也可以使用all来生成支持所有ABI的so:

APP_ABI := all

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值