2012/11/30

XBMC for Androidをビルドする

ため込んだ録画ファイルやNAS上のホームビデオをただ見れればよいではなく快適な操作で快適に視聴する環境であって欲しい。そんな環境が作れないかと日々模索しているところですが、そんな中、
例のXBMCがAndroid単体で動くらしいと知りました。よくあるリモートアプリではなくて本体です。
別にメディアサーバーを稼働させることなく、Android側で動くなら試したいことが沢山あるんです。

XBMC for Androidはどこ?
今はベータバージョンらしく、ソース一式はGITHUBにありますが、GooglePlayにはまだないようです。
なのでソースを入手してビルドするっていうのが正当な手段ということになります。

ビルド済みAPKをダウンロードする

XBMC_for_Android_specific_FAQ によると、オフィシャルではないけど、以下が紹介されています。
実際、code.google.comから入手するのが一番楽ちんだと思います。かなり頻繁にビルドアップデートされてます。
full-neonバージョンの方をmk808にいれて、問題なく動作しました。

使い勝手についてはまた今度
今回は自分でビルドすることがテーマです
ソースからビルドする

数か月前まではAndroid用リポジトリとして分かれていたようですが、現在はメインリポジトリにマージされています。
ビルド手順も丁寧だったので、やってみました。今回はこのビルド手順についてです。
ビルド環境はUbuntuが想定されています。ちょうど地デジ録画システムはUbuntuなので、そこでやってみましたが、あまり考えずにやったため、苦労してしまいました。

結論から言うと、ubuntuはubuntuでも64bit版ではなく、32bit版でビルドする事をお勧めします。


まずは、README.Androidに記載されている手順をつらつらと書いておきます。

ビルドツールインストール
$ sudo apt-get install build-essential default-jdk git curl autoconf unzip zip zlib1g-dev gawk gperf cmake

Android SDK・NDKダウンロード
$ wget http://dl.google.com/android/android-sdk_r21-linux.tgz
$ wget http://www.crystax.net/en/download/android-ndk-r7-crystax-5.beta2-linux-x86.tar.bz2

展開
$ tar zxf android-sdk_r21-linux.tgz
$ tar jxf android-ndk-r7-crystax-5.beta2-linux-x86.tar.bz2

アップデート
$ cd android-sdk-linux/tools
$ ./android update sdk -u -t platform,platform-tool
本家のNDKではなくcrystaxの方を使用します。文字コードの問題のようです。なので現状、NDKとしてのプラットフォームはAPI-14までのようです。

toolchain作成
$ cd android-ndk-r7-crystax-5.beta2/build/tools
$ ./make-standalone-toolchain.sh --ndk-dir=../../ --install-dir=$HOME/android-toolchain/android-14 --platform=android-14

Android 4.0(api14)以上を推奨しているようです。2.3(api9)でも動くようですけど。

鍵(証明書)ファイル作成
keytool -genkey -keystore ~/.android/debug.keystore -v -alias androiddebugkey -dname "CN=Android Debug,O=Android,C=US" -keypass android -storepass android -keyalg RSA -keysize 2048 -validity 10000
最後のビルドでこのファイルを使うようになっているので、この通りにやります。

XBMCソースダウンロード
git clone git://github.com/xbmc/xbmc.git xbmc-android
$ cd xbmc-android
$ git submodule update --init addons/skin.touched

XBMCコンフィグ
$ cd xbmc-android/tools/android/depends/
$ ./bootstrap
$ ./configure --with-sdk=$HOME/android-sdk-linux --with-ndk=$HOME/android-ndk-r7-crystax-5.beta2 --with-tarballs=$HOME/android-tarballs --with-toolchain=$HOME/android-toolchain/android-14

通ったらAndroid用ライブラリとかビルド
$ make -j20
数字はどんだけ並列処理するかという設定。READMEには「make -j20ってやっちゃえよ。平気だよ」と書いてありますが、非力なCPU/小メモリの場合は8以下位にした方が無難かも。一番無難なのはただmakeってやることでしょう。
最後に「Dependencies built successfully.」って出れば正常終了です。

XBMC for Androidのビルド
$ cd xbmc-android
$ make -C tools/android/depends/xbmc
問題なくこのビルドが終了すると、めでたく「 xbmc-android/xbmcapp-armeabi-v7a-debug.apk 」
というAndroidへインストール可能なapkファイルが出来上がります。


ビルド専用VMを作る

お勧めは、Oracle Virtual BoxとかでVMを作って、Ubuntu server 32bit版を入れて、ビルド環境を作るのがいいでしょう。後は、xbmc-android/docs/Android.README通りに実行することで難なくビルド出来るでしょう。
Oracle VirtualBox Download
Ubuntu Server Download (12.10は64bitしかないので、12.04 LTSの32bit版になりますね) 

VMスペックとしては、メモリ1GB、HDD16GB程度あればビルド環境としては大丈夫でしょう。


Ubuntu 64bitでビルドする(むりやり)

私が最初にやったことです。失敗も混ぜながら手順をつらつらと書いておきます。

32ビットライブラリインストール
64bitOSならばia32-libsをインストールせよとなってますが、Ubuntu-11.04の頃の話なのでしょう。
12.04だと
以下のパッケージには満たせない依存関係があります:
ia32-libs : 依存: ia32-libs-multiarch
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
というメッセージが出てインストールできませんでした。

ia32-libsの代わりに32bitライブラリを直接インストールしました。
$ sudo apt-get install libc6:i386 libstdc++6:i386
そして
$ make -j20

makeしたときに、32ビット版ライブラリが揃ってないと意味分からないエラーが色々出る
checking for -gcc... no
configure: WARNING: host was not specified. guessing.
checking for gcc... /home/nishiura/android/toolchain/android-14/arm-linux-androideabi/bin/gcc
configure: error: unsupported host ()
とか。gccあるのに何で動かないんだ?なんて、長い時間悩んでしまいました。

エラーが起きている箇所の一つ
xbmc-android/tools/android/depends/ncurses/armeabi-v7a/config.log
を見てみると
checking whether the C++ compiler works... no
configure: error: in `$HOME/xbmc-android':
configure: error: C++ compiler cannot create executables
See `config.log' for more details
make: *** [../../../..//libxbmc.so] エラー 7
というエラーが。

結局最初に入れたzlib1g-devの32bit版が必要だったようで
$ sudo apt-get install zlib1g-dev:i386
で入れました。が、入れる時に以下のような大惨事に。

@パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libboost-filesystem1.46.1 libtorque2 libboost-date-time1.48-dev libboost-filesystem1.48.0
〜中省略〜
mpi-default-dev openmpi-common libboost-regex1.48.0 libboost-random1.48.0
libstdc++6-4.4-dev
これらを削除するには 'apt-get autoremove' を利用してください。
以下の特別パッケージがインストールされます:
libc6-dev:i386 linux-libc-dev:i386 zlib1g:i386
提案パッケージ:
glibc-doc:i386 manpages-dev:i386
推奨パッケージ:
gcc:i386 c-compiler:i386
以下のパッケージは「削除」されます:
build-essential cpp dpkg-dev g++ gcc gccxml grive libboost-python1.48-dev
libboost1.48-all-dev libtool pentium-builder
以下のパッケージが新たにインストールされます:
libc6-dev:i386 linux-libc-dev:i386 zlib1g:i386 zlib1g-dev:i386
アップグレード: 0 個、新規インストール: 4 個、削除: 11 個、保留: 0 個。
6,180 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,524 kB のディスク容量が消費されます。
続行しますか [Y/n]?@
だって!パッケージマネージャの不具合なんじゃないだろうか・・・入れました!
そしたら、64ビット版のビルドツールが予告通り全部吹っ飛んでしまった!

何もできなくなったので、
$ sudo apt-get install build-essential
で再度インストール。zlib1g-dev:i386は削除されず残るみたい。pentium-builderだとだめみたい。
libncursesもないとだめらしい
$ sudo apt-get install libncurses5
更にこけたときに追加したもの
$ sudo apt-get install libboost-dev

原因を解消して再実行する際は、
$ make distclean
とかできれいにしてから再実行した方がいいようです。

途中こけたときに追加したもの(VM上でのUbuntu(32bit)上では不要だったんですが・・)
$ sudo apt-get install swig

$ make -C tools/android/depends/xbmc のところで
configure: error: C++ compiler cannot create executables
こんなエラーが出たとすると、たぶんxbmc-android/tools/android/dependsでのmakeも失敗していると思われます。
もう一度コンフィグあたりから見直してみましょう。

そんなこんなで何とか64bit環境でもビルドしてAPKファイルを作ることが出来ました。
もう2度とやりませんけど。


おまけ話
今後XBMC for Androidの開発が進むにつれて毎度ビルドに苦労しないためにビルド専用VMを作っておくのはいい方法ではないかと思います。自分はそうしようと思います。
また、XBMCを動かすAndroid端末自体もサーバーになりうるのでネットワークを固定IPにしました。

VMのコンソールで作業するのは辛いです。VMのネットワークをブリッジにして通常のLANの仲間入りをさせます。
ubuntuにはsshを入れて、sshdを動かしておきます。そして愛用のemacsもインストールします。
後は外部のsshターミナルからアクセスして作業する方が快適環境になります。
日本語がちゃんと出る。シェルウインドウサイズを自由に出来る(有料版だと出来そうだけど)。
これだけでもそうやる価値あると思います。

Androidにインストールして起動
起動させると、最初ちょっと待ってからXBMCのロゴが表示されて立ち上がりました。
MK802で動かしたら、パフォーマンスが25fps程度でもたつき感がありましたが、MK808では、60fps出てます。
XBMCから様々な方法(プロトコル)でメディアサーバーへアクセスが出来るので何でもありな感じです。操作感もサクサクでいい感じです。もっともっさりするかと思いました。

とにかく、外部キーボードで完全コントロールできるのがいいです。


課題のビデオリストですが、素の状態だとビデオファイル名がつらつらと並ぶだけなので他のメディアアプリ同様つまらないですが、ここからがXBMCのいいところで、nfoファイルっていうのを用意してあげると読んでくれてタイトルや概要、ジャンルとか設定できるらしいのです。

XBMC使う理由が出来たので、これから勉強です。
このあたりの機能に期待しています。希望通りに出来るかなぁ。

2012/11/23

MediaサーバーとMK808と外部キーボード(R600)


え~すでに価値のある情報ではありませんが、次のステップへの過程という意味で少し。

今MK808でビデオを視聴する環境整備に取り組んでおりますが、まずはUPnP/DLNAとかを考えるのが普通かなと思うので、一般に利用されているメジャーどころをやってみました。

自作地デジ録画サーバー上のビデオファイルをhtml5-videoとしてAndroidブラウザで視聴することはできますが、前記事のように思った結果にはなりませんでした。
今度はメディアサーバー(UPnP/DLNA)を稼働させて、Android(mk808)でメディアクライアントアプリで視聴する手段でやってみます。(結果は見えていたんですが・・・それは後で)

録画サーバー(Ubuntu)で稼働させるメディアサーバー
メジャーどころは、こんなところでしょうか。この中でUbuntuServerに入れられそうなのは、
MediaTomb、TVMOBiLi、uShare ですかね。これ以外は、デスクトップ(GNOME)環境が必要だったりでだめです。XBMCが動けば一番いいなぁと思ってますが、クライアント機能もあり、ディスプレイが必要なので断念。

やはり、お手軽なのは、MediaTomb ですかね。
セットアップについてはこちらで十分なので割愛します。
ビデオファイル保存フォルダをMediaTombにコンテンツ登録してサーバー側終了。

MK808用外部キーボード「Rii mini R600」購入

前記事で購入したキーボード(iPazzPort Mini)は個体差かもしれませんが、無線の有効距離がかなり短かったため、似たような別製品を購入しました。妻には「なぜ同じものを・・?」と呆れぎみ。
しかしその甲斐あってか、かなり離れても安定したマウス操作とキー入力が出来ました。

これもAirMouseなので傾けてマウス操作しますが、片手持ち(縦)のみです。iPazzPortは両手持ち(横)と切り替えが出来るので機能的には劣りますが、その代りクリックボタンだけが大きくなっていてマウス操作だけ評価すれば使いやすいと言えます。
キー入力はチャタリングもほとんどなく無線も安定しているので安心して打てました。キーの大きさも微妙ですが大きめなのでタイプミスも減るかと思われます。

リビングでソファーにねっころがって操作したいという要望にはこのコントローラで良さそうです。

視聴アプリ(UPnP/DLNAクライアント)

TVに繋いだMK808上で動かす視聴アプリを探すと沢山ありますね。
試したのは、BubbleUPnP、UPnPlay、および勝手に入っていたeHomeMediaCenterです。
どれでも普通にMediaTombからの再生は出来ました。しかし、出来ましたってレベルです。
結局だたのファイルリストから選んで再生ってだけなので、どれがどの番組なのかさっぱりです。

しかも、キーボード操作ではほとんど何もできない。AirMouseでの操作は結構つらいです。

Redmineで構築した視聴システムへブラウザからアクセスしてタイトルや内容、日時とかが分かって、番組検索が出来て、クリックしたら再生っていう流れとは大違いです。分かってはいますがね。

Androidがリブートする

これは大問題なんですが、ファームアップデートしたためなのか原因は不明ですがビデオ再生してからホームボタンクリックとかでアプリを終わらせるとAndroidがリブートしてしまうんです。
どの視聴アプリを使っても同じ現象でした。

視聴環境として選択肢がこれしかないなら、またOS周りの調査から取り組まないとならないでしょうけど、別手段を考えているので、今回の取り組みはこういう結果になったというところまでで手じまいです。

以下、個人的将来展望

やはり、ちゃんと日本語で番組名・内容・録画時間とかがちゃんとサムネイルとともにリスト表示されるようになって、再生はマウス操作なしでキーボード操作だけでコントロールできる環境が欲しいです。

タッチ操作で使いやすくという方向のアプリが主流な中でキーボードで使いやすくという方向のものは要望としては逆行しているんでしょう。でもいずれ来るであろうスマートTV時代でもタッチコントローラより従来通りのキーコントローラの方が受け入れられると思うんですよね。

それが既存ソフトの組み合わせで出来るならそれが一番です。まずはそういった模索をして、なさそうなら視聴アプリ作りますかね。

2012/11/17

MK808でadbが出来るまでの長い道のり

前回記事で書いた通り、MK808で色々遊んでみようと思い、いつも通りデスクトップにUSB接続して、自作アプリをインストールテストしようと思っていたんです。ところがどっこい、長い道のりでした。

まず、adbとは、Android Debug Bridgeという開発用便利ツールでして、Androidに色々アプリを入れなくてもPCからリモートで色んな操作が出来ます。adbはUSBまたはネットワーク越しでリモート操作が出来ます。
このUSBで接続ってところの話です。Android端末は数種類扱ってますが、今回は苦労しました。

ドライバセットアップ

Macだとこんなことしないでいいんですが、Windowsだと普通にUSB接続してもドライバがないと言われるんで、ハイハイってことで色々やります。まずは、Android SDKをダウンロードします。その中に、google-usb_driverというフォルダがあります。これを入れてやれば通常動きます。

が、このドライバのinfファイルにはNexus用の記述しか書かれていません。なので自分のMK808でインスール出来るように、android_winusb.infというドライバ記述ファイルに、以下のように書き加えます。
[Google.NTamd64]
;MK808
%SingleAdbInterface%     = USB_Install, USB\VID_2207&PID_0006&REV_0222
%CompositeAdbInterface%  = USB_Install, USB\VID_2207&PID_0006
USB_Install, 以降のコードは、デバイスマネージャで不明なデバイスとして認識されているデバイスのプロパティの詳細タブからプロパティ=デバイスIDを選ぶと表示される文字列です。
自分のWindowsは64Bitなのでamd64側にだけ書き加えました。

で、ドライバの更新でこのドライバフォルダを指定してやればインストールされます。
コンソールから
$ adb kill-server
$ adb usb
$ adb devices
ってやれば大体どんなAndroidでも接続できるもんです。もんです。あれ?
端末の方では、「USBデバッグが接続されました」と「USB接続」がちゃんと出ている。USBストレージをONにしてみる。ふむ。ちゃんとデスクトップでストレージマウント出来る。

adbだけが出来ない

マックでやってみた。同じ状態・・・
セルフパワーUSBハブかましてみた。駄目だった・・・
OTG側と電源用USBのさす順番変えたり、どっちかだけにしたり。変わらず・・・
ネット上探しても同じ状況の書き込みは見当たらない。微妙な不良品をゲットしてしまったか。

apk入れるだけなら別手段は色々ある。がっつり開発用ではないし。

microSD経由で入れる。
AirDroidとかサーバークライアント系のアプリ使って入れる。
Webサーバー上に置いておいてダウンロードして入れる。

とまあどんな方法でも入れることは出来るんで割り切ってもよかったんですが、心残りが出来るのも事実。次の手を考えます。

adb tcpip でいいか

冷静に考えれば、この端末はリビングTVに繋いで使うつもりなので、そもそもUSBでPCに接続するシチュエーションはめったにない。Wifi通して操作する方が合っています。

普通、Wifi経由のadbは以下の手順でできます。
  1. 一度USB接続して認識させる
  2. $ adb tcpip 5555 ってやってadbをusbからtcpipに切り替える。ポートも指定する。
  3. USBを抜く
  4. $ adb connect {device-ip-addr} ってやる。接続される。
Android側にadb-wifi切り替えアプリとか入れずとも、こんな感じでできますね。接続が切れてたら4だけやれば再接続されます。駄目だったら1からやり直します。

よく、adb connect {ip-addr}:5555ってやれって書いてあるけど、本当ですかね。
:5555:5555ってなって、失敗しますよね。:5555はいらないんじゃないかな。

普通はこれでいけるんですが、今回は最初のUSB接続で認識が出来ません。そのために、やはりAndroid側にWifiでADB出来るようにするアプリ使う必要があります。その手のものは沢山ありますね。でも大体どれもがルート権限が必要なのです!

自分のMK808はルート化されていなかったので

この辺でもう何だかなぁという気分ですが、始めてしまったので最後までやります。
ルート化されているFirmイメージを探しました。見つけました。
http://tabletrepublic.com/forum/downloads.php?do=file&id=164
他にもいくつか見つけましたが、どれもダウンロードするためにアカウント登録が必要だったり有料ダウンロードだったり・・・この手のものはそういう世界なので安全手軽なものを見つけるのは一苦労です。このファイルも突然別のところに移動するかもしれません。

ここからダウンロードしたrarパッケージはとてもいいですね。RKBatchToolと必要なドライバとフラッシュイメージがセットで入っていました。

沢山のネット記事で説明されている通り、リセットボタン押しながらUSB接続! 無反応・・・
はぁ。これもだめですか。普通はデバイスが認識されてドライバを入れる手順に進むのに。

microSDでアップデート

仕方がないので別手段です。USBストレージマウントはできるので、rarパッケージに入っているフラッシュイメージファイルを”update.img"という名前でmicroSDのルートにコピーします。(このパッケージのイメージファイルは最初からupdate.imgになってました)
Android側のストレージマウントをOffにします。するとその瞬間に、ファームイメージ見つけたけどインストールする?ってAndroidが聞いてきくるので、インストールします。

この方法は外部ツールいらずでお手軽&安全です。アプリや設定は保存されたままシステムだけアップデートされます。逆に言えばクリーンインストールは出来ません。

再度リセット押しながらUSB接続してみたら、今度はちゃんとPCが認識したので、改めてRKBachTool使ってクリーンインストールしました。単に気持ちの問題です。

これでルート化されたので、やっとルート権限が必要なアプリが実行できます。
だいぶ遠回りした気分ですが、これでtcpip経由でのadbが無事機能するようになりました。

eHomeMediaCenter・・・(余談です)

ファームアップデートしたらこんなアプリが入っていました。試しに動かしたらWindowsのメディアセンターやらマックにためしに入れていたTVMOBiLiとかがスパッと表示されてびっくり。
ビデオプレーヤーアプリ作る前に、ちょっとこっち方面をやってみようかな。