2012年7月22日日曜日

pandaboard ESで4AI.1.4(Android ICS)を動かしてみよう

Omappediaでは4AIというTI OMAP4向けのリリースが行われています。これは本来TIのOMAP4評価ボード向けのリリースであり、pandaboardでは動かすことができません。
ところがしかし!4AI.1.4 OMAP4 Icecream Sandwich Panda Noteというページが突然出現しました。
これはつまり、pandaboardでも動かせるということでしょうか。

今回はUbuntu 12.04(64bit版)と新規入手したpandabaord ESを使って試してみましょう。

環境準備
必要なパッケージのインストールについては、公式サイトに載っているのですが、こちらはまだUbuntu 11.10となっていて情報が古い。
ので、Linaroを参考にする方がよさそうです。

まずは以下のパッケージをまとめてインストールします。
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32z-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils uuid-dev libgl1-mesa-dev

さらに今回はUbuntu 12.04ですので、手順の通り、以下のパッケージもインストール。
$ sudo apt-get install lib32readline5-dev

加えて、今回のpandaboard用ビルドに必要となるパッケージをインストールします。参考はこちら
$ sudo apt-get install gcc-4.4 gcc-4.4-multilib g++-4.4 g++-4.4-multilib

armのツールチェインのインストールについては、下記の手順を例に。
$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package6488/public/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ sudo mkdir -p /opt/toolchains
$ sudo tar jxvf arm-2010q1-202-* -C /opt/toolchains/
/opt/toolchains/arm-2010q1/にインストールされます。

Javaは、以前紹介したこちらの手順でJDK6をインストールしておきます。

repoツールについては以下のようにインストール。
$ mkdir ~/bin -p
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

ソースツリーのダウンロード
こちらの手順に従います。

まずはAndroidソースツリーのダウンロードです。
適当なワーク用ディレクトリ以下にて、
$ mkdir -p 4AI.1.4; cd 4AI.1.4
$ export YOUR_PATH=`pwd`
$ mkdir -p mydroid; cd mydroid
$ export MYDROID=`pwd`
$ repo init -u git://git.omapzoom.org/platform/omapmanifest.git -b 27.x -m RLS4AI.1.4_IcecreamSandwich.xml
$ repo sync
回線によっては半日近くかかりますので、気長に待ちましょう。

続いてはKernel
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/kernel/omap.git kernel/android-3.0
$ cd kernel/android-3.0
$ git checkout d5e6ee8b7b648094892e501b4ee6e2424d59f7d1

続いてはU-boot
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/u-boot.git u-boot
$ cd u-boot
$ git checkout b2f9ce5c0c2747f1af86d26f9cadbc36af9b7da6

続いてはX-loader
$ cd ${YOUR_PATH}
$ git clone git://git.omapzoom.org/repo/x-loader.git x-loader
$ cd x-loader
$ git checkout 835089cdb52288fcf1ca2f14018ae756842be724

パッチあて
4AI.1.4というリリースはTIのOMAP4評価ボード用のソースコードです。そのため、pandaboardで動かすには、パッチをあてる必要があります。
手順の通りgit amでパッチを当てればよいのですが、私は容量削減のために.gitなどはすべて削除してあります。そのためpatchコマンドを使ってあてていきます。

まずはX-loaderへのパッチあて。
$ cd ${YOUR_PATH}/x-loader
$ wget https://gforge.ti.com/gf/download/user/9174/5768/xloaderpanda.patch
$ patch -p1 < xloaderpanda.patch

続いてはU-bootへのパッチあて
$ cd ${YOUR_PATH}/u-boot
$ wget https://gforge.ti.com/gf/download/user/9174/5769/ubootpanda.patch
$ patch -p1 < ubootpanda.patch

続いてはKernelへのパッチあて
$ cd ${YOUR_PATH}/kernel/android-3.0
$ wget https://gforge.ti.com/gf/download/user/9174/5770/kernelpanda1.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5771/kernelpanda2.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5772/kernelpanda3.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5775/kernelpanda4.patch
$ patch -p1 < kernelpanda1.patch
$ patch -p1 < kernelpanda2.patch
$ patch -p1 < kernelpanda3.patch
$ patch -p1 < kernelpanda4.patch

最後はAndroidへのパッチあて。
$ cd ${MYDROID}/device/ti/panda
$ wget https://gforge.ti.com/gf/download/user/9174/5778/devicepanda1.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5779/devicepanda2.patch
$ wget https://gforge.ti.com/gf/download/user/9174/5780/devicepanda3.patch
$ patch -p1 < devicepanda1.patch
$ patch -p1 < devicepanda2.patch
$ patch -p1 < devicepanda3.patch
$ cd ${MYDROID}/device/ti/proprietary-open
$ wget https://gforge.ti.com/gf/download/user/9174/5777/proprietaryopenpanda.patch
$ patch -p1 < proprietaryopenpanda.patch
$ cd ${MYDROID}/device/ti/common-open
$ wget https://gforge.ti.com/gf/download/user/9174/5776/commonopenpanda.patch
$ patch -p1 < commonopenpanda.patch

ビルド手順を試していて手順通りではビルドが通らないという不都合があったので、下記パッチを当てます。コピペしてpanda_defconfig.patchという名前で保存しましょう。
--- a/kernel/android-3.0/arch/arm/configs/panda_defconfig
+++ b/kernel/android-3.0/arch/arm/configs/panda_defconfig
@@ -325,16 +325,16 @@ CONFIG_SND_OMAP_SOC_SDP4430=y
 CONFIG_SND_OMAP_SOC_OMAP4_HDMI=y
 CONFIG_SND_OMAP4_ABE_USE_ALT_FW=y
 # wl12xx support
-CONFIG_CFG80211=y
+CONFIG_CFG80211=m
 CONFIG_NL80211_TESTMODE=y
 CONFIG_LIB80211=y
-CONFIG_MAC80211=y
+CONFIG_MAC80211=m
 CONFIG_MAC80211_LEDS=y
 CONFIG_MAC80211_DEBUGFS=y
 CONFIG_USB_ZD1201=y
-CONFIG_WL12XX_MENU=y
-CONFIG_WL12XX=y
-CONFIG_WL12XX_SDIO=y
+CONFIG_WL12XX_MENU=m
+CONFIG_WL12XX=m
+CONFIG_WL12XX_SDIO=m
 CONFIG_CRYPTO_PCBC=y
 CONFIG_CRYPTO_MD4=y
 CONFIG_CRYPTO_MICHAEL_MIC=y
panda_defconfig.patchをあてる。
$ cd ${YOUR_PATH}
$ patch -p1 < panda_defconfig.patch

さらに.gitを消している場合ではビルドに失敗してしまうので下記のパッチも当てます。
当てます。 compat_driver_wl12xx.patchという名前で保存しましょう。
--- a/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/Makefile
+++ b/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/Makefile
@@ -7,8 +7,8 @@ define filechk_version.h
                        "$(shell git describe --dirty)";')
 endef
 
-$(obj)/version.h: .git/HEAD .git/index .git/refs/tags
-       @$(call filechk,version.h)
+#$(obj)/version.h: .git/HEAD .git/index .git/refs/tags
+#      @$(call filechk,version.h)
 
 $(obj)/main.c: $(src)/version.h
 
--- /dev/null
+++ b/mydroid/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/version.h
@@ -0,0 +1,2 @@
+static const char *wl12xx_timestamp = __TIMESTAMP__;
+static const char *wl12xx_git_head = "BETA_01202012_01-1407-gd5e6ee8-dirty";
compat_driver_wl12xx.patchあて。
$ cd ${YOUR_PATH}
$ patch -p1 < compat_driver_wl12xx.patch

ビルド
あとはビルド手順通りに実行すればいいわけですが、修正して再ビルドをかけるときなどで毎回コマンドを手打ちするのは面倒です。というわけでスクリプトを書きましょう。(単なるコピペですが。)

まずは環境変数のセット。下記をbuildenvというファイル名で保存しましょう。
#common
export YOUR_PATH=`pwd`
export PATH=$PATH:/opt/toolchains/arm-2010q1/bin
export MYDROID=${YOUR_PATH}/mydroid
mkdir -p $MYDROID/logs
export CROSS_COMPILE=arm-none-linux-gnueabi-
export PATH=${YOUR_PATH}/u-boot/tools:$PATH

#for WLAN Driver
export KERNEL_DIR=${YOUR_PATH}/kernel/android-3.0
export KLIB=${KERNEL_DIR}
export KLIB_BUILD=${KERNEL_DIR}

#for SGX Driver
export KERNELDIR=${YOUR_PATH}/kernel/android-3.0
X-loaderのビルドを行うbuild_xloader.shです。
#!/bin/bash

. buildenv

cd ${YOUR_PATH}/x-loader
make distclean 
make ARCH=arm omap44XXpanda_config
make ift 2>&1 |tee $MYDROID/logs/x-loader_make.out

U-bootのビルドを行うbuild_uboot.shです。
#!/bin/bash

. buildenv

cd ${YOUR_PATH}/u-boot
make distclean
make ARCH=arm omap44XXpanda_config
make 2>&1 |tee $MYDROID/logs/u-boot_make.out

KernelとModuleのビルドを行うbuild_kernel.shです。
#!/bin/bash

. buildenv

cd ${YOUR_PATH}/kernel/android-3.0
#make ARCH=arm distclean
make ARCH=arm panda_defconfig
make ARCH=arm uImage 2>&1 |tee $MYDROID/logs/kernel_make.out
make ARCH=arm modules 2>&1 |tee $MYDROID/logs/kernel_modules.out

WLAN Driverのビルドを行うbuild_wlan_driver.shです。
#!/bin/bash

. buildenv

cd $MYDROID/hardware/ti/wlan/mac80211/compat
make ARCH=arm 2>&1 |tee $MYDROID/logs/wlan_driver_make.out

Androidのビルドを行うbuild_android.shです。
#!/bin/bash

. buildenv

cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng
#make clean ;#(required for rebuild only)
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4 -j4 2>&1 |tee $MYDROID/logs/android_make.out

OMAP4に搭載されているGraphicアクセラレータ用のSGX Driverをビルドするbuild_sgx_driver.shです。
#!/bin/bash

. buildenv

cd $MYDROID
source build/envsetup.sh
lunch full_panda-eng

cd $MYDROID/device/ti/proprietary-open/omap4/sgx/src/eurasia_km/eurasiacon/build/linux2/omap4430_android
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- TARGET_PRODUCT="blaze_tablet" BUILD=release TARGET_SGX=540 PLATFORM_VERSION=4.0
最後は、書き込むイメージを一か所にまとめるbuild_img.shです。
#!/bin/bash

. buildenv

#Preparing Android binaries
export BOARD_TYPE="panda"

cd $MYDROID/out/target/product/$BOARD_TYPE
mkdir -p system/lib/modules
cp $MYDROID/hardware/ti/wlan/mac80211/compat/compat/compat.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/net/wireless/cfg80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/net/mac80211/mac80211.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/wl12xx.ko system/lib/modules/
cp $MYDROID/hardware/ti/wlan/mac80211/compat/drivers/net/wireless/wl12xx/wl12xx_sdio.ko system/lib/modules/

cp $MYDROID/out/target/product/$BOARD_TYPE/target/kbuild/omaplfb_sgx540_120.ko system/lib/modules/
cp $MYDROID/out/target/product/$BOARD_TYPE/target/kbuild/pvrsrvkm_sgx540_120.ko system/lib/modules/

#Preparing images
cd $YOUR_PATH
mkdir -p omap4_sd_files_$BOARD_TYPE
cd omap4_sd_files_$BOARD_TYPE
cp -f $MYDROID/out/host/linux-x86/bin/fastboot .
cp -f $MYDROID/out/host/linux-x86/bin/mkbootimg .
cp -f $MYDROID/out/host/linux-x86/bin/simg2img .
cp -f $MYDROID/out/host/linux-x86/bin/make_ext4fs .

cp -f ${YOUR_PATH}/x-loader/MLO .
cp -f ${YOUR_PATH}/u-boot/u-boot.bin .
cp -f ${YOUR_PATH}/kernel/android-3.0/arch/arm/boot/zImage .

#Creating img files 
cd ${MYDROID}
find out/target/product/$BOARD_TYPE -name *.img -exec rm -f {} \;  
source build/envsetup.sh
lunch full_panda-eng
make HOST_CC=gcc-4.4 HOST_CXX=g++-4.4 HOST_CPP=cpp-4.4
cp -f ${MYDROID}/out/target/product/$BOARD_TYPE/*.img $YOUR_PATH/omap4_sd_files_$BOARD_TYPE

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
$MYDROID/device/ti/support-tools/boot/omap4/umulti2.sh

cd $YOUR_PATH/omap4_sd_files_$BOARD_TYPE
dd if=/dev/zero of=./cache.img bs=1048510 count=128
mkfs.ext4 -F cache.img -L cache

各シェルスクリプトには実行権限を与えておきましょう。下記のように実行します。
$ cd ${YOUR_PATH}
$ ./build_xloader.sh
$ ./build_uboot.sh
$ ./build_kernel.sh
$ ./build_wlan_driver.sh
$ ./build_android.sh
$ ./build_sgx_driver.sh
$ ./build_img.sh

SDカードへのAndroidブートイメージ書き込み
まだAndroidを起動できるSDカードを持っていない場合には、以下の2段階手順で書き換える必要があります。すでにAndroidが起動できるSDカードを持っている場合は、1段階目は飛ばしてOKです。

1段階目は、ブートローダが起動できるSDカードの作成手順です。

こちらのサイトで説明されているomap3-mkcard.shを開いて、テキストファイルに貼り付けます。
(※そのままダウンロードしてしまうと、HTMLファイルとなっているので、実行できません。)

UbuntuにSDカードを差して、omap3-mkcard.shに実行権限を与えておいた上で、
$ sudo ./omap3-mkcard.sh /dev/sdb
※/dev/sdbの部分はUbuntu上で認識されているSDカードのデバイスファイルを指定

SDカードのフォーマットが成功したら、いったんSDカードを抜き差しし、Ubuntuのファイルブラウザで認識させます。
下記で、ブートローダをbootパーティションに書き込みます。
$ cd ${YOUR_PATH}/omap4_sd_files_panda
$ cp MLO /media/boot/
$ cp u-boot.bin /media/boot/

書き込みが完了したら、SDカードをアンマウントしてUbuntuからは外し、pandaboard ESに差して電源を入れます。(シリアルコンソールで確認するのが良いですが、自動でfastbootモードに移行するはずです。)
pandaboard ESとUbuntuとをminiUSBケーブルで接続して下記コマンドをたたきます。
$ cd ${YOUR_PATH}/omap4_sd_files_panda
$ sudo ./fastboot oem format
$ sudo ./fastboot flash xloader MLO
$ sudo ./fastboot flash bootloader u-boot.bin
$ sudo ./fastboot reboot
これにより、SDカードがAndroid用にフォーマットされ、ブートローダのみが書き込まれた状態となります。

2段階目がこちらからです。
上記の最後のコマンドでリブートし、再びfastbootモードに入っているはずです。入ってなさそうであれば、いったん電源を切って、再度電源を入れなおしましょう。
※なお、2回目以降の書き換えでは、何もしないとKerneが起動してしまうので、シリアルコンソールでu-boot起動時に何かキーを押して止めるという手順が必要です。

pandaboard ESとUbuntuとをminiUSBケーブルで接続した状態で。
$ sudo ./fastboot flash boot boot.img
$ sudo ./fastboot flash system system.img
$ sudo ./fastboot flash cache cache.img
$ sudo ./fastboot flash userdata userdata.img
$ sudo ./fastboot reboot

これでAndroidが起動してくるはずです。以降、SDカードを差して電源を入れればAndroidが起動します。



壁紙がエラーなく表示できることがLinaroとの違いでしょうか。
しかし、これは、WiFiもBluetoothも起動しない...
まあ、また次回見ていきましょう。

2012年7月20日金曜日

UbuntuでJavaコントロールパネルの日本語文字化けを何とかする

さて先日、Ubuntu 10.10にJDKをインストールできたわけなんですが、
おもむろに、
$ /usr/lib/jvm/java-6-oracle/bin/ControlPanel
でJavaコントロールパネルなんかを開いてみると日本語が文字化けしとるやないか!


まあ実際、Javaコントロールパネルはどうでもいいのですが、最近私が使っている"Process Dashboard"も盛大に日本語が文字化けしておりまして、萎えていたところだったのです。(仕事がはかどらない!)

どうやら"Process Dashboard"の文字化けも、Javaコントロールパネルの文字化けも、日本語フォント設定に不備があることが原因のようです。

というわけで解決策。
$ cd /usr/lib/jvm/java-6-oracle/jre/lib/fonts/
$ sudo mkdir fallback
$ cd fallback
$ sudo ln -s /usr/share/fonts/truetype/takao/Takao* .
何をやっているかというと、javaの代替フォント用フォルダを作成し、そこに日本語TrueTypeフォントへのシンボリックリンクを作成するということ。(実際よくわかってませんが。)
日本語フォントの部分は自分の好きなものに変えてもらってかまわない。

これでもう一度、Javaコントロールパネルを表示させてみると...
見事に文字化けが直っている!
"Process Dashboard"の方も。。。
見事に文字化けが直っている!
これで仕事がはかどりますね!

めでたし、めでたし

(今回は以前にUbuntu 10.10へ手動でインストールしたJDKでの話ですが、他のJavaでも大体一緒だと思います。)


2012年7月16日月曜日

Ubuntu 12.04で10.04と同じ操作性(ユーザインタフェース)に変更する

Ubuntu 12.04ではインストールしたての状態だとUnityという今までとは異なる操作性を持ったデスクトップ画面が表示されます。
今後はこれに慣れていこうとは思ったのですが、やはり耐え難いwww
というわけでUbuntu 10.04と同じ操作性を持つGNOME Shellに変えてしまいましょう。

※インストール直後の場合は、まずはパッケージのUpdateをしておきましょう。パッケージが古いとUbuntuソフトウェアセンターに検索窓が付いてなかったりしますので。。。

Ubuntuソフトウェアセンターにて、
"gnome-shell"
を検索します。"GNOME Shell"というパッケージが検索結果に出てきますのでそれをインストールします。

インストール後は再起動を求められますので再起動を行いましょう。

さて、再起動してそのままログインしても元のUnityの画面のままです。
ユーザインタフェースを変えるには、ログイン画面で"GNOME"に変更してやる必要があります。

選択箇所は下図にて。

デフォルトでは"Ubuntu"の選択となっていますので、それを"GNOME"に変更します。
後は通常通りログインしましょう。
最低限の手順ですので、自由にカスタマイズして使いやすくしましょう。

以上。

2012年5月6日日曜日

VMware PlayerでAndroid ICS(インストール編)

前回に続きまして、今回は、x86用Android ICSをVMware Playerの仮想ハードディスクにインストールして起動する方法です。
ハードディスクにインストールすることで、設定やデータが保存できたりと何かと便利です。

では、"新規仮想マシンの作成"からはじめましょう。事前に用意しておくISOは前回と同じくandroid-x86-4.0-RC1-eeepc.isoです。
選択を間違えたりするとうまく起動しない場合があるので、注意して行おう。

まずはじめに、今回はマニュアルで設定を指定していきますので、「後でOSをインストールする」を選択します。

続いて、ゲストOSの選択では「Linux」、バージョンは「他のLinux 2.6.xカーネル」を選択します。

仮想マシンの名前についてはご自由に。

ディスク容量の指定では、とくに何も変更せず「次へ」。(後で正式なものをセットアップします。)

ハードウェアのカスタマイズについては任意に。「完了」で一旦ウィザードを終了します。


続いてVMwarePlayerの画面に戻りますが、すぐに仮想マシンの再生はせずに、"仮想マシン設定の編集"を開き、再度設定の編集を行います。
まずはじめに、先ほどのウィザードにより作成された「ハードディスク(SCSI) 8GB」を「削除」します。(必要ないので)

続いて、ハードウェアの「追加」で「ハードディスク」を選択します。

「仮想ディスクの新規作成」を選択して「次へ」。

ディスクタイプの選択では必ず「IDE」を選択して「次へ」。(デフォルトではSCSIが選択されていますので注意。)

ディスク容量の選択にて、Androidをインストールしたいディスクのサイズを指定します。8GBあれば十分ですので、ここではそのまま8GBとしています。下の選択肢はどちらでも良いです。

ファイル名も任意で「完了」します。

続いて、仮想マシン設定に戻りまして、CD/DVDドライブを選択し、「起動時に接続」にチェックが入っていることを確認し、ISOイメージに選択を変更し、Androidのインストーラディスクである"android-x86-4.0-RC1-eeepc.iso"を選択します。変更を行ったのち、「OK」で設定を閉じます。

以上で設定は完了しましたので、いよいよ仮想マシンの再生です。
ブート選択画面では"Instration ~"を選択しますが、ここでポイントとして「Tab」キーを押してブートオプションの編集を行います。

"android.hardware"のオプションを『generic_x86』(もともとはeeepcとなっている箇所をBSキーで消して入力)。※キーボードの認識が英語配列となっているので、 日本語キーボードで"_"を入力するにはShiftを押しながら"-"キーを押すと入力できます。
ブートオプションを修正したら「Enter」キーでブートを開始します。

まずは、Androidをインストールするためのパーティションを作成する必要がありますので、"Create/Modify partitions"を選択した状態でEnterキーを押し、パーティション編集画面に入ります。

「→」キーで"[New]"を選択しEnter。

"[Primary]"を選択した状態でEnter。

デフォルトで仮想ディスクサイズ全部が指定されますのでEnter。

"[Bootable]"が選択されている状態で一回だけEnter。(Flagに"Boot"と付くことを確認する。)

 パーティションテーブルに書き込んで、編集を確定するため「→」キーで"[Write]"を選択してEnter。

書き込みの確認が表示されるので「yes」とキーボードから入力したのちEnter。

書き込みが完了したら「→」キーで"[Quit]"を選択しEnter。

インストール先として先ほど作成したパーティションであるsda1が選択されているのでEnter。

フォーマットは、Androidの標準である"ext3"を選択してEnter。(fat32では不可でした。)

フォーマットの確認はEnter。

GRUBのインストール確認もEnter。

systemディレクトリを読み書き可能にするかどうかですが、選択はどちらでもよく、Enter。(Yesとしておくほうが何かと便利かも。)

Androidのインストールは以上で完了。"Reboot"を選択すると仮想ハードディスクにインストールしたAndroidが起動します。"Create a fake SD card"でSDカードイメージを作成しておいても良いです。(Enterを押すだけです。その後、Rebootします。)

ブート選択画面ではEnterキーを押すか5秒待つとAndroidのブートに入ります。

サクッとAndroidが起動します。内容としては、Live CDのものとほぼ同じです。

起動を確認したら、"仮想マシンの設定の編集"でISOのマウントを外しておいて良いです。

Android仮想マシンのインターネット接続方法ですが、プリインストールされている「スーパーユーザ」アプリにて、「端末エミュレータ」のスーパーユーザ権限を許可したのち、「端末エミュレータ」アプリを起動し、
$ su
(スーパーユーザアプリで許可を与えておかないと、suは拒否されてしまいます。)
# netcfg eth0 dhcp
# setprop net.dns1 [DNSアドレス]
とすると、DHCPでIPアドレスを自動取得し、VMwareの仮想ネットワークアダプタ経由でホストマシンのインターネット接続を共有してインターネットにアクセスすることができるようになります。
(なぜか、DNSは自動で設定してくれない。)

とりあえず以上です。

2012年5月5日土曜日

VMware PlayerでAndroid ICS(Live CD編)

Android ICSを実機で動かすのもいいのですが、ちょっと画面を見たいだけ、どんなもんかちょっと触ってみたいだけという場合、仮想マシンで動かすのがリーズナブルです。
こちらのプロジェクトでx86用のAndroid(ICS)が公開されていますので、VMware Playerでの動かし方を見てみようと思います。

今回利用するVMware Playerは4.0.3です。これはVMwareから入手してください。(ダウンロード&インストール方法は略です。)

x86用AndroidのLive CDはこちらのページのAndroid-x86-4.0-RC1の"ASUS Eee"(android-x86-4.0-RC1-eeepc.iso)をダウンロードしておきましょう。

では、仮想マシンの作成手順です。
いつもどおり「新規仮想マシンの作成」にて、ウィザードの指示に従って作成していきます。

"インストーラディスクイメージファイル(iso)"にて、先ほどダウンロードしておいたAndroidのLive CDイメージを指定して、「次へ」進みます。

名前は任意に入力し、「次へ」。

仮想ディスク容量の指定ですが、Live CDでは必要ないので適当に入力し(そのままでもOK)、「次へ」。


"ハードウェアをカスタマイズ"はご随意に。「完了」で仮想マシン作成を完了し、仮想マシンを起動します。


仮想マシーンが起動し、ブート選択画面が表示されます。Live CDとして利用する場合にはそのままEnterで起動します。


初期設定ウィザードが表示されますので、適当に済ませるとAndroidのホーム画面が表示されます。




ゲームなどもいくつかプリインストールされています。
以上。サクサク動くのでなかなか面白いですよ。
次回は仮想ディスクへのインストール編に続きます。

Pandaboard AndroidでVNC Server

Pandaboardを動かしていて何が面倒かといえばディスプレイをつながなければならないということではないでしょうか?
はい、というわけで、VNC Serverの出番です。これを導入すると、画面を見るだけでなく、マウス操作などもリモートからコントロールすることができるのです!!

Android上で動作するVNC Serverにも各種あるのですが、色々試した結果、ICS(Android 4.0)という条件で現状利用できるのは、droid-VNC-serverだけのようです。
今回はソースコードからビルドを通しますが、そのためにはAndroidのソースツリーが必要になります。以前ビルドを確認しているAndroid-4.0.4のツリーを使ってみたいと思います。Android自体のビルドはこちらを参照のこと。

まずはソースコードのゲット。
$ mkidr work
$ cd work
$ git clone https://github.com/oNaiPs/droid-VNC-server.git

そのままではビルドが通らないのでfastdroid-vncのソースコードも用意しておきます。
$ cd work
$ wget http://fastdroid-vnc.googlecode.com/files/fastdroid-vnc-1.0.tgz
$ tar xvzf fastdroid-vnc-1.0.tgz
(※なお、こちらでは、VNC Viewerに画面が映りませんのであしからず。ICSではね)

続いて、ビルド手順。
以降、android_404_tracking-pandaがAndroidのソースツリーとして記載します。
まずはREADMEに書かれている通り、サービスのソースコードをAndroidソースツリーのexternal下にコピーします。
$ cp work/droid-VNC-server/droidvncdaemon android_404_tracking-panda/external/

フルビルドを通してもいいのですが、下記のように部分ビルドをする方がお手軽です。
$ cd android_404_tracking-panda
$ . build/envsetup.sh
$ launch pandaboard-eng
(下記が部分ビルドのコマンドです。)
$ TARGET_TOOLS_PREFIX=/opt/android-toolchain-eabi/bin/arm-linux-androideabi- mmm external/droidvncdaemon/

と、すると早速エラーが。。。一個ずつ対処方法を説明していきます。まずは、
external/droidvncdaemon/vnc/libvncserver-kanaka/rfb/rfbproto.h:59:23: error: rfbconfig.h: No such file or directory
ファイルが足りないと言っているわけですが。
このファイルは、
fastdroid-vnc-1.0/LibVNCServer-0.9.7/rfb/rfbconfig.h
にありますので、これをコピーしてやります。
$ cp ~/work/fastdroid-vnc-1.0/LibVNCServer-0.9.7/rfb/rfbconfig.h ~/android_404_tracking-panda/external/droidvncdaemon/vnc/libvncserver-kanaka/rfb/

さらに、includeパスを通しておく必要がありますので、droidvncdaemon/vnc/Android.mkの51行目あたりの下記箇所に一行を追加。
local_c_includes := \
~略~
    $(LOCAL_PATH)/libvncserver-kanaka/rfb \
~略~

で、ビルドを行うと、続いては、
$ TARGET_TOOLS_PREFIX=/opt/android-toolchain-eabi/bin/arm-linux-androideabi- mmm external/droidvncdaemon/
~略~
external/droidvncdaemon/vnc/gralloc_method.c:158: error: 'struct framebuffer_device_t' has no member named 'read'
~略~
そんなメンバーありませんよ!というよくあるエラーですね。これの対処方法は、、、

えーと、現状
android_404_tracking-panda/hardware/libhardware/include/hardware/fb.h
にstruct framebuffer_device_tの定義があります。
あるんですが、read(フレームバッファから画像を取得する)というものはなくなっている。(以前はあったようですが。)
まあ、つまりICSではこの方法ではフレームバッファの描画内容を取得できないということです。

というわけで、該当ソースコードはビルドから外しましょう。
droidvncdaemon/vnc/Android.mkの17行目あたりのgralloc_method.cの行を削除します。
それから、こちらに依存するupdate_screen.cとdroidvncserver.cも関連箇所をコメントアウトします。
(※修正箇所はあとでまとめることにします。)

これでビルドをかけると今度は、
$ TARGET_TOOLS_PREFIX=/opt/android-toolchain-eabi/bin/arm-linux-androideabi- mmm external/droidvncdaemon/
~略~
external/droidvncdaemon/vnc/displaybinder.cpp:40: error: undefined reference to 'android::ScreenshotClient::ScreenshotClient()'
~略~
などのリンカーエラーが発生。
これは、ScreenshotClientのクラス定義が、以前はlibui.soに含まれていたものが現在はlibgui.soに含まれるようになったため、libuiだけをリンクする現在のmakeファイルでは対応できていないせいです。

というわけで、Android.mkにlibguiのライブラリを追加します。

これでビルドを通すと無事にビルドが通ります。out/target/product/pandaboard/system/bin/下にandroidvncserver_froyoとandroidvncserver_gingerupの実行ファイルが出来上がります。
以下、ひとまず、修正差分をまとめます。

droidvncdaemon/vnc/Android.mkの修正 update_screen.cの修正 droidvncserver.cの修正 実行するには。

例えばこちらで作ったpandaboard用のAndroidインストール済みSDカードをPC(Ubuntu)に挿し、出来上がった実行ファイルをコピーしてインストールします。必要なのは、androidvncserver_gingerupの方だけです。
(Ubuntuの場合にはandroidのsystemパーティションが、/media/system/に自動でマウントされます。)
$ sudo cp out/target/product/pandaboard/system/bin/androidvncserver_gingerup /media/system/bin/

これでpandaboardを起動させましょう。

Androidが立ち上がったところで、シリアルコンソールから下記コマンドを実行。※なお、VNCはネットワーク経由でのリモートアクセスですので、事前に有線LANあるいはWiFiを設定し、VNC Viewerをインストールしたマシンと通信できるようにセットしておきます。

(例えば、有線LANを使う場合には、下記コマンドを実行すると、DHCPでIPアドレスを取得します)
# netcfg eth0 dhcp
(取得したIPアドレスの確認)
# netcfg
(androidvncserverの起動)
# androidvncserver_gingerup &

実行時に表示されるメッセージからわかる通り、TCPポート5901でVNC Serverは起動しています。
たとえばUltraVNC Viewerでみる場合には"IPアドレス::5901"で接続します。

以下のような感じで、ばっちりリモートアクセスできてます。レスポンスやフレームレートは少々低いですが、ちょっとした操作をするだけであれば妥協できるレベルかと。

一つ注意点としては、Androidがサスペンド状態に入ると、VNCが切断されてしまいます。
設定メニューからサスペンド(スリープ)までの時間をデフォルトの1分という設定から30分に延長できるのですが、それもどうかという場合には下記コマンドでスリープまでの時間を無限(スリープしない)にできます。(さりげなく、TIPS)

# sqlite3 /data/data/com.android.providers.settings/databases/settings.db 'insert into "system" values(null, "screen_off_timeout",-1);'
※実際にちゃんと機能しているのかどうかあやしいところですが。。。

以上。活用してくれたまえ

2012年5月4日金曜日

pandaboardでLinaro Release 12.04 Androidを試す

前回と同じくコピペ記事です。はい。
詳細はこちらを参照。

はじめに、ビルド済みのイメージをダウンロードです。
wget http://releases.linaro.org/12.04/android/images/panda-ics-gcc47-tilt-tracking-blob/boot.tar.bz2 http://releases.linaro.org/12.04/android/images/panda-ics-gcc47-tilt-tracking-blob/system.tar.bz2 http://releases.linaro.org/12.04/android/images/panda-ics-gcc47-tilt-tracking-blob/userdata.tar.bz2

続いて、書き換えも前回と同様。SDカードを挿してから、
$ sudo linaro-android-media-create --mmc /dev/sdb --dev panda --system system.tar.bz2 --boot boot.tar.bz2 --userdata userdata.tar.bz2
※/dev/sdbの部分は認識されているSDカードのデバイスファイル名にあわせて変更すること

そして、プロプライエタリなライブラリを、下記コマンドで後入れします。
(ちなみに、これを入れない場合、正常にブートしません。Androidロゴのブートアニメーション画面で永久に彷徨うことになります。)
$ wget http://releases.linaro.org/12.04/android/images/panda-ics-gcc47-tilt-tracking-blob/install-binaries.sh
chmod a+x install-binaries.sh
$ ./install-binaries.sh /dev/sdb2
※/dev/sdbの部分はSDカードへの書き込みで使用したデバイスファイル名と合わせる
ダウンロードが始まり、続いてライセンスの表示(Enter)、スペースで条項をスクロールして、同意するか聞かれますので、すかさず "I ACCEPT"と打ってEnterです。

起動させてみますと、



Androidが4.0.4になっていますね。
それ以外は特に変化はなさそう。

というわけで以上。