用 Jenkins 构建 Android 原生库

因为最近有在尝试移植 Darkplaces 引擎到 Android,而且电脑太垃圾,所以打算让我的 Jenkins 服务器为我分担一部分。

要移植 Android 的原生程序就需要一并构建相关的依赖,一些依赖的构建挺消耗性能,还有一些依赖的构建不能一步到位。Freetype2 就属于后者,其构建需要运行 ./configure 脚本,而 Android 自带的 ndk-build 不允许这个。对应的构建需要 NDK 的独立编译链,然后一一执行配置脚本,生成指定架构的库。所以,我想这时候 Jenkins 就能派上用场了。

Jenkins 的作业配置

要让一个作业给多个架构构建肯定要参数化,这里 Jenkins 提供了构建矩阵。构建矩阵可以设置多个不同的维度(参数)列表,然后生成一个矩阵(表格),为他们依次构建。一个有 Arch 参数和 Whatever 参数的矩阵长这样:

+---------------+---------+-------+----------+-------+
| Arch/Whatever |  arm64  |  arm  |  x86_64  |  x86  |
+---------------+---------+-------+----------+-------+
|       1       | arm64,1 | arm,1 | x86_64,1 | x86,1 |
|       2       | arm64,2 | arm,2 | x86_64,2 | x86,2 |
+---------------+---------+-------+----------+-------+

但我们这里只有一个参数——架构,所以和一个列表差不多。

要配置这样的作业,在 Jenkins 中新建作业并选择构建一个多配置项目。然后在配置矩阵那里,新建新的维度(Axis)里面填上名字(建议全英文,因为这是变量名)然后在值里面填入对应的需要的值,以空格分割。我这里是这样的:

Arch 维度中有 aarch64 armv7a i686 x86_64 四个值

然后就可以编写对应的构建脚本里,在脚本中维度的名字是个变量。下面是 Freetype2 作业的构建脚本:

./autogen.sh
./configure --host=${arch}-linux-androideabi --prefix=/out-${arch} --without-brotli --without-bzip --without-zlib --with-png=no --with-harfbuzz=no
make
rm -rf $(pwd)/out-${arch}
make install DESTDIR=$(pwd)

成果