2010年12月13日

パケットリピータ「stone」を Android へポーティング

はてなブックマークに登録

オープンソースの多機能パケットリピータソフトウェア「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 プログラムを書く! 」記事の「ビルド環境の作成手順」項などを参照して下さい。
以下、本ソフトウェアのビルドに必要な準備と手順を説明します。

[ダウンロードアーカイブのツリー]

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) 本アーカイブには含まれない

ターゲットである H. のビルドには A.~G. が必要です。
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)
klab_gijutsu2 at 17:34│Comments(4)TrackBack(0)Android | win

トラックバックURL

この記事へのコメント

1. Posted by こざわ   2015年04月25日 23:47
こんにちは、Android上でのstoneを便利に使わせて頂いています。実際に使用しているのはGUI版ですが、Android 5.0になってから以下のエラーで起動できなくなりました。
only position independent executables (PIE) are supported.
ネットでの情報からAndroid.mkに以下のフラグをセットしコンパイルすれば良いことが分かりました。
LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
こちらの記事を頼りに自分でstoneを上のフラグ付きでコンパイルしなおした所、Android 5.0.2上でもコマンドラインでstoneが動くようになりましたのでお知らせいたします。
出来ましたらGUI版の方も更新していただけると有難いです。


2. Posted by tanabe   2015年04月26日 09:08
こざわさん、丁寧なご指摘をありがとうございます。
検証を行った上で対応を検討したいと思います。

3. Posted by tanabe   2015年05月26日 10:08
Google Play ストア上の "stone for Android" のバージョンアップを行い、本記事の内容を最新の状態に更新しました。本件についてのご助言とご協力を頂いた こざわ様 にあらためて御礼申し上げます。
4. Posted by tanabe   2016年02月21日 08:13
本日、Android 6.x への対応を加えた stone for Android 1.0.3 を公開しました。
https://play.google.com/store/apps/details?id=jp.klab.stone
テスト版の動作確認にご協力頂いた<匿名希望>様に謹んで御礼申し上げます。
http://dsas.blog.klab.org/archives/52211448.html#comments

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント