1. iPerf 简介
iPerf 是什么?无需我多言,官网这条醒目的宣传语,已表达的很简洁、准确,甚至透露着一丝霸气:

iPerf——支持TCP、UDP和SCTP的终极测速工具!
iPerf 官方支持的平台非常全面,包括:Windows、Android、iOS、macOS 和 Linux 的多个发行版本。但遗憾的是,Android 版本提供的是两个开发好的、包含 iPerf 工具的Android应用,可以在谷歌应用商店下载。不像其他平台,提供了单独的 iPerf 可执行程序。
我结合自己的需求,获取源码,用 NDK 交叉编译一个可以在 Android 平台运行的 iPerf 工具。期间确实也遇到了不少的问题,Google 了无数次,也参考了很多其他博客,我将用这篇博客整理记录整个实践过程,方便自己查看,也希望帮助后续探索的朋友避一些坑。
作为学习记录,我这里记录了3种编译方式:传统交叉编译,以及更符合 Android 平台的 ndk-build 和 CMake 编译。实际应用中选择一种合适方式就好。
iPerf 有 iPerf2 和 iPerf3 两个版本,两者区别可以参考官网或其他资料,本博客记录的是移植运行 iPerf3 v3.1.3 的过程。源码下载地址:iPerf - Download iPerf3 and original iPerf pre-compiled binaries。
2. 移植环境
- 移植时间:2020年11月
- iPerf3:iperf-3.1.3-source.tar.gz
- 开发编译平台:macOS 10.14.6
- NDK 版本:ndk-r17c (17.2.4988734),通过 Android Studio 内的 SDK Manager 安装。
3. 传统交叉编译
编译阶段主要包括下面4个步骤:
- 下载源码压缩包,解压后进入源码根目录。
- 配置交叉编译工具链;
- ./configure --prefix=absolutepath/to/install_dir
- make && make install
3.1 本机平台编译测试
在 macOS 或 Linux 平台下,如果执行上面那样写的第1、3、4步,不配置任何额外的参数,编译完成后,在 --prefix 指定的路径 bin 目录下,就已经生成了可以在本机上直接运行的可执行程序,非常简单,有兴趣的读者可以试试。
3.1.1 macOS 可能遇到的问题
- make 过程报错:clang: error: the clang compiler does not support -pg option on versions of OS X 10.9 and later。
解决方法:查看一下 iperf-3.1.3/src 里面的 Makefile 和 Makefile.am 我们可以发现,编译器的 -pg 选项主要是编译 iperf_profile 用到的。至于 iperf_profile 是个啥,给个参考:iPerf Issues #335: What's difference between iperf3_profile and iperf3?。按里面的回答就是,这个东西连很多 iPerf 项目的成员自己都没用过,通常我们也用不上,那我们就可以去掉这个选项。具体操作方式有两种:
- 方式一:直接修改 iperf-3.1.3/src/Makefile,找到 iperf3_profile_CFLAGS 和 iperf3_profile_LDFLAGS 赋值的地方(第613行左右),去掉 -pg 参数,然后直接重新执行 make 命令。
# To fix: "clang: error: the clang compiler does not support -pg option on versions of OS X 10.9 and later" compile error on macOS.
#iperf3_profile_CFLAGS = -pg -g
iperf3_profile_CFLAGS = -g
iperf3_profile_LDADD = libiperf.la
# To fix: "clang: error: the clang compiler does not support -pg option on versions of OS X 10.9 and later" compile error on macOS.
#iperf3_profile_LDFLAGS = -pg -g
iperf3_profile_LDFLAGS = -g
- 方式二:修改 iperf-3.1.3/src/Makefile.in 文件,找到 iperf3_profile_CFLAGS 和 iperf3_profile_LDFLAGS 赋值的地方(第613行左右),去掉 -pg参数,然后执行 ./configure 重新生成 的Makefile,再 make。
3.2 配置交叉编译工具链
根据 NDK 指南,使用 NDK 编译代码有三种方式:ndk-build、CMake、独立工具链。独立工具链方式虽然被标记为已废弃,但非常适合用于编译包含 configure 脚本的开源项目,iPerf3 就非常符合这种情况,所以我这里选择用独立工具链的方式。这一步可以参考 NDK 指南独立工具链的创建工具链章节。为了使用方便,我指定了在 iPerf 源码根目录的 ndk-standalone 目录中存放独立工具链,这个名字和路径可以根据自己需要更改。
cd iperf-3.1.3
$NDK/build/tools/make_standalone_toolchain.py \
--arch arm \
--api 21 \
--install-dir /Users/shenyong/iperf-3.1

9781

被折叠的 条评论
为什么被折叠?



