今回はUbuntuデスクトップにAndroidアプリをインストール・起動できるツール「Anbox 」の使い方と仕組みを紹介します。
Anbox:Android in a Box
「Anbox 」はUbuntuを含むLinuxシステム上でAndroidアプリケーションをインストール・起動できるツールです。仕組みは至極単純で、コンテナ技術を使ってAndroid実行環境を用意し、カーネルそのものはホストのカーネルを流用します。Anboxはこのコンテナを操作する管理ツールであり、GUIアプリケーションです。ただし2017年4月時点では「アルファ版のレベル」です。インストールしたシステムへの思わぬ悪影響が発生する可能性もありますので、インストール先にはよくよく注意してください。
さっそくAnboxをインストールしてみましょう。Anboxはインストーラーと本体のそれぞれを個別のsnap パッケージとして提供しています。メジャーなLinuxディストリビューションはたいていの場合snapを使えるはずですが、残念ながらインストーラーはUbuntuを含む一部のディストリビューション にのみ特化した記述になっています。もしUbuntu以外にインストールしたい場合は、インストーラーから必要なソフトウェアを類推し、適宜手動でインストールしてください。なおAndroidのエミュレーターの都合で、amd64アーキテクチャーとARMアーキテクチャーにのみ対応しています。また、今のところNVIDIAやAMDなどのプロプライエタリなグラフィックスドライバー上では動作しないようです。
Ubuntuの場合は次の手順でインストールします。まずはsnapパッケージとして提供されているインストーラーのインストールからです。
$ sudo snap install --classic anbox-installer
anbox-installer 1 from 'morphis' installed
$ snap list
Name Version Rev Developer Notes
anbox-installer 1 10 morphis classic
core 16-2 1577 canonical -
「--classic
」はsnapパッケージからホストのルートファイルシステムへのフルアクセスを許可するオプションです。つまりsnapの機能のひとつである、パッケージ単位のホストシステムからの隔離は行われません。インストーラーはホストにパッケージやカーネルモジュールを追加するため、このような実装になっています。
次にインストーラーを実行します。途中同意画面などが表示されますので、「 I AGREE」と入力してください。
$ anbox-installer
Android in a Box - Installer
IMPORTANT: THIS IS ALPHA LEVEL SOFTWARE. EXPECT INSTABILITY AND
BUGS !!!!!
IMPORTANT: ALSO PLEASE BE AWARE THAT WE DON'T PROVIDE FULL
CONFINEMENT FOR THE SNAP YET !!!!
PLEASE NOTE: This script will require root access on your system
to install all necessary things. It will prompt you to enter your
password when required.
What do you want to do?
1. Install Anbox
2. Uninstall Anbox
Please enter your choice [1-2]:
1
This is the installer for the anbox runtime environment. It will
install certain things on your system to ensure all requirements
are available for anbox to work correctly.
In summary we will install the following things:
* Add the anbox-support ppa ppa:morphis/anbox-support to the
host system
* Install the anbox-modules-dkms deb package from the ppa
which will add kernel modules for ashmem and binder which are
required for the Android container to work.
* Configure binder and ashmem kernel modules to be loaded
automatically on boot.
* Add an upstart job for the current user shibata which will
start the anbox runtime on login.
* Add a X11 session configuration file to allow the system
application launcher (Unity7, Gnome Shell, ..) to find
available Android applications.
Please type 'I AGREE' followed by pressing ENTER to continue
or type anything else to abort:
I AGREE
Starting installation process ...
(中略)
Done!
To ensure all changes made to your system you should now reboot
your system. If you don't do this no Android applications will
show up in the system application launcher.
このインストーラーは次のことを行います。
PPAであるppa:morphis/anbox-support の追加
上記PPAからanbox-modules-dkmsパッケージのインストール
起動時にbinderモジュールとashmemモジュールをロードするように設定(/etc/modules-load.d/anbox.conf
)
上記モジュールが作るデバイスファイルに対するudevルールを追加(/etc/udev/rules.d/99-anbox.rules
)
snap
コマンドでanboxパッケージをedgeチャンネルから「--devmode
」でインストール
Androidアプリケーション用のDesktopファイルディレクトリとして「$HOME/snap/anbox/common/app-data
」を追加(/etc/X11/Xsession.d/68anbox
)
インストール時のユーザーに対して、ログイン時にAnboxセッションマネージャーを起動するように設定($HOME/.config/upstart/anbox.conf
または$HOME/.config/systemd/user/anbox.service
)
注: 上記の各種設定ファイルは将来的にPPAのanbox-commonパッケージからインストールするようになります
Anboxを使うためには、adb
コマンドもあったほうが便利です。というわけで、インストーラーが終了したらあわせてandroid-tools-adb
パッケージもインストールしておきましょう。
$ sudo apt install android-tools-adb
ここまで進めたら、一度再起動してください。
特にサードパーティのカーネルモジュールとDKMSをインストールするため、セキュアブート が使えなくなります。すでにセキュアブートを有効化している環境だと、無効化するためのパスワード設定を行い、再起動時にパスワードを入力することになるので注意してください。ちなみにパスワードの入力は「設定したパスワードのN文字目は?」という問い合わせに複数回回答するタイプです。なおセキュアブート有効な環境だと再起動するまでAnboxを使えません。あらかじめ無効化してからAnboxをインストールするほうがスムーズに設定できます。
BinderはAndroid独自のメッセージングシステムで、ashmemはその名の通りAndroid版の共有メモリです。どちらもAndroid SDKのAPIを経由してアプリケーションが使うために必要ではあるものの、UbuntuのLinuxカーネルには存在しない機能です。
snap版のanboxパッケージは今のところedgeチャンネルにのみ存在します。また、現時点ではもろもろの権限の都合上「--devmode
」を有効化する必要があります。「 --devmode
」は、snapパッケージにおいて本来個別に設定が必要だった「interface」への接続を、自動的に対応するモードです。「 interface」はAndroidアプリにおけるいわゆる「権限」みたいなものだと思ってください。snapパッケージ開発時に、どのような権限を設定する必要があるか不明なときに、「 --devmode
」で起動して/var/log/syslog
にinterfaceへの接続記録を残すといった対応が行われます[1] 。Anboxはまだ開発途上であるため、このオプションを有効化しています。
Anboxアプリケーションマネージャー
Anboxを利用するためには、Anboxアプリケーションマネージャーを起動します。これはAndroidで言うところのドロワーです。起動にはDashでAnboxを検索して実行するだけです。ちなみに「/var/lib/snapd/desktop/applications/anbox_anbox.desktop
」から、/snap/bin/anbox
をオプション付きで実行しているため、その手順を踏めば端末からでも起動できます。
図1 Anboxアプリケーションマネージャー
すでにいくつかのアプリはインストール済みです。ただし当然のことながらGoogleの認証を経ていない環境ですので「Google Play」に相当するストアアプリは存在しません。独自のアプリをインストールしたければ、apkファイルを入手した上でホストシステムから以下のコマンドを実行する必要があります。
$ adb install base.apk
特定のapkファイルの入手方法はいくつか存在します。もしインストール済みのAndroidスマートフォンが存在するのであれば、以下のようにadb
コマンドで取得する方法が一番簡単かもしれません。なお、開発者モードをあらかじめ有効化しておいてください。
$ adb devices
(対象のスマートフォンのデバイスIDを確認する)
$ adb -s デバイスID shell pm list packages
(インストール済みのパッケージリストが表示される)
$ adb -s デバイスID shell pm path パッケージ名
(apkファイルのPATHが表示される)
$ adb -s デバイスID pull apkファイルのPATH
ちなみにapkファイルを入手したからといって必ずAnboxで動くとは限りません。むしろ動かないアプリのほうが多いかもしれません。
他にも「Settings」を起動すれば、Androidのシステム設定アプリが立ち上がります。「 Language and Input」において「日本語」を選択すれば、UIを日本語化することも可能です。一応ソフトウェアキーボードの選択画面もありますが、Anbox上だとうまくソフトウェアキーボードが動かないようです。
FLOSSアプリストア「F-Droid」
「F-Droid 」はFLOSSなAndroidアプリを公開しているアプリストアであり、そのストアアプリです。FLOSSであるということはとどのつまり再配布の自由が保証されているため、このように独自のストアを構築することも可能なのです。
F-Droidアプリをインストールしておけば、Google Playと同じ感覚でアプリを検索・インストールできます。
$ wget https://f-droid.org/FDroid.apk
$ adb install FDroid.apk
図2 F-Droidの起動画面
図3 インストールは「INSTALL」ボタンを押すだけ
インストールしたアプリに対して、Desktopファイルが「$HOME/snap/anbox/common/app-data/applications/anbox/
」に自動生成されます。つまりAnboxアプリケーションマネージャーを起動しなくても、他のUbuntu上のソフトウェアと同じように、Dashから検索・起動できるわけです。このためAnboxへのアプリのインストール方法は特殊ですが、インストールしたあとの起動方法は他のソフトウェアとそこまで違いはなくなります。
Anboxの仕組み
Anbox自体はLXC を使って実装されています。つまりAndroidエミュレーターのルートファイルシステムをコンテナと起動し、その中で諸々のサービスを立ち上げています。anbox
コマンドは、そのコンテナ内部のサービスとのインターフェースとなっているわけです。
LXCそのものはホストにインストールされたLXCではなく、snapパッケージの一部として提供されます。サイズがコンパクトになるようにLXCの多くの機能(主に外部API)を無効化しています。anbox
コマンドの本体はC++で書かれたアプリケーションです。LXCのC++ APIを使ってAndroidコンテナを管理しつつ、qemud などを利用してホストとAndroidコンテナの間の連携を取り持ちます。
この仕組みはUbuntuだからこそ実現できるというものではなく、他のLinuxディストリビューションでも容易に移植できるはずです。実際、Ubuntu Touchの後継となるUBportsの開発者は、将来的なAnboxのサポートを表明 していますし、実際にOnePlus One上では動いているようです[2] 。