小ネタ 2009-016

Android実機上でLinuxのネイティブバイナリを動かしてみる


今年(2009年)の1月に、GoogleのAndroid Dev Phone 1を入手して色々と試しに使ってみた。

Linuxのネイティブバイナリが動かせるらしいとのことで、実際に試してみた。一応、その記録など。(2009-06-14)


1. 準備

用意するもの
 ・Android Dev Phone 1 ・・・ ファームウェアはHTCのサイトで配布しているAndroid 1.5ファームウェアにアップデート済み
 ・玄人志向の玄箱Kurobox-Proと、Debian lenny ・・・ Kurobox-proにDebian Linuxをインストール
 ・Windows PCと、Android SDK ・・・ Android SDKをWindows PCにインストール


(1) Android Dev Phone 1
 ファームウェア1.0から1.5にアップデートした。
 アップデートの手順は、このあたりを参考にした。
 アップデートに使ったファームウェアは、HTCのサイトで配布されているファイルを使った。
 


(2) 玄人志向の玄箱Kurobox-Pro
 Kurobox-ProにDebian Linux 5.0 Lennyをインストールした。ネイティブのコンパイラの動作環境として使うためである。
 インストールの手順は、こことかここを参考にした。
 インストールに使ったインストーラーは、debianのサイトで公式配布されているファイルを一部の書き換えて使った。
 書き換えたのはconfig-debianの最初の部分のext2/ext3の書き換えのみ。
 
 インストール用にシリアルインターフェースを自作して用いた。部品はFT232キットを使った。
 
 Debian Linuxを起動し、いくつか初期設定する。
 
 ちなみにインストールしたDebianのバーションは、uname -aコマンドでの表示させると、
 Linux debian 2.6.26-2-orion5x #1 Fri May 29 21:59:23 UTC 2009 armv5tel GNU/Linux
 となる。
 
 gccが入っていないので、
 apt-get install gcc binutils make
 とコマンド入力し、インストールした。
 
 gccのバージョンは、gcc -vコマンドで表示させると、
 gcc version 4.3.2 (Debian 4.3.2-1.1)
 となる。
 
 あと、Sambaの設定を直して、Windowsマシンから簡単にファイルを出し入れできるようにPublicの設定をした。


(3) Android SDK
 USBでAndroid Dev Phone 1と接続するためのドライバをPC(Windows)にインストールし、
 adb.exeというadbコマンド(Android Debug Bridgeコマンド)をSDKから取り出しておく。




2. Kurobox-ProのDebian Linux上でビルド

 Kurobox-Proにシリアルコンソールでログインして作業した。SSHでログインしてもよい。
 以下のコマンド入力で、簡単なテスト用のソースコードtest.cをコンパイルした。
 # gcc test.c -static -o test_static
 これにより、staticリンクされたARM用のバイナリtest_staticが生成される。
 test_staticはkuroboxからPCに取り出しておく。
 
 [ test_staticバイナリ (download) 248KB ]




3. バイナリをAndroid Dev Phone 1 にインストール

 Android SDKのadbコマンドでadb shellとして、Android Dev Phone 1のリモートシェルを起動し、
 suコマンドを入力したあと、
 chmod 777 /data
 とコマンド入力し、Android Dev Phone 1の/dataフォルダのパーミッションを一時的に変更する。
 
 
 次に、
 adb push test_static /data
 とコマンド入力して、kuroboxで作ったtest_staticファイルを/dataに転送する。
 
 
 次に、再度shellを起動して、suコマンドを入力したあと、
 chmod 777 /data/test_static
 とコマンド入力して、test_staticファイルのパーミッションを変更する。
 




4. 実行

 Android Dev Phone 1の実機のTerminal Emulatorアプリを起動し、
 /data/test_static
 と入力し、先ほど作成したネイティブバイナリを実行する。
 

 実行できることが確認できた。

 いろいろとビルドしてインストールすると、Linux-Zaurus的なLinuxマシンとして便利になりそう。


 (後日加筆 2009-08-30)
 suコマンドをインストールしてみた。



GDDフォンについて (2009-06-17)

 先週、2009-06-09にGoogleの開発者向けイベント「Google Developer Day 2009」があり、参加者全員に無料で開発用Androidケータイが配られたそうだ。自分は行けなかったので、貰いそびれた。

 この開発用ケータイは、GDDフォンと呼ばれ、HTC製で型番無しとのこと。
 Android Dev Phone 1に自分でインストールしたAndroid 1.5は日本語が使えないのだが、GDDフォンはちゃんと日本語が使えるようだ。

 開発者向けケータイなので、たぶんAndroid Dev Phone 1と同様に、上記のネイティブバイナリの実行も可能だと思われる。




Android NDK (Native Development Kit)について (2009-06-27)

 2009-06-25に、Googleの純正のネイティブ開発キットが公開された。
 「Google、Android 1.5 NDK提供開始、ネイティブアプリの作成が可能に」という記事で知った。
 バイナリのモジュールをJavaアプリのパッケージに組み込んで、Javaからネイティブの関数を呼び出して使うことができるようだ。

 Java抜きの単体のコンソールアプリを作るのにも使えるのだろうか?



 (後日加筆 2009-07-20)
 Android NDKの中に含まれているARM-EABI版gccを少し動かしてみた。

 ホームディレクトリにandroid_ndk_1.5r1を置いて、以下のコマンドでコンパイルできるか試してみた。(ソースコードは上記のtest.cを使った。)

 % android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gcc.exe -Iandroid-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/include -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D___ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM__ARCH_5TE__ -DANDROID -DDEBUG -MMD -MP -g -O2 test.c -o test

 ldがcrt0.oが見つからないというエラー出して止まった。
 コンパイルはできたが、リンクで失敗したようだ。
 ライブラリのディレクトリを指定していないせいなのだが、crt0.oはAndroid NDKのディレクトリ内に存在していない。

 代わりにcrt??.oみたいなのがあったので、それをリンクしてやれば動くのだろうか?




x86 Android のLiveCD/LiveUSB

 Android OSは、ARM版以外にPCで起動できるようにx86版のビルドが試みられている。
 x86版は当初はEeePC向けに開発されていたそうだ。
 一般のPCで起動できるように移植が進められて、LiveCD版やliveUSB版などが開発されている。
 こことか、こことか、ここでビルド済みイメージが配布されている。

 EeePCで起動してみようと試みたのだが、起動できなかった。
 とりあえず、VirtualBoxの仮想環境で起動してみた。

 

 x86版Androidだと、普通のPC版Linux用のバイナリがそのまま動くと思われる。


(後日加筆 2009-08-22)
 日経Linux誌とミラクル・リナックスが共同でビルドしたAndroid x86のイメージが配布されている。このUSBメモリ用イメージEeePCで動かしてみた。
 
 EeePC-1000HAを使った。内蔵HDDにはUbuntu Linuxと他のOSを入れてマルチブート環境になっている。USBブートのAndroidだとこの既存環境を壊さずに試すことができる。

 USBメモリは、BUFFALO製の小型のmicroSDを入れるタイプのものを使った。

 配布されているイメージファイルを説明書どおりにUbuntu上でddコマンドでUSBメモリに書き込んだのだが、そのままでは起動時させようとすると途中でブラックアウトしたままフリーズしてしまう。その対策で、Ubuntu上でUSBメモリ内のファイルを修正する必要がある。
 修正は、USBメモリが/media/diskにマウントされているとき、/media/disk/boot/grub/menu.lstというGRUB設定ファイルをここの記事を参考に/dev/sdb1という部分を書き換えて、起動させることができた。
 このGRUB設定の記述部分を、Ubuntuをインストールしてあるパーティションの/boot/grub/menu.lstにも記述し、マルチブートの選択肢に追加することができた。

 SDカードスロットに挿しているSDカードと上記のUSBメモリ用microSDとを入れ替えたりすると/dev/sd?のドライブ割り当てのabc順が変わってしまう。設定を書き直せば起動できるのだが、いちいち書き換えるのも面倒だ。自動でそういうことができないのかなあ?




(後日加筆 2010-11-23)
 Android NDK r4から、コンソールアプリが作成できるようになったそうだ。

 Link - Android NDK で .so ではなく、実行ファイルをつくる




参考Link

Androidでのネイティブ実行 その1 突然消失するかもしれないブログ
AndroidでC言語で書いたネイティブアプリを動かしてみる - daily gimite
Androidアプリ上でネイティブアプリをインストールして動かす - daily gimite
Android NDK で .so ではなく、実行ファイルをつくる




See Also

マイコンボードBeagleBoardでAndroidを動かしてみる
Google Android Dev Phone 1を使ってみる