Ubuntu 14.10 で Genymotion の仮想デバイスがフリーズする現象の対処


はじめに

先日、Ubuntu ファミリーの最新版 14.10 がリリースされました。これを期に、これまで使っていた Xubuntu 14.04 から Ubuntu Mate 14.10 に乗り換えてみました。インストールは順調に進んだのですが、Genymotion を起動したところで問題が発生しました。仮想デバイスを作成して起動しようとしますが、いつまで経っても初期化が終了しないのです。しかも、OS 自体が入力を受け付けない状況に・・・。色々と調査&試行錯誤を繰り返して、ようやく問題が解決しましたので、ここに記録しておきます。

原因は NVIDIA のドライバ

なかなか原因が特定できなかったのですが、Genymotion の FAQ で判明しました。Genymotion – Frequently Asked Questions に以下が記されています。

When I start a virtual device, why does Genymotion freeze or crash?
This is due to an incompatibility with your video card driver.

仮想デバイス起動時に Genymotion がフリーズまたはクラッシュするのはなぜ?
ビデオカードのドライバーの非互換性が原因です。

ただ、この FAQ には解決策は書かれておらず、問題特定のために情報収集して報告するための手順が書かれているだけです。私の PC は NVIDIA Geforce GTX660M が乗っているのですが、おそらく 14.10 で提供される NVIDIA のドライバーと Genymotion の相性が悪いのだと推測されます。

NVIDIA の最新ドライバをインストールするには

まず試したのは、「追加のドライバー」にあるドライバの変更でした。プロプライエタリなドライバにしたりしてみましたがだめでした。次に、NVIDIA のサイトからドライバをダウンロードしてインストールを試みました。これは結構厄介で、一旦シングルモードで起動しなおしてから実行する必要があります。ですが、これもエラーが出ます。無理やり実行すると OS 自体おかしくなってしまいました。。。。
ここまでで打つ手が途切れてしまい、Android 標準の AVD を使おうかと考えていた所、How To Install The NVIDIA 340.46 Driver On Ubuntu 14.10, Ubuntu 14.04 And Derivative Systems | LinuxG.net を見つけ、その手順にしたがって簡単にドライバーをインストールできました。再起動したところ、見事に Genymotion が動作するようになりました。手順は、以下のとおりです。

念のため、バージョンを Unix Graphics Announcements and News Board – NVIDIA Developer Forums で確認すると、340.46 が最新のドライバなのでバッチリです。(343 はベータのようです。)

あとがき

Ubuntu Mate なかなか良いです。Xubuntu からの乗り換えでもそれ程違和感ありませんし、しっかり作られている感じがします。特に日本語化チームが頑張ってるのが感じられて好感がもてます。Ubuntu の公式ファミリー登録も間近との事で、今後はこれで行こうかと思っています。

[参考サイト]

  1. Genymotion – Frequently Asked Questions
  2. How To Install The NVIDIA 340.46 Driver On Ubuntu 14.10, Ubuntu 14.04 And Derivative Systems | LinuxG.net
  3. Unix Graphics Announcements and News Board – NVIDIA Developer Forums

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

大きな文字のバッテリーモニター – BatMon2 公開しました


バッテリー残量が見にくいなぁ

最近のスマートフォンは、高解像度になって表示がとても綺麗になりました。細かな画像や文字も読み取れるようになりました。すばらしい・・・のですが、おかげでステータスバーの文字が小さくてバッテリーの残量が見にくい・・・!

というわけで

大きな文字でひと目でバッテリー残量がわかる Android ウィジェットアプリを作りました。とにかくぱっと見てすぐ残量がわかる事を考えてつくりました。
大きな文字のバッテリーモニター – BatMon2 – Google Play の Android アプリ 配布中です。Android 4.0.3以上対応です。