文章目录
  1. 1. ABI
  2. 2. 制定 ABI 生产 so
  3. 3. Android 系统的 ABI 支持
    1. 3.1. 查看 ABI
  4. 4. 加载 so

ABI

ABI(Application Binary Interface)应用二进制借口,定义了 CPU 能够执行的二进制文件的格式规范。
Android 支持的 CPU 架构众多,ABI 包括armeabiarmeabi-v7aarm64-v8ax86x86_64mipsmips64

https://developer.android.com/ndk/guides/abis.html#sa

so (shared object)是机器可以直接运行的二进制代码,买个 App 的 so 被打包在 apk 文件的lib/目录下

1
2
3
4
5
6
7
8
9
10
lib
|
├── armeabi
│ └── libmath.so
├── armeabi-v7a
│ └── libmath.so
├── mips
│ └── libmath.so
└── x86
└── libmath.so

使用下面命令可以查看 apk 支持的 abi

1
appt dump bading app.apk | grep abi

制定 ABI 生产 so

Application.mk文件中指定APP_ABI参数

Android 系统的 ABI 支持

  • primary ABI 当前系统使用的 ABI
  • secondary ABI 当前系统支持的其他 ABI
    一般情况手机不止支持一个 ABI

查看 ABI

  • /system/build.prop中制定了支持的 ABI 类型,可以在 adb shell 中查看
1
getprop | grep abilist
  • 使用Build.BUPPORTED_ABIS可以获取当前设备支持的 ABI 列表
1
Build.SUPPORTED_ABIS;

在 apk 安装过程时,Package Manager 会扫描整个 apk 寻找符合下面文件路径格式动态链接库

1
lib/<primary-abi>/lib<name>.so

primary-abi是上面表中的 abi 的值,name对应的是Android.mk中定义的LOCAL_MODULE的值
如果没有当前primary-abi的 so,Package Manager 会尝试寻找合适secondary-abi的 so 文件

1
lib/<secondary-abi>/lib<name>.so

有合适的 so 文件后,包管理会在改 ABI 文件下的所有 so 库全部拷贝到应用的 data 目录下data/data/<package_name>/lib/

在代码调用 so 时,如果 ABI 文件夹下没有提供 so 文件,运行时会遇到java.lang.UnsatisfiedLinkError

加载 so

System.loadLibrary之传入Android.mk中定义的LOCAL_MODULE的值
System.load这个方法可以动态的加载非 apk 内置的 so,甚至动态下载的 so,但是不能加载 SD 卡中的 so

1
System.load("/data/data/<package-name/dir/libmath.so")
文章目录
  1. 1. ABI
  2. 2. 制定 ABI 生产 so
  3. 3. Android 系统的 ABI 支持
    1. 3.1. 查看 ABI
  4. 4. 加载 so