現在開発中のUbuntu Touchでは、Android SDKと同様にPC上で実行可能なエミュレーターを開発者向けに提供する予定です。そこで今回はその「Ubuntu Emulator」を操作する方法について紹介します。
Ubuntu Emulator
Ubuntu Touchは今のところ、スマートフォンやタブレットをメインターゲットにして開発を行っています。このため、これまではNexus 4やNexus 7といったターゲットデバイス上でイメージをインストールし、各種アプリを実行する形で開発を行ってきました。
ただしすべての開発者がUbuntu Touchが動作する実デバイスを持っているとは限りません。そこで上記と並行して、実デバイスを持っていない開発者やテストの自動化のために、エミュレーターも開発が行われていました。2013年6月ぐらいには、Androidエミュレーターベースのものができあがってはいたのですが、Mirへの移行やUbuntu Touchのホスト・ゲストの切り替え、その他もろもろの事情により、より実デバイスに近い形で動作するようになったのは同年11月になってからだったのです。
エミュレーターの開発に目処が立ったことを受けて、イメージの作成や起動を行うGo言語で作成されたヘルパーツールを作成し、同年12月にはUbuntu Server上でエミュレーターを使ったTouchとコアアプリの継続的な機能テストがスタート、2014年1月にはUbuntu Touchのメイン開発プラットフォームが「armhf/x86エミュレーター」と「Nexus 4、Nexus 7 2013」になる旨のアナウンス(日本語記事)も行われています。さらにアプリの翻訳者向けにクイックスタートガイドも公開されました。
これによりAndroidやUbuntu上のマルチアーキテクチャ、クロスコンパイラに詳しくない利用者でも、簡単にUbuntu Touchとそのアプリを試せるようになったのです。ここからは、この「Ubuntu Emulator」のインストール方法やその使い方を説明します。
必要条件
Ubuntu Emulatorを動かすために必要な条件は次のとおりです。
- エミュレーターに512Mバイトのメモリを割り当て可能なこと
- エミュレーターのディスク容量として4Gバイト割り当て可能なこと
- ホスト上でOpenGLが動作可能なこと
後述するように、このエミュレーターはQEMUを用いてARMバイナリをエミュレートする形で実現しています。そのためよりスムーズに動かすためには、できるだけ高速なCPUも必要です。
インストール方法
現在開発中のTrustyであれば、Ubuntu Emulatorのインストールは非常に簡単です[1]。
$ sudo apt-get update
$ sudo apt-get install ubuntu-emulator
Android部分のライセンス上の制約からMultiverseは有効にしておいてください。またAndroid SDKをベースにしたエミュレーターであるため、amd64マシンでもi386版のパッケージがインストールされます。android-tools-adbパッケージによってudevルールが更新される場合は、インストール後の再起動も要求されるでしょう。
CanonicalのDavid Planellaが公開しているクイックスタートガイドでは、Ubuntu 13.10へのインストール方法も記載されています。しかしこれはTrustyのバイナリパッケージをダウンロードしてきてインストールするという方法なので、環境によっては正しく動かない可能性もあります。マシンスペックに余裕があるようなら、この方法よりは仮想マシンにTrustyをインストールして実行する方が良いでしょう。ただしゲスト上で3Dアクセラレーションが有効になっている必要はありますので、たとえばVirtualBoxではGuest Addtionsを導入した環境を用意してください。ホストがTrustyのときと比べてリソースの消費が多くなりますが、もともととても緩慢な動作であるため、そこまで違いは気になりません。
イメージの作成と起動
最初にエミュレーターのイメージを作成します。このコマンドを実行するためには管理者権限が必要です。
$ sudo ubuntu-emulator create testimage
ubuntu-emulatorコマンドのcreateサブコマンドを実行することで、Ubuntu Touchのシステムイメージを提供するサーバから、必要なイメージファイルをダウンロードし、「testimage」という名前のイメージを作成します。オプションを指定しない場合は、devel-proposedの最新版を取得します。イメージのリビジョンやチャンネルを指定したい場合は、「ubuntu-emulator create --help」を参考にオプションを指定してください。
ダウンロードしたファイルは「~/.cache/ubuntuimage」に、作成したイメージファイルは「~/.local/share/ubuntu-emulator」に保存されます。
.cache/ubuntuimages/
├── [4.0K] devel-proposed
│ └── [4.0K] goldfish
│ ├── [ 352] version-158.tar.xz
│ └── [ 490] version-158.tar.xz.asc
└── [4.0K] pool
├── [ 21M] device-e582a2d68a69b37290a090c0c3f716e62f7468f44b0b170112e7ca247eff2101.tar.xz
├── [ 490] device-e582a2d68a69b37290a090c0c3f716e62f7468f44b0b170112e7ca247eff2101.tar.xz.asc
├── [314M] ubuntu-cf45ecab595b5204893fb2ce94eb74295a352e861610b5c3a64043855303bd85.tar.xz
└── [ 490] ubuntu-cf45ecab595b5204893fb2ce94eb74295a352e861610b5c3a64043855303bd85.tar.xz.asc
.local/share/ubuntu-emulator/
└── [4.0K] testimage
├── [ 925] .stamp
├── [5.3M] boot.img
├── [2.3M] ramdisk.img
├── [5.1M] recovery.img
├── [1.3G] sdcard.img
├── [ 48M] system.img
└── [3.0M] ubuntu-kernel
ダウンロードしたファイルのうち、「version-」は使用しているイメージのバージョンなどを保存するメタデータ、「device-」はブート領域やリカバリー領域、デバイスに依存するAndroidのイメージファイルが保存されています。「ubuntu-」がUbuntuのルートファイルシステムそのものです。ここまでは、通常の実機にインストールする時にダウンロードするイメージファイルと同じです。
作成したイメージファイルは、Android Boot Imageだったりただのシステムパーティションだったりします。前者についてはabootimgコマンドで展開できますし、後者はローカルにマウントすることで中身を見ることができます。
Ubuntu Emulatorの起動はrunサブコマンドに作成したイメージ名を指定するだけです。
$ ubuntu-emulator run testimage
(起動ログが表示される)
(マシンのスペックに依存するが5分ぐらいたつとログインプロンプトが表示される)
Ubuntu Trusty Tahr (development branch) ubuntu-phablet ttyS2
ubuntu-phablet login:
PCで起動する場合はarmバイナリをx86上でQEMUを用いてエミュレーションすることになるので、かなり動作が緩慢です。さらに、端末にログインプロンプトが表示されたあとも、各種サービスの立ち上げや、必要なClickパッケージを別途インストールする作業も行われるので、実際には起動完了まで10分から20分ぐらい経過します。
最終的に次のようなウェルカムスクリーンが表示されたら起動完了です[2]。もしログインプロンプトが表示されたものの、暗い画面のままで20分以上たっているようであれば、Unity 8がクラッシュしている可能性があります。「Ctrl-C」で一旦エミュレーターを終了したうえで、再度起動してみてください。
図1 Ubuntu Touchのウェルカムスクリーン
図2 初回起動時は操作ガイドも表示される
操作方法
操作方法は通常のUbuntu Touchとほぼ同じですので、第263回の記事が参考になるでしょう。指のタップやスワイプはマウスのクリックやドラッグで代用できます。とくに設定しなくてもホストのネットワーク経由で外部に接続できるので、Webブラウザを使ってページを表示することも可能です。
デバイスへログイン
エミュレーター起動後に表示されるログインコンソールには、ユーザー名「phablet」、パスワード「phablet」でログインできます。ここからログインすれば普通のUbuntuと同じように操作可能です。ただし、どんな状態でも「Ctrl-C」を入力するとエミュレーターそのものが終了してしまいます。普段「Ctrl-C」をよく使う人は、このコンソールを使わないほうが良いでしょう。
Ubuntu Touchは内部でadbdを起動しているため、普通のAndroidデバイスと同様にadbコマンドで通信できます。たとえば次のコマンドを実行すれば、adbシェルが立ち上がります。
$ adb shell
root@ubuntu-phablet:/#
ただしエミュレーターの起動を繰り返していると、adbでエミュレーターを見つけられなくなることがあるようです。その場合は一度、PCのほうのadbサーバを再起動してください。
$ adb kill-server
$ adb start-server
Ubuntu Touchのイメージには最初からsshサーバがインストールされていますが、Upstartの機能によって自動的な起動が抑制されています。もしsshを使いたいなら、以下のコマンドをコンソールかadbシェルから実行してください。
phablet@ubuntu-phablet:~$ sudo service ssh start
エミュレーター起動時は常にsshサーバも立ち上げたい場合は、自動起動を有効にします。
phablet@ubuntu-phablet:~$ echo | sudo tee /etc/init/ssh.override
外からエミュレーターに接続するにはadbを経由しないといけないので、次のようにポートフォワードしたうえで、アクセスします。
$ adb forward tcp:9999 tcp:22
$ ssh phablet@localhost -p 9999
ちなみにUbuntu Touchの中では、AndroidのいくつかのサービスがLXC上で起動しています。
phablet@ubuntu-phablet:~$ sudo lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART
--------------------------------------------
android RUNNING 10.0.2.15 - NO
phablet@ubuntu-phablet:~$ ps -fe --forest
(中略)
root 506 1 lxc-start -n android -- /init
root 625 506 \_ /init
root 631 625 \_ /sbin/ueventd
root 643 625 \_ /sbin/upstart-property-w
system 645 625 . \_ /system/bin/servicemanag
root 649 625 . \_ /system/bin/debuggerd
radio 650 625 . \_ /system/bin/rild
1019 651 625 \_ /system/bin/drmserver
1013 654 625 \_ /system/bin/mediaserver
1012 655 625 \_ /system/bin/installd
system 657 625 \_ /system/bin/sensorservic
root 658 625 \_ /system/bin/qemud
root 663 625 \_ /system/bin/sh
日本語化
Ubuntu Touchには日本語フォントや翻訳ファイルはインストールされていません。そのためWebブラウザで日本語のページを表示しても、何も表示されないか標準で入っている中国語フォントかDroidフォントで表示されてしまいます。そこで、Ubuntu Touchを日本語化してみましょう。
まずエミュレーターにログインした上で、フォントや翻訳ファイルをapt-getでインストールします[3]。
$ ssh phablet@localhost -p 9999
phablet@ubuntu-phablet:~$ sudo apt-get install fonts-ipaexfont language-pack-{gnome-,}ja-base
phablet@ubuntu-phablet:~$ sudo apt-get purge fonts-arphic-ukai
phablet@ubuntu-phablet:~$ sudo rm /etc/fonts/conf.d/65-droid-sans-fonts.conf
phablet@ubuntu-phablet:~$ sudo fc-cache -fv
中国語フォント(UKaiフォント)パッケージとDroidフォントの設定を削除しているのは、日本語フォントをインストールしただけだと、中国語フォントが優先されてしまうための対応です。この操作でubuntu-touchパッケージも削除されますが、これはただのメタパッケージなので削除されても問題ありません。本来はfontconfigで設定するのが筋なのですが、どうも優先順位がうまく変更できなかったためこのような対応を行いました。
実行後は一度、エミュレーターを再起動してください。起動が完了したら今度はエミュレーターのGUIのほうから、Applications Scopeを選択(画面を左に1回スワイプ)したうえで、「Settings」を選択し、次の画像に従って設定していきます。
図3 Applications ScopeのSettings(Installedの右下)をクリック
図4 しばらく待って表示される「Language & Text」をクリック
図5 「Display Language」を選択したうえで、一番下の「日本語(日本)」を選択して、「Confirm」をクリック[4]
図6 画面下から上へスワイプすると「Back」ボタンが出てくるので前の画面に戻る
タイムゾーンも設定する場合は「Time & Date」を選択したうえで、「UTC/Etc」をクリックして日本の地名を入力します。ただし、この検索部分はイクリメンタル検索で、しかも処理が重いため、入力後実際に表示されるまで時間がかかるので注意してください。
図7 「Japan」だと日本各地の地名がヒットしてしまうので「Tokyo」と入力して選択する
再びエミュレーターを再起動すると、ウェルカムページの日本の時刻が、日本語で表示されるようになっているはずです。
図8 Webブラウザを起動すると、gihyo.jpのような日本語のページも表示できる
ちなみに、日本語入力はいまのところできません。
アプリのインストール
Ubuntu Touchは従来のDebianパッケージとは別に、「Clickパッケージ」と呼ばれるAndroidやiPhoneのようなパッケージ管理システムも備えています。「アプリケーション」に表示される「さらに提案」をタップすると、このClickパッケージの一覧が表示されるので、その中から好きなものがインストールできます。
図9 すでにいろいろなコミュニティベースで開発されたアプリが存在する
図10 Ubuntu Oneアカウントさえあれば「Install」をタップするだけでインストールできる
ただ、このClickパッケージはUbuntu Emulatorの起動時に重くなっている要因の1つで、たびたびDBが落ちて「さらに提案」自体が表示されなくなることがありました。実機だとそこまで酷くはなかったので、ひょっとするとエミュレーターの重さが一番の問題なのかもしれません。
ちなみにClickパッケージをインストールするにはUbuntu Oneのアカウントが必要です。System SettingsのOnline Accountsからあらかじめアカウントを登録しておきましょう。また、パッケージファイルはすべて/opt/click.ubuntu.com/以下に保存されます。
アップグレード
システム設定からのシステムイメージアップグレードにはまだ対応していないようです。ubuntu-emulatorコマンドのcreateサブコマンドを再度実行することで、イメージを置き換えることができます。ただしこの場合は、/userdata(やユーザのホームディレクトリ)に保存されたデータ以外の設定や変更は破棄されます。
PCと同じように、apt-getコマンドでアップグレードすることも可能ですが、Ubuntu Touchとしてはシステムイメージアップグレードのほうをメインにテストしていることと、いくつかのシステムコンポーネントはapt-getではアップグレードできないので、適宜使い分けるようにしてください。