Android 与 so
ABI
ABI(Application Binary Interface)应用二进制借口,定义了 CPU 能够执行的二进制文件的格式规范。
Android 支持的 CPU 架构众多,ABI 包括armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64
so (shared object)是机器可以直接运行的二进制代码,买个 App 的 so 被打包在 apk 文件的lib/目录下
1 | lib |
使用下面命令可以查看 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") |

