Ubuntu Weekly Recipe

第468回UbuntuにAndroidアプリをインストールする

今回は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]⁠。

おすすめ記事

記事・ニュース一覧