Linux Test Project (GitHub首页在此)(以下简称LTP) 包含了Linux内核和内核相关特性的工具集合。该工具的目的是通过把测试自动化引入到Linux内核测试,提高Linux的内核质量。众所周知Android也是Linux Kernel,如果有需要针对Android进行kernel测试,可以考虑使用LTP来进行。这里做一点编译方面的记录。
准备Android NDK交叉编译包
因为我们需要使用NDK在Linux上进行交叉编译,所以必须先配置好NDK才能继续后续编译工作。我使用的NDK版本是r10e(参考下载地址)。注意在Linux上进行交叉编译的方法是通用的,很多其他编译场景也是类似方法(例如在Linux上编译支持Android版本的ffmpeg和x264)
下载NDK后,解压到任意位置(我解压到了/home/xuyu/android-ndk-r10e)
cd 到 android-ndk-r10e/build/tools
执行以下命令,制作独立的交叉编译包:
./make-standalone-toolchain.sh --platform=android-19 --ndk-dir=/home/xuyu/android-ndk-r10e
注意–platform和–ndk-dir需要根据实际情况替换一下。
以下是命令执行的输出,成功后,你会看到已经打包好了交叉编译工具包了。当然,也可以在执行make-standalone-toolchain.sh时,使用–install-path=来指定输出的路径。
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying c++ runtime headers and libraries...
Creating package file: /tmp/ndk-xuyu/arm-linux-androideabi-4.9.tar.bz2
Cleaning up...
Done.
将arm-linux-androideabi-4.9.tar.bz2解压(依次使用bzip2 -d 和 tar -xf)得到文件夹arm-linux-androideabi-4.9。将文件夹放到任意路径下,例如我放到了/home/xuyu/,并将文件夹名字改为了 ndk-toolchains。工具链目录大概长得像这样:
环境变量
为了方便编译,我们先将NDK添加到环境变量中,方法有很多种,诸如可以vim ~/.bashrc,在最后面添加如下几个环境变量:
export PATH=/home/xuyu/ndk-toolchains/bin:$PATH
export SYSROOT=/home/xuyu/ndk-toolchains/sysroot
export CC="/home/xuyu/ndk-toolchains/bin/arm-linux-androideabi-gcc --sysroot=$SYSROOT"
export ANDROID=1
解释一下其中的ANDROID=1:在LTP的INSTALL文档中有一段针对Android用户的说明,摘抄如下:
Specify ANDROID=1 when calling make. Many tests which would otherwise work are currently not built because they share a directory with an incompatible test.
The shell scripts expect /bin/sh to exist, so create a symlink.
意思是有一些测试是不适用于Android的,添加这个选项,会过滤掉这些测试(事实上我发现似乎仍然还有一些测试没有被屏蔽)
准备源码
git clone https://github.com/linux-test-project/ltp.git
源码目录下的INSTALL文件有详细的编译依赖工具清单说明,逐一安装即可。编译步骤很简单,INSTALL中描述的很细致,我就大概列一下:
cd到ltp源码目录下,先执行
make autotools
第二步,进行configure。这一步是关键,我只设定了简单的几个编译参数,如下:
./configure AR=arm-linux-androideabi-ar RANLIB=arm-linux-androideabi-ranlib --host=arm-linux-androideabi --target=arm-linux-androideabi CFLAGS="-static" LDFLAGS="-static"
第三步,执行:
make all
注意:make过程中很可能会出错,因为作者似乎在编写时没有考虑到Android的编译兼容问题,例如我在写此文时,在编译 /testcases/kernel/syscalls/fanotify/fanotify07.c 就发生了错误:
我没有研究解决如何让这个文件编译通过,而是选择直接删除了它……
说句题外话,在翻看LTP的Pull Request时,偶然发现了153这次的Pull Request,一位该项目的Contributor:Steven Jackson也是将某些无法编译、不适用的文件、选项去掉了。
第四步,执行:
make "DESTDIR=$HOME/ltp_output" SKIP_IDCHECK=1 install
耐心等待我们期待已久的LTP输出到指定的路径($HOME/ltp_output)下。
命令执行完成:
我们要的结果:
OK,至此,LTP for Android编译完成。至于LTP本身的使用,不是本文所述内容。