文章目录
前言
本文基于 FFmpeg 5.1.4 版本,详细讲述了使用 Android.bp 构建 FFmpeg 库的过程,旨在简化 Android 源码中 FFmpeg 库的构建以及集成过程。
- 构建过程需使用 NDK 工具辅助,请参考该专栏之前文章:使用 NDK 编译 FFmpeg
- github 仓库:FFmpegDroidBuilder
搭建编译框架
以编译 libavutil、libavcodec、libavformat、libswresample、libswscale 模块为例,在 FFmpeg 源码根目录下,创建以下 7 个文件:
Android.bp
├── compat_files.bp
├── avutil_files.bp
├── avcodec_files.bp
├── avformat_files.bp
├── swresample_files.bp
└── swscale_files.bp
Android.bp 作为编译入口,定义整体编译架构,其余 6 个 bp 文件作为 Android.bp 的依赖项,声明 FFmpeg 各模块需编译的源文件:
- compat_files.bp 声明 compat 目录下需编译的源码文件,该目录中存在很多为兼容各种平台而创建的头文件
- 其他 bp 文件则分别声明 libavutil、libavcodec、libavformat、libswresample、libswscale 目录下需编译的源文件
1. 创建 Android.bp 文件
首先,搭建整体编译框架,后续章节再补充具体编译参数。
// 依赖项
build = [
"compat_files.bp",
"avutil_files.bp",
"avcodec_files.bp",
"avformat_files.bp",
"swresample_files.bp",
"swscale_files.bp",
]
// 编译选项默认值
cc_defaults {
name: "libFFmpeg_defaults",
cflags: [
],
arch: {
arm: {
cflags: [
],
asflags: [
],
},
arm64: {
cflags: [
],
asflags: [
],
},
},
}
cc_library {
name: "libFFmpeg",
defaults: ["libFFmpeg_defaults"],
local_include_dirs: [
],
vendor_available: true,
export_include_dirs: [
".",
],
// android 10 平台需设置该选项为 false 以停用 XOM
// xom: false,
// 默认同时编译 32 和 64 位的代码。若放开下列注释,则只编译 64 位的代码
// compile_multilib: "64",
arch: {
arm: {
instruction_set: "arm",
srcs: [
":avutil-src-arm",
":avcodec-src-arm",
":swresample-src-arm",
":swrscale-src-arm",
],
// ARM 架构编译选项
cflags: [
],
// ARM 架构链接选项
ldflags: [
],
// ARM 架构汇编选项
asflags: [
]
},
arm64: {
srcs: [
":avutil-src-arm64",
":avcodec-src-arm64",
":swresample-src-arm64",
":swrscale-src-arm64",
],
// ARM64 架构编译选项
cflags: [
],
// ARM64 架构链接选项
ldflags: [
],
// ARM64 架构汇编选项
asflags: [
],
},
},
srcs: [
":compat-src",
":avutil-src-common",
":avcodec-src-common",
":swresample-src-common",
":swrscale-src-common",
":avformat-src",
],
shared_libs: [
],
static_libs: [
],
// 全局编译选项
cflags: [
],
// 全局链接选项
ldflags: [
],
// 全局汇编选项
asflags: [
],
}
-
XOM 官当说明:AArch64 二进制文件的只执行内存 (XOM)
-
Android.bp 中定义的模块间依赖关系如下:
Android.bp
└── libFFmpeg
├── libFFmpeg_defaults
│
├── compat-src
│
├── avutil-src-common
├── avutil-src-arm
├── avutil-src-arm64
│
├── avcodec-src-common
├── avcodec-src-arm
├── avcodec-src-arm64
│
├── swresample-src-common
├── swresample-src-arm
├── swresample-src-arm64
│
├── swrscale-src-common
├── swrscale-src-arm
├── swrscale-src-arm64
│
└── avformat-src
2. 创建 avutil_files.bp
声明 avutil-src-arm、avutil-src-arm64、avutil-src-common 模块,后续章节再补充这些模块所依赖的源文件。
filegroup {
name: "avutil-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "avutil-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "avutil-src-common",
// 多平台共用代码
srcs: [
],
}
3. 创建其他 bp 文件
参考 avutil_files.bp,创建 compat_files.bp、avcodec_files.bp、avformat_files.bp、swresample_files.bp、swscale_files.bp 文件,并添加相应的模块声明。
- compat_files.bp
filegroup {
name: "compat-src",
// 无需区分 ARM 和 ARM64 架构
srcs: [
],
}
- avcodec_files.bp
filegroup {
name: "avcodec-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "avcodec-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "avcodec-src-common",
// 多平台共用代码
srcs: [
],
}
- avformat_files.bp
filegroup {
name: "avformat-src",
srcs: [
]
}
- swresample_files.bp
filegroup {
name: "swresample-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "swresample-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "swresample-src-common",
// 多平台共用代码
srcs: [
],
}
- swscale_files.bp
filegroup {
name: "swrscale-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "swrscale-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "swrscale-src-common",
// 多平台共用代码
srcs: [
],
}