Android ボタン押下テスト時の SecurityException


はじめに

これまで UI のテストは書いていなかったのですが、今後は書くようにしようと思い、早速ボタンの押下テストを書いてみました。が、いきなり例外(SecurityException)発生です。今回は、その内容と対処法について記事にしてみました。

ボタン押下テストでセキュリティ例外発生

“Start” ボタンを押すと表示が “Stop” になるという、トグルボタンのテストコードを以下のように書きました。

TouchUtils.clickView() を使うと、UI スレッドを意識しなくて良いので楽ちんです。しかし、テストを実行してみると、以下のような例外が発生してしまいました。

java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission

原因は

調べてみたところ、Android.test.TouchUtils methods don’t work on headless emulator, help! – Stack Overflow を発見。エミューレータがロックスクリーンになっていたのが原因でした。確かに、最初にエミュレータを起動した後、Android Studio の後ろに隠れてしまっていて画面を見ていませんでした。あらためて確認してみると。

間違いなくロックスクリーンでした。
鍵マークをスワイプしてロックを外してからテストを実行すると問題なくテストが動きました。

これで問題は解決しましたが、さらに調べると、Activity Testing | Android Developersに記述がありました。

You may find that UI tests don’t work if the emulator’s or device’s home screen is disabled with the keyguard pattern. This is because the application under test can’t receive key events sent by sendKeys(). The best way to avoid this is to start your emulator or device first and then disable the keyguard for the home screen.

エミュレータもしくはデバイスのホームスクリーンがキーガードパターンで無効になっていると、UI テストは動作しません。これは、テスト下のアプリケーションが sendKeys() で送られるキーイベントを受け取れないためです。これを避ける一番良い方法は、最初にエミュレータもしくはデバイスを起動し、ホームスクリーンのキーガードを無効にしておくことです。

まぁ、当然といえば当然ですね。エミュレータの設定でロックが動作しないようにもできたと思いますが、できるだけ通常の状態でテストしたいので今はそのままにしておくことにしました。

追記

Activity Testing | Android Developers の記事の下にはコードでキーガードを外す方法も書いてあるのですが、パーミッション(android.permission.DISABLE_KEYGUARD)を設定する必要があります。その場合リリース時にはパーミッションを外す必要があり、それを忘れるとユーザに余分なパーミッションを提示する事になってしまいます。リリース時とは別にテスト用のマニフェストが使えたらなぁと思っていたところ、Android Studio 0.8.11 Released – Android Tools Project Site で可能になるようです。今はまだ canary channel ですが、ベータになるのは時間の問題と思います。待ち遠しいなぁ。

[参考]

  1. Android.test.TouchUtils methods don’t work on headless emulator, help! – Stack Overflow
  2. Activity Testing | Android Developers
  3. Android Studio 0.8.11 Released – Android Tools Project Site

IntelliJ IDEA 13.1.4 で Android プロジェクトのビルドに失敗する


※2014/07/26 注) 現在公開中の IntelliJ IDEA 13.1.4b では、以下の記事の不具合は解消されているようです。

はじめに

IntelliJ IDEA 13.1.3 を 13.1.4 にアップデートし、Android プロジェクトをビルドしたところ、以下のようなエラーが発生してしまいました。

それまでは、正常にビルドできていたプロジェクトでしたので、Android SDK か IntelliJ の問題かと見当をつけて調べてみました。

IntelliJ IDEA 13.1.4 のバグでした

詳細は、以下のサイトをご覧ください。どうやら、Android Studio 用の変更を取り込む際に、見落としがあったようです。
Internal error: NoSuchMethodError: com.google.common.io.Closeables.closeQuietly : IDEA-127374
まだアップデートしていない方は、13.1.5 が出るまで待ちましょう。

ダウングレードで対処

13.1.5 で修正される旨アナウンスされていますが、現時点では、ダウングレードしか対処の方法がありません。13.1.3 へのリンクは、以下にあります。
Internal error: NoSuchMethodError: com.google.common.io.Closeables.closeQuietly after updating to IDEA 13.1.4 : JetBrains Support

Ubuntu (Xubuntu) では、.tar.gz をダウンロードして展開し、インストールディレクトリの内容を置き換える事でうまくいきました。(単に上書きで置き換えてもうまくいかなかったので、元のファイルを全て消してから置き換えました。)

Windows では、一旦アンインストールして .exe を実行すれば良いと思われます。

[参考サイト]

  1. Internal error: NoSuchMethodError: com.google.common.io.Closeables.closeQuietly : IDEA-127374
  2. Internal error: NoSuchMethodError: com.google.common.io.Closeables.closeQuietly after updating to IDEA 13.1.4 : JetBrains Support

Ubuntu への JDK, Android SDK のインストール


今まで Windows 環境で Android 開発をしてきたのですが、最近ふと思い立って Linux(Ubuntu/Xubuntu) で環境を構築してみました。この記事では、IDE をインストールする前に必要となる JDK と Android SDK のインストールについて記述します。 (ADT Bundle を使わず、 JDK/SDK と IDE を個別にインストールすることを想定しています。)

JDK のインストール

JDK は頻繁にアップデートされるので、パッケージ管理を使いたいと思って調べたところ、 Oracle Java (JDK) 6 / 7 / 8 Installer PPA : “WebUpd8” team で PPA が提供されていました。この PPA は、 Oracle のインストーラをダウンロードして実行するようになっています。
以下のように導入します。途中、Oracle ライセンスへの同意が求められますので同意して進めます。

最後の行で、インストールが正常に行われたか確認しています。
以上の作業で、私の環境では /usr/lib/jvm/java-7-oracle にインストールされました。

Android SDK のインストール

Android SDK のインストールは、 Android SDK | Android Developers に従って進めました。

  1. まず、 SYSTEM REQUIREMENTS の Linux 欄に以下の記述があります。

    64-bit distributions must be capable of running 32-bit applications.

    64-bit ディストリビューションは、 32-bit アプリケーションを実行できなければならない。

    私の環境は 64bit-Xubuntu なので、これに対応するため ia32-libs をインストールします。(32bit OS では不要です。)
    sudo apt-get install ia32-libs
    私の環境は 64bit-Xubuntu なので、これに対応するため lib32stdc++6 と lib32z1 をインストールします。(32bit OS では不要です。)

    ※注 2014/10/15) Ubuntu 14.04 以降では、ia32-libs をインストールできません。(Dan Dar3: Android SDK Tools on Ubuntu 14.04 beta x64)

  2. 次に DOWNLOAD FOR OTHER PLATFORMS から Linux 32 & 64-bit のパッケージをダウンロードします。(/home/hoge/Downloads/android-sdk_r21.1-linux.tgz とします)
    ※ 現在は、 Eclipse 環境も含めた ADT Bundle というパッケージが用意されていますが、本記事では、IDE を別途インストールする事を想定しています。
  3. ホームディレクトリに適当なディレクトリ (ここでは Development とします) を作成してそこに展開します。

  4. tools, platform-tools ディレクトリにパスを通しておくと便利です。 ~/.bashrc に以下を追加します。

    ※ 2014/02/14 修正: 現在では adb は platform-tools ディレクトリに移動されれているので、パスに platform-tools を追加しました。

    ※ 2014/05/28 補足: platform-tools は、Android SDK Platform-tools をインストールすると作成されます。

    パスを適用するために、以下を実行します。

  5. SDK をアップデートします。(全てのプラットフォーム用の SDK がダウンロードされますので、かなり時間を要します。)

    ※ 2014/05/28 補足: 現在は多くのプラットフォームが登録されていて、全てのアップデートを実行するのは現実的ではありません。この操作は飛ばして、次の項目へ進み、「SDK マネージャ」を起動して必要なものだけインストール&アップデートした方が良いと思われます。

  6. SDK マネージャを起動して確認してください。(私の環境では、ソースがダウンロードされていなかったので追加でダウンロードしました。)

  7. その他の android コマンドについては、–help オプションで確認してください。

この後は、Eclipse や IntelliJ 等好みの IDE をセットアップして開発を始めることができます。

[参考サイト]

[関連記事]