本文基于 FFmpeg 5.1.4 版本,详细讲述了使用 Android.bp 构建 FFmpeg 库的过程,旨在简化 Android 源码中 FFmpeg 库的构建以及集成过程。
以编译 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 各模块需编译的源文件:
首先,搭建整体编译框架,后续章节再补充具体编译参数。
// 依赖项
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
声明 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: [
],
}
参考 avutil_files.bp,创建 compat_files.bp、avcodec_files.bp、avformat_files.bp、swresample_files.bp、swscale_files.bp 文件,并添加相应的模块声明。
filegroup {
name: "compat-src",
// 无需区分 ARM 和 ARM64 架构
srcs: [
],
}
filegroup {
name: "avcodec-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "avcodec-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "avcodec-src-common",
// 多平台共用代码
srcs: [
],
}
filegroup {
name: "avformat-src",
srcs: [
]
}
filegroup {
name: "swresample-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "swresample-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "swresample-src-common",
// 多平台共用代码
srcs: [
],
}
filegroup {
name: "swrscale-src-arm",
// ARM 架构代码
srcs: [
],
}
filegroup {
name: "swrscale-src-arm64",
// ARM64 架构代码
srcs: [
],
}
filegroup {
name: "swrscale-src-common",
// 多平台共用代码
srcs: [
],
}