パケットリピータ「stone」を Android へポーティング
当初は個人的に使用することが目的でしたが、原作者の仙石 浩明 (Hiroaki Sengoku) さんの了承のもと、ビルドずみバイナリを含むリソース一式を非正式版として公開します。他のプラットフォームで stone の便宜に馴染んでいる方はお試し下さい。なお、stone 本体の使用方法等についてはこの記事では触れません。公式サイトの解説記事を参照して下さい。
■ Download
(2015年5月 記事を更新)
プロジェクト一式を GitHub へ移動しました。以下のリポジトリを参照して下さい。ビルドずみの実行形式も収めています。
・ https://github.com/mkttanabe/stone-Android-NDK
以下の説明ではこのソフトウェアを「本ソフトウェア」と呼びます
(以下は旧い記事です)
stone version 2.3e for Android
・ PC からダウンロードして下さい
・ 実行形式本体のサイズは 158KB です
・ 以下の説明ではこのソフトウェアを「本ソフトウェア」と呼びます
■ 本ソフトウェアを構成するリソース
本ソフトウェアは下記のオープンソースソフトウェア資産から構成されます。利用に際してはアーカイブに含まれる各ソフトウェアのライセンス規約を遵守して下さい。
・ stone
著作権者:Hiroaki Sengoku
ライセンス:GPL version 2
公式サイト:http://www.gcd.org/sengoku/stone/
・ OpenSSL
著作権者:The OpenSSL Project, Eric Young
ライセンス:OpenSSL License, Original SSLeay License
公式サイト:http://www.openssl.org/
※本ソフトウェアにおいては Android Open Source Project に含まれる
Android 移植版のリソースを使用
・ GNU glibc POSIX 正規表現関数群 (glibc-2.11.3 より)
著作権者:Free Software Foundation, Inc.
ライセンス:LGPL version 2.1 or later
公式サイト:http://www.gnu.org/software/libc/
■ 本ソフトウェアを Android 端末へ導入する方法
本ソフトウェアの実行形式は単独のネイティブバイナリです。Android 端末への導入には、母艦 PC と実機を本体付属の USB ケーブルで接続し Android SDK に含まれる adb ユーティリティを PC 上で実行します。また、母艦が Windows PC の場合は端末用のドライバをインストールしておく必要があります。
すでにこうした Android 用開発環境に馴染んでいる方も多いと思いますが、そうでない方はこの記事などを参考に環境を用意して下さい。一連の手順を簡単にまとめてみます。
※ダウンロードアーカイブ中の「stone-ndk\libs\armeabi\stone」が実行形式です
1. 端末に「ConnectBot」等のターミナルアプリをインストールしておく
2. 端末の [設定]-[アプリケーション]-[開発] の「USBデバッグ」を有効に
3. (Windowsの場合)ドライバをメーカーサイトからダウンロードして PC にインストール
4. Android SDK の zip をダウンロードし PC の適当な場所に展開 ~ tools\ にパスを通す
5. 端末を母艦 PC に USB 接続し PC のシェルから以下を実行
> adb push stone /data/local/tmp (stone バイナリを実機へ転送)
> adb shell (端末へコンソール接続)
$ cd /data/local/tmp
$ chmod 755 stone (実行属性を付与)
$ exit (接続を終了)
6. 端末のターミナルアプリ上で stone を実行

■ 本ソフトウェアをビルドする方法
(2015年5月 記事を更新)
Android 5 以降は PIE (Position-independent executable)形式のバイナリのみのサポートとなり、旧来の非 PIE バイナリの実行は不可となりました。PIE のビルドにはコンパイラ側の対応が必要であるため 2015年5月時点で最新の NDK-r10 を使用して PIE 版、非 PIE 版の両方をビルドできる内容にプロジェクトの構成をあらためました。具体的なビルド方法については前掲の GitHub リポジトリ配下に配置している「memo.txt」を参照して下さい。
Android 5 と PIE の関係についてコメントを寄せて下さった こざわ様 に深謝致します。
(以下は旧い記事です)
本ソフトウェアのビルドには Android NDK および関連するソフトウェアが必要です。
ビルド環境の設定方法については「Android NDK でネイティブ CUI プログラムを書く! 」記事の「ビルド環境の作成手順」項などを参照して下さい。
ターゲットである H. のビルドには A.~G. が必要です。
必要な環境とリソースが揃ったらシェルから下記を実行します。
以下、本ソフトウェアのビルドに必要な準備と手順を説明します。
[ダウンロードアーカイブのツリー]
stone-ndk/
│
├ jni/
│ ├ Android.mk :A. NDK 用 Makefile
│ ├ stone.c :B. stone 本体ソース
│ ├ stone_ndk.c :C. ビルド用ラッパ
│ │
│ ├ regex/ :D. glibc regex 関数ヘッダとソース (glibc-2.11.3 より)
│ └ openssl/ :E. OpenSSL ヘッダ (Android Open Source Projectより) *1
│
├ obj/
│ └ local/
│ └ armeabi/
│ ├(libssl.so) *2 :F. Android 用 OpenSSL 共有ライブラリ
│ └(libcrypto.so) *2 :G. 〃
└ libs/
└ armeabi/
└ stone :H. ビルドずみ stone バイナリ
────
(*1) 「android-cts-2.1_r5」タグつきの 2010-02-05 分 snapshot より抜粋
→ 対応する OpenSSL バージョンは「0.9.8h」
(*2) 本アーカイブには含まれない
D. について
stone の使用する POSIX 正規表現関数は Android 2.2 未満の glibc ではエクスポートされていません。そのため本家のリソースをツリーに含めることで補完しています。
E. について
NDK には OpenSSL 関連のヘッダ・ライブラリがありませんが、Android 1.5~2.1 には OpenSSL 0.9.8h の、2.2 には 0.9.8m の共有ライブラリが含まれています。試してみたところ OpenSSL の両バージョン間には「旧→新」方向での互換性が維持されている様子であるためここでは Android 2.1 用のヘッダ群を使用しています。
F. G. について
上記 E. に対応する F. G. の OpenSSL 共有ライブラリはアーカイブに含めていません。Android Open Source Project の platform/external/openssl をビルドするか、Android SDK エミュレータ環境から adb pull コマンドで牽引するなどしてビルド前にこの位置へ両ライブラリを配置して下さい。
$ cd stone-ndk
$ ndk-build -B (-B はリビルド指定)
ビルドが正常に終われば H. が生成されます。
E.F.G. を差し替えたい場合は実機の OpenSSL ライブラリのバージョンに合わせて下さい。
■ 補足など
- 今のところ手元にある実機は Android 1.6 端末のみのため、他のバージョンでの動作は SDK 付属のエミュレータ環境での起動確認までに留まっています。「△△で動いた!」「△△で動かなかった!」等のフィードバックを歓迎します。
- 冒頭にも書いたとおり本ソフトウェアは stone の非正式版です。お気づきの点があれば本ブログあてにご連絡下さい。
(tanabe)
トラックバックURL
この記事へのコメント
only position independent executables (PIE) are supported.
ネットでの情報からAndroid.mkに以下のフラグをセットしコンパイルすれば良いことが分かりました。
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
こちらの記事を頼りに自分でstoneを上のフラグ付きでコンパイルしなおした所、Android 5.0.2上でもコマンドラインでstoneが動くようになりましたのでお知らせいたします。
出来ましたらGUI版の方も更新していただけると有難いです。
検証を行った上で対応を検討したいと思います。
https://play.google.com/store/apps/details?id=jp.klab.stone
テスト版の動作確認にご協力頂いた<匿名希望>様に謹んで御礼申し上げます。
http://dsas.blog.klab.org/archives/52211448.html#comments