android系统编译so库

  • 移植准备
  • 移植目的
  • 移植环境
  • ABI和API
  • ABI
  • API
  • ABI和API区别
  • 编译环境
  • NDK-build
  • AOSP
  • 参考文档


移植准备

这里主要是针对我自己最近遇到的项目问题,需要在android4.4系统上移植android9.0的webrtc语音处理算法,因而引入的内容。

移植目的

本文主要描述的就是如何将自己的代码编译成native库在android系统上运行(并不包括在android系统上使用自己的库),那么本质就是生成指定结构的二进制.so。要生成可用的二进制.so必不可少的就是需要了解到编译环境、目标机软硬件环境

移植环境

最终的目标.so动态库实质就是二进制机器码,要想获取最终的.so就需要针对源代码进行编译生成,这就牵涉到目标平台和宿主机的软硬件环境

  1. 宿主机(开发机器)
    软件环境:编译器(根据目标平台架构决定)、系统(Windows、Linux)、C/C++库
    硬件环境:机器架构(arm/arm64,x86/x86-64)
  2. 目标平台(.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、处理器架构、指令集、指令集架构