JenkinsのAndroid Emulator Pluginを使ってみる

JenkinsのAndroid Emulator Pluginの使い方をまとめました。

Debian 8で実行しています。

libGLエラーの回避方法について追記しました。libGLエラーを回避するにはFedora 22やCentOS 7でtigervnc-serverを使う必要があります。


1 Android Emulator Pluginとは

Android SDKのインストールとAndroidアプリケーションのビルド・インストールをサポートするプラグインです。

Androidアプリケーションの自動テストが可能になります。

Android NDKのインストールはサポートしていないようです。

Android NDKアプリケーションを作成する場合は別途Android NDKをインストールして、jenkinsのPATHを通す必要があります。

2 Android Emulator Pluginのインストール

Jenkinsのプラグイン制御画面からインストールします。

Jenkinsの管理 -> プラグインの管理 -> 利用可能

https://dl-web.dropbox.com/s/hjmr4kj5sd5oihb/0001_AndroidEmulator-Install.png

3 Android SDK用ライブラリのインストール(64bit環境向け)

adbやaapt等の32bitバイナリ用のライブラリをインストールします。

$ sudo dpkg --add-architecture i386
$ sudo apt-get update -y
$ sudo apt-get install -y libc6:i386 libncurses5:i386 \
libstdc++6:i386 lib32z1

4 adbをPATHに追加

後ほど、ジョブの設定からシェルの実行を設定する際にadbを使えるようにしたいので、adbのパスを追加しておきます。

$ sudo su jenkins -c '
echo "export PATH=\$PATH:\$HOME/tools/android-sdk/platform-tools/ >> .profile
'

5 antのインストール

build.xmlでAndroidアプリケーションをビルドする為にantをインストールします。

$ sudo apt-get install -y ant

6 Android NDKのインストール(必要に応じて)

Android NDKをインストールして、jenkinsのPATHに通します。

$ sudo su jenkins -c '
cd /var/lib/jenkins
wget http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
chmod a+x android-ndk-r10e-linux-x86_64.bin
./android-ndk-r10e-linux-x86_64.bin
echo "export PATH=\$PATH:\$HOME/android-ndk-r10e" >> .profile
'

7 システムの設定

Android SDKの扱いを設定します。

https://dl-web.dropbox.com/s/kwp8hjxz6ho7osl/0002_System-Setting.png

すでにシステムにインストールされているAndroid SDKを使う場合は「Android SDK root」に指定します。

「Android install Android components when required」にチェックを入れることで、任意のABIや任意のAndroidターゲットが必要になった際に、自動的にダウンロードを実行します。

「Keep emulators in the job workspace, in the .android subdirectory, to isolate them as much as possible」にチェックを入れることで、.androidディレクトリのファイル群をジョブ毎に分けることができます。

複数のジョブで同じAVDを使用する場合に有効なようです。

ただし、その分ワークスペースの容量が増えます。

8 ジョブの設定

8.1 エミュレータの設定

ビルド環境の「Run an Android emulator during build」にチェックを入れます。

https://dl-web.dropbox.com/s/i5ehghlcaj5ivms/0003_Job-Android-Run-Emulator.png

「Run existing emulator」にチェックを入れると、Jenkins以外で作成した既存のAVDを利用できます。

「Run emulator with properties」にチェックを入れると、Jenkinsが自動でAVDを作成します(作成されたAVDは再利用されます)。

以下では「Run emulator with properties」をチェックした場合に必要となるプロパティについて記載します。

 

Android OS version android list targetで出力されるターゲット
Screen density mdpiやldpi等のdpi値
Screen resolution WVGAや480x800等の解像度
Target ABI armeabi-v7aやx86等のABI

 

Android OS versionは「"android-21"」等を指定すると、ターゲットのインストール順番に左右されずにすみます。

ただし、ダブルコーテーションが必要な点に注意してください。

8.2 Show emulator windowにチェックを入れるとlibGLエラーで起動失敗

Xvnc Pluginを動作させてStartup delayに30を設定した状態で以下のエラーが出てしまい、emulatorの起動に失敗してしまいます。

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

いくつか問題があるようです。

  • tigervnc-serverでないとlibGL errorが出る。2015年8月現在、tigervnc-serverはDebian系でパッケージングされていない(Debian系でパッケージングされているvncserverがGNOME3に対応できてない問題があるので、いずれはパッケージングされると思ってます)。
  • VncRecorder Pluginを動かすと環境変数DISPLAYが[ホスト名]:[ディスプレイ番号]になる(これはVncRecorder Pluginを直すべきですね)。
  • Android Emulator Plugin(というよりSDLアプリ?)は環境変数DISPLAYが[ホスト名]:[ディスプレイ番号]だと動作しない。

Fedora 22やCentOS 7でtigervnc-serverを用いて、VncRecorder Pluginを使わなければ、libGLエラーを回避できます。

 

私はVncRecorder Pluginを使いたかったので、Android SDKのemulatorについて以下の変更を加えました。

  • emulatorをemulator.orgに名前変更。
  • 以下の内容のemulatorという名前のスクリプトを作成(環境変数DISPLAYからホスト名を削除してemulator.orgを呼び出す)。
$ cd <path-to-workspace>/tools/android-sdk/tools
$ mv emulator{,.org}
$ cat << EOF > emulator
#!/bin/sh

# Original emulator binary PATH.
EMULATOR=\${PWD}/tools/android-sdk/tools/emulator.org

# Remove hostname from DISPLAY.
display=:\`echo \${DISPLAY} | awk -F: '{ print \$2 }'\`

# Run original emulator binary with modified DISPLAY.
DISPLAY=\${display} \${EMULATOR} \$@
EOF
$ chmod a+x emulator

8.3 ビルドの設定

ビルド手順の追加で次の操作を追加できます。

https://dl-web.dropbox.com/s/5fjcc2v5j849oip/0004_Job-Build.png

 

Create Android build files build.xmlファイルの作成(更新)
Antの呼び出し antのターゲット
Install Android Package apkファイルをインストール

 

monkey testの実行と結果参照もできます。

9 ジョブの実行

Android SDKがインストールされていない場合、インストール処理のログが出力されます。

[android] No Android SDK found; let's install it automatically...
Downloading and installing Android SDK from
http://dl.google.com/android/android-sdk_r24.0.2-linux.tgz
[android] Base SDK installed successfully

Android SDKのインストールが完了するとAVDが起動し始めます。

[android] Creating Android AVD:
/var/lib/jenkins/.android/avd/hudson_en-US_160_WVGA_android-21_armeabi-v7a.avd
[android] /var/lib/jenkins/tools/android-sdk/tools/android create avd
-f -a -s WVGA800 -n hudson_en-US_160_WVGA_android-21_armeabi-v7a -t
android-21 --abi armeabi-v7a
$ /var/lib/jenkins/tools/android-sdk/platform-tools/adb start-server

ウェイトが掛かった後、AVDの起動が完了します。

以降は「ビルド手順」で設定した処理が続きます。

ビルド手順が完了すると即座にemulatorは停止するので、「シェルの実行」でアプリを起動してログを参照する場合はウェイトを入れる必要があります。

9.1 "android-19"以降の場合にAVD起動が失敗する場合がある

ターゲットが"android-19"以降の場合にAVD起動が失敗する場合があるようです。

Android SDKの問題かプラグインの問題なのかは不明です。

"android-18"以下だと上手く動作するのでそちらを使うと良いでしょう。