Saneyan Notes

軌跡を残す

Arch Linux で Cordova を試してみた

最近全く技術的なことを output してないので、今回は Android エミュレータを Arch Linux で立てる記事を書いて肥やしにしました。

なぜ立てることになったのか?

スマホアプリは絶対に書かないぞと思い続けてきたのだが、諸事情によりモバイル向けプロダクトのプロトタイプに通知機能を実装しなくてはいけなくなってしまった。この際、Cordova でアプリを書くとどうなるのかを知りたかったのでまずは Android でデモアプリを動かせるところまでやってみた。ちなみに、地雷を踏みまくる覚悟は...すでにできていたようだ。

準備

まずは community と AUR から Android SDK や OpenJDK など、Cordova のビルドや Androidエミュレータを立てるのに必要なパッケージをインストール。

yaourt -S --noconfirm android-platform android-sdk android-sdk-build-tools android-sdk-platform apache-ant jre7-openjdk jdk7-openjdk nodejs

次に NPM で cordova をインストール。

npm install -g cordova

Androidツール群が利用できるように PATH に以下のパスを追加。これは Bash 使ってたら ~/.bash_profile に定義するか ZSH 使ってたら ~/.zshrc とかに定義すると後が楽。

export PATH=$PATH:/opt/android-sdk/tools:/opt/android-sdk/platform-tools

cordova コマンドでプロジェクトの作成、Android プラットフォームの追加、アプリケーションのビルドまでやってみる。

$ cordova create hello; cd hello
$ cordova platform add android
$ cordova build

ここまであっさりできてしまうと、万が一 Cordova か各プラットフォームの SDK のバグを踏んでしまったときの対処が非常に大変そう。細い命綱でこの状態が保たれている感じがしてちょっと怖い。

次はエミュレータのシステムイメージがないので、android sdkAndroid SDK Manager を開いて、Android 6.0 (API 23) の "Intel x86 Atom System Image" をインストールする。lib64OpenglRender が用意できれば x86_64 のイメージも利用可能。それから必要に応じて API のバージョンは変えてもよい。

できたら次は android avd で AVD (Android Virtual Device) コンソールを開き、AVD を作成する。デバイスイメージは前述のイメージを指定する。ホスト側の GPU を利用するように "Use host GPU" にチェック。ちなみに、この AVD の名前は "android-6.0.0-x86" とした。

AVD が作成できたのでようやくエミュレータを始動できる。起動するにあたり補足事項として、エミュレータ処理の高速化のために Intel HAXM (アクセラレータ) を KVM で有効にしておく。Android SDK Manager で選択できる "Intel x86 Emulator Accelerator (HAXM)" パッケージは Linux と互換性がなくインストールできないため代替手段として KVM に頼る。

emulator-x86 -avd android-6.0.0-x86 -qemu -m 1536 -enable-kvm

上のコマンドを実行するとエミュレータが正常に起動し、ホーム画面が表示されるはずである。

先ほどビルドしたものを走らせてみよう。

cordova run --emulator android

...あれ? 一瞬起動したかのように見えたが、起動途中にエラーで落ちて "Unfortunately, hello has stopped" とアラートが...。そのエラーの内容は ADB で探った限りだと

1908: F/chromium( 1029): [FATAL:gl_surface_android.cc(58)] Check failed: kGLImplementationNone != GetGLImplementation() (0 vs. 0)

とある。要は emulator-x86-gpu on オプションを渡していなかったから、androidcordova run するときに OpenGLES が使えずエラーを吐いて落ちたわけだ。つまり、これで動くことになる。

emulator-x86 -gpu on -avd android-6.0.0-x86 -qemu -m 1536 -enable-kvm

しかし、実は僕の環境ではこのオプションを指定しても僕の環境では改善されなかった。原因が X11 の設定で intel ドライバを指定していなかったためである。結果として、エミュレータもアプリケーションも正常に起動した。

うまい話には罠がある。この先、Web View 側のデバッグをしていくということも考えていくといろいろと辛さを感じてしまいそうだ。

参考になった Web サイトです。ありがとうございました。

rue16: ANONYMOUS:: Virtual Network For The Virtual You.

Linux上でAndroidの爆速エミュレータ環境を構築してみた。 - Develop with pleasure!

Issue 2544 - android-developer-preview - Web browser/webview in Android M Emulator crashes without host gpu - A public project for reporting issues with Android Developer Preview releases - Google Project Hosting

Android Platform Guide - Apache Cordova

android - Cannot get crosswalk HelloWorld example to work - Stack Overflow