android系统编译so库
- 移植准备
- 移植目的
- 移植环境
- ABI和API
- ABI
- API
- ABI和API区别
- 编译环境
- NDK-build
- AOSP
- 参考文档
移植准备
这里主要是针对我自己最近遇到的项目问题,需要在android4.4系统上移植android9.0的webrtc语音处理算法,因而引入的内容。
移植目的
本文主要描述的就是如何将自己的代码编译成native库在android系统上运行(并不包括在android系统上使用自己的库),那么本质就是生成指定结构的二进制.so。要生成可用的二进制.so必不可少的就是需要了解到编译环境、目标机软硬件环境
移植环境
最终的目标.so动态库实质就是二进制机器码,要想获取最终的.so就需要针对源代码进行编译生成,这就牵涉到目标平台和宿主机的软硬件环境
- 宿主机(开发机器)
软件环境:编译器(根据目标平台架构决定)、系统(Windows、Linux)、C/C++库
硬件环境:机器架构(arm/arm64,x86/x86-64) - 目标平台(.so运行平台)
软件平台:android系统版本(对应的API和ABI版本)
硬件平台:架构(ABI版本)
ABI和API
ABI
application binary interface,应用程序二进制接口。不同的android设备对应不同的CPU,不同的CPU又对应不同的指令集,实质是定义了与设备底层硬件相关的细节信息:
- 指令集
- 内存读写字节顺序
- 应用和系统之间传递数据(对齐),系统函数调用如何使用堆栈和寄存器
- 二进制文件格式等
ABI这个概念比较常见应用于NDK-build编译android应用时。
API
Application Programming Interface,应用程序编程接口。实质是一套android系统框架API(程序接口),使得应用程序开发人员无需了解android系统代码及其原理,也无需了解底层硬件,可以与系统底层直接交互的接口(只要会调用就好了)。关于android API需要了解:
- 一个android平台提供的API被标记为一个唯一整数值最为API版本
- 一个android平台的框架API通常支持向前兼容(保留旧平台的API功能不变,加入新功能或者旧功能的升级优化),除非特殊情况(基于API稳定性或者应用程序或系统的安全性考虑),否知一律支持向前兼容
- 一个android平台只对应一个API版本
ABI和API区别
- ABI提供给机器平台识别运行的(强调底层运行实现细节)
- API是提供给开发人员调用的(强调开发调用细节)
编译环境
这里探讨的对象就是生成能够在目标平台上运行的.so,那么就需要针对源码进行编译,而编译的方法一般采用这两种(针对在Linux系统下,不包括Windows下android studio)。
NDK-build
这种方法的好处是不需要庞大的android源码结构,只需要编译用到的相关库、交叉编译工具(这些都由ndk-buld提供了),体积更小,源码更容易获取,操作更简单,但是需要对目标平台的ABI、API(应用程序开发尤其需要注意)版本号。NDK-build支持更灵活的源码编译:
- autoconf:自动生成configure脚本,执行后生成Makefile(具体操作方法可以参考android developer网址:android developer)
- makefile:最简单的代码工程框架了(具体操作方法参考android developer网址:android developer)
- android.mk:从android 源码中拿出来的工程结构(android developer)
AOSP
AOSP,android源码结构下编译,只需要按照按照android源码相关的编译流程即可。
参考文档
从零开始制作自己的指令集架构CPU、处理器架构、指令集、指令集架构