node.js on android

最近流行りのnode.js(と言っても、だいぶん前だが。)をandroidで動かそう。なんとnode.jsは、android1.6であるIS01でも動作した。しかし、そのためには、以下の手順が必要となる。
簡単な手順は以下の通りとなる。

  1. IS01をroot化
  2. qemuを使って、linux on arm 環境を構築
  3. linux on arm 環境で、node.jsをビルド
  4. IS01にnode.jsのバイナリをコピー

IS01をroot化

androidでnode.jsを動作させるためには、今回の手順では、root権限が必要になる。共有ライブラリを置くためにlibディレクトリを作成する必要があるためだ。
今回は、手っ取り早くroot化するために、MobileHackerz再起動日記: au IS01のroot権限を奪取する(ビルド番号01.00.09版)を使用する。
リンク先の手順に沿って、行えば簡単にrootを取ることができる。
注意点としては、

設定→アプリケーション→開発→USBデバッグ
  • ChainsDDのSuperuserをインストールしておく
Android Marketからインストールする
  • 何回もトライする

程度である。

qemuを使って、linux on arm 環境を構築

qemuを使うと、ARM系のCPUをエミュレートして、仮想環境を構築することができる。qemu上にdebianをインストールして、その上でnode.jsをビルドする。すると、ARM系で動作するnode.jsのバイナリが手に入る。

qemuの環境構築は、HugeDomains.com - Shop for over 300,000 Premium Domainsを参考にした。

以下、手順である。私の環境は、ubuntu 10.4である。

qemuのインストール
$ sudo apt-get install qemu qemu-kvm-extras
イメージの取得と実行

手っ取り早くインストール済みのdebianのイメージファイルを取得する。

$ wget http://people.debian.org/~aurel32/qemu/armel/debian_lenny_armel_small.qcow2
$ wget http://people.debian.org/~aurel32/qemu/armel/initrd.img-2.6.26-1-versatile
$ wget http://people.debian.org/~aurel32/qemu/armel/vmlinuz-2.6.26-1-versatile
debian on qemuの実行

以下のコマンドを実行し、qemu上でdebianを起動する。

$ sudo qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.26-1-versatile 
-initrd initrd.img-2.6.26-1-versatile -hda debian_lenny_armel_small.qcow2 
-append "root=/dev/sda1" -m 256 -redir tcp:2222:10.0.2.15:22 -redir tcp:8124::8124

注意点

  • 改行しているが1行で実行する。
  • 「-m 256」と指定してメモリを割り当てる。
  • 「-redir tcp:2222:10.0.2.15:22」を指定して、localhostの2222ポートに対してsshで接続できるようにする。
  • 「-redir tcp:8124::8124」後程、8124でhttpアクセスして確認するのに使用する。

linux on arm 環境で、node.jsをビルド

node.jsのビルド方法は、普段のやり方となんら変わらない。node.jsの複数バージョンを管理してくれるnaveを使っても良いし、ソースコードからそのままビルドしてもよい。ここでは、簡単にソースコードからビルドする手順をメモしておく。

$ sudo apt-get install build-essential libssl-dev curl
$ mkdir tmp
$ cd tmp
$ wget http://nodejs.org/dist/node-v0.3.1.tar.gz
$ tar -xvzf node-v0.3.1.tar.gz
$ cd node-v0.3.1
$ ./configure
$ make
$ sudo make install

V8エンジンのビルドオプションを修正する必要がある。

$ vi node-v0.3.1/deps/v8/SConstruct
# node-v0.3.1の場合、SConstructの128行目あたりの「CCFLAGS」に「'-march=armv5t'」を追加。
    126 'gcc': {
    127     'all': {
    128       'CCFLAGS':      ['$DIALECTFLAGS', '$WARNINGFLAGS', '-march=armv5t'],
    129       'CXXFLAGS':     ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'],
    130     },

Node.jsの実行ファイルと共有ライブラリをtarで固めて、Androidに持っていく。

$ tar pcvf node.tar /usr/local/bin/node /lib/librt* /usr/lib/libssl.so.0.9.8
 /usr/lib/libcrypto.so.0.9.8 /lib/libdl* /usr/lib/libstdc++*
 /lib/libm.so.6 /lib/libm-2.7.so /lib/libgcc_s.so.1 /lib/libpthread*
 /lib/libc.so.6 /lib/libc-2.7.so /lib/ld-linux.so.3 /lib/ld-2.7.so
 /usr/lib/libz.so.1*

Android上のterminalでrootになり、以下のコマンドを実行する。

$ su
# tar xvf node.tar
# /usr/local/bin/node --version
v0.3.1