らくとん倶楽部
ラクトンC10(γ-デカラクトン)とラクトンC11(γ-ウンデカラクトン)の香りに魅了された日々の備忘録

Android用iperfをUbuntu上でクロスコンパイルしてインストールする方法

Android用iperfをUbuntu上でクロスコンパイルしてインストールする方法

pingはネットワーク疎通確認のためのツールですが、スループット確認のためのツールはiperfが事実上の標準になっています。TCPやUDP、様々なトラフィック負荷を容易にかけることが出来るため、ネットワーク技術者に重宝されています。それはモバイルシステム・スマートフォン・携帯電話開発者といえども同じで、Android上で動作するiperfが求められていますが、残念ながらAndroidのsystemディレクトリにiperfは用意されておらず、自前で用意してあげなければなりません。

iperfには「iperf」と「iperf3」の2種類存在する

iperfには大きくわけて2種類のバージョンが存在します。単にiperfと言ったらバージョン2を指します。一方、iperf3というパッケージ(バージョン3)も存在します。Githubで提供されている最新コードは後者のiperf3となっています。

iperf3はある引数を指定するだけでトラフィックの方向を変更することができるなどiperfよりも使い勝手が良くなっています。しかしiperf3はUbuntuにおいてオプションの追加パッケージであり、デフォルトでインストールされているのはiperfである事などから、まだまだiperfの方が主流です。

ここではAndroid用の非GUIアプリ(CUIベース)のiperf実行ファイルをUbuntu上でクロスコンパイルしてビルドする方法を説明します。最後にビルドできたiperfを実際にAndroid上にインストールして実行することろまで解説します。

どのAPIレベルでビルドすればよいのか

基本的に、古いAPIレベルのアプリは新しいAPIレベルのAndroidで動作するので、できるだけ古いAPIレベルのアプリを作成すれば良いのですが、PIE版をサポートしているかどうかの壁がAPIレベル16(Android版数4.1)に存在します。

Androidの版数とサポートしているAPIレベル、およびPIEのサポート状況は以下の通りです。

Android
版数
API
レベル
非PIE版
アプリ
PIE版
アプリ
コードネーム
4.014×Ice Cream Snadwich
4.0.1
4.0.2
4.0.315
4.0.4
4.116Jelly Bean
4.1.1
4.1.2
4.217
4.2.1
4.2.2
4.318
4.3.1
4.419KitKat
4.4.1
4.4.2
4.4.3
4.4.4
4.4W20
4.4W.1
4.4W.2
5.021×Lollipop
5.0.1
5.0.2
5.122
5.1.1
6.023Marshmallow
6.0.1
7.024Nougat
7.125
7.1.1
7.1.2
8.026Oreo
8.127
9.028Pie

全てのパターンに対応しようとなると複数のiperfバイナリファイルを作成する必要があり、管理が煩雑になってしまいます。ところが、PIE版をサポートしていない古いAndroidを無視しても良いのであれば、「APIレベル16のPIE版」さえあれば、それ以降のAndroid端末でも動作する事がわかります。

そこで、ここではAPIレベル16のPIE版のiperfを作成する手順を説明しましょう。

Android用iperfのクロスコンパイル方法

iperf-2.0.5のダウンロード

以下のサイトからiperf-2.0.5のソースコードを任意のフォルダにwgetでダウンロードし、解凍します。

wget https://iperf.fr/download/source/iperf-2.0.5-source.tar.gz
tar -xzvf iperf-2.0.5-source.tar.gz

ちなみにiperfにはiperf-2.0.9などより新しいバージョンのソースがありますが、DEBパッケージの最新版が2.0.5になっており、これらのiperfと版数を合わせるためAndroid側にも2.0.5を用いる事とします。

Android NDK リビジョン10eのダウンロード

Android NDKの最新版だとAPIレベル16のバイナリファイルを作成することができないので、古いリビジョン10eのNDKを用意しましょう。

以下のサイトからAndroid NDK リビジョン10eのソースコードを任意のフォルダにダウンロードし、解凍します。

wget https://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip
unzip android-ndk-r10e-linux-x86_64.zip

(注) 1GB位あるので時間かかります

AndroidToolChainディレクトリの作成

任意の場所にAndroidToolChainという名前のディレクトリを作成します。

mkdir AndroidToolChain

パス設定

以下の3行を/etc/profileに追記し、Android NDKのパスを通します。

export NDK=[パス]/android-ndk-r10e
export NDK_CROSS=[パス]/AndroidToolChain/bin
PATH=$PATH:$NDK:$NDK_CROSS

sourceコマンドを実行して追加したパスを有効化します。

source /etc/profile

AndroidToolChainへのディレクトリ移動

AndroidToolChainディレクトリに移動します。

cd [パス]/AndroidToolChain

AndroidToolChainの構築

以下のコマンドを実行して、AndroidToolChainを構築します。

sudo -E $NDK/build/tools/make-standalone-toolchain.sh --platform=android-16 --arch=arm --install-dir=[パス]/AndroidToolChain/

iperf-2.0.5へのディレクトリ移動

iperf-2.0.5ディレクトリに移動します。

cd [パス]/iperf-2.0.5

config.subおよびconfig.guessの上書き

以下のコマンドを実行してconfig.subとconfig.guessを新しいバージョンのもので上書きして下さい。

cp /usr/share/misc/config.sub .
cp /usr/share/misc/config.guess .

iperf-2.0.5のビルド

さぁこれでようやくiperf-2.0.5をビルドする準備が出来ました。以下のコマンドを実行してビルドを実行します。

make distclean
./configure --host=arm-linux-androideabi CC=arm-linux-androideabi-gcc CXX=arm-linux-androideabi-g++ CFLAGS=-D__ANDROID_API__=16 CXXFLAGS=-D__ANDROID_API__=16 CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -pie -fPIE" LDFLAGS="-march=armv7-a -pie -fPIE"		

(注) make distcleanは初回は不要です。もし実行するとエラーになりますが無視してOKです。

config.hを開き、「#define malloc rpl_malloc」とある行を削除します。

vi config.h

ビルドを続行します。

make

以上の手順で、/srcディレクトリ配下にAndroid用iperfのバイナリファイルが出来あがります。

Android用iperfのインストール方法

インストールといってもインストーラーがあるわけではないので、先ほどビルドしたiperfのバイナリファイルをAndroid上のディレクトリに設置するだけです。ファイル転送にはADB(Android Debug Bridge)を用いましょう。ここではADBの詳しい使用方法は説明しません。

Androidには「/data/local/tmp/」という自由に利用できるディレクトリが用意されているので、ここを使います。

以下のコマンドを実行してiperfをAndroid端末へ転送します。

adb -s デバイスID push iperf /data/local/tmp/

このままではiperfファイルに実行権が無いので、chmodコマンドで実行権限を付与します。一部の古いAndroidでは「chmod a+x」の表現が使用できないので、数値で「777」と指定してあげましょう。

adb -s デバイスID shell chmod 777 /data/local/tmp/iperf

Android用iperfの実行方法

以下のコマンドを実行すればiperfが起動します。トラフィックの方向に合わせてクライアント起動、サーバー起動を使い分けて下さい。

(1) クライアントとして起動する場合

adb -s デバイスID shell /data/local/tmp/iperf -c サーバー側IPアドレス

(2) サーバーとして起動する場合

adb -s デバイスID shell /data/local/tmp/iperf -s

ping

ちなみにpingは最初からAndroidのsystemディレクトリにインストール済なので、iperfのような手動インストールは不要です。

生活にとけこみ、家電機器を便利にするIoT技術。Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。
Amazonで購入 楽天で購入
Amazonで購入 楽天で購入
らくとん
作成日 2019年01月11日 21時21分
更新日 2019年04月25日 00時29分
4262文字
Twitter Facebook はてなブックマーク Pocket
■ 関連記事
らくとん倶楽部らくとん倶楽部
Author: らくとん
Android端末を操作する事ができるadb(Android Debug Bridge)コマンド。実に多くの事ができる便利なコマンドですが、詳細な取扱説明書があるわけでもなく、ただただGoogle検索...