Android Studio最速入門~効率的にコーディングするための使い方

第38回プロジェクトの実行方法について

はじめに

第3回でさっと説明したままずーっと放置してきたプロジェクトの実行方法について説明します。肝心のこの方法を38回目になるまでほとんど説明せずに進めてきたなと我ながら感心します。

実行構成について

Android Studioのプロジェクトの実行方法は「Run/Debug Configuration」という機能を用いて行います。ちょっと名称が長いので本連載では「実行構成」と呼びます。

ツールバーのちょうど真ん中当たりにあるドロップダウンリストが実行構成です。

図1 実行構成
図1 実行構成

常時ツールバーに表示されている実行構成がカレントの実行構成です。隣にある2つのアイコンで、それぞれ通常の実行("Run"⁠⁠、デバッグ実行("Debug")を行うことができます。デバッグ実行については、次回改めて説明するので今回は割愛します(その隣にある3つ目のアイコンも次回へ⁠⁠。メニューバーから実行する場合は、Runメニューの"Run"を選択します。

Android Studioでプロジェクトを作成すると、初めから1つ実行構成が作成済みなので、あまり意識したことは無いかと思いますが、ツールバーのドロップダウンリストか、メニューバーのRunメニューから "Edit Configurations..." を選ぶと実行構成の編集画面が表示されます。

この実行構成については、Eclipseにも似たような機能があるので、Eclipseからの移行組には違和感が無いのでは?と思います。

実行構成の編集

「Run/Debug Configurations」ダイアログの使い方について説明します。左側にはカテゴリ別に利用可能な実行構成がリストアップしてあります。初期状態では、図3のような状態になっています。

図3 ⁠Run/Debug Configurations」ダイアログ
図3 「Run/Debug Configurations」ダイアログ

「Android Application」カテゴリの実行構成「app」が設定済みです。この実行構成は「モジュールappのデフォルトAPKをデプロイして、デフォルトのアクティビティを実行する」という設定になっています。Android Studioでは、この実行構成を目的・用途別に複数用意しておくことができます。

実行構成は「永続的な実行構成」「一時的な実行構成」の2種類あります。この違いは実行構成の作り方によって決まります。

永続的な実行構成
「Run/Debug Configurations」で明示的に作成した実行構成のことを指します(エディタ上のコンテキストメニューから「Create 」を実行しても同じです⁠⁠。
一時的な実行構成
Android Studioでは、プロジェクトの実行指示をとてもカジュアルに行うことができます。アクティビティやテストケースなど、実行可能なソースコードをエディタ上で編集している際にコンテキストメニューから「Run 」「Debug 」を選択するだけで対象を実行することができます。
図4 実行可能な対象から直接、実行構成を作る
図4 実行可能な対象から直接、実行構成を作る
この方法で作られた実行構成を「一時的な実行構成」と呼びます。⁠永続的な実行構成」と比べると実行構成のアイコンが薄くなっているのが特徴です。
図5 一時的な実行構成
図5 一時的な実行構成

「一時的な実行構成」はその数の上限が決まっており、一定数を超えると古い実行構成から消えていきます。これは、JUnitなどのテストケースを特定のクラスだけ/特定のメソッドだけ、などのようにカジュアルに実行していくことを想定しての機能なのですが、Android開発でこの機能が有意義に活用されるのか?というと疑問が残ります。

なお「一時的な実行構成」の上限は「Run/Debug Configurations」ダイアログの左側にある「Defaults」を選択したときに右側の下部に表示される「Temporary configurations limit」で設定できます。

図6 ⁠一時的な実行構成」の上限値の設定
図6 「一時的な実行構成」の上限値の設定

さらに「一時的な実行構成」は以下の手順で「永続的な実行構成」に格上げすることができます。

  1. ツールバーのドロップダウンリストから「Save Configuration」を選択する

もしくは、

  1. 「Run/Debug Configurations」ダイアログから該当する実行構成を選択する
  2. 左側上部のツールバーに Save Configuration」が現れるので、これをクリックする

です。でも、こんな手順、ふつう気がつきませんよね……。

図7 ⁠一時的な実行構成」「永続的な実行構成」にする
図7 「一時的な実行構成」を「永続的な実行構成」にする

永続的な実行構成の作り方(指定可能なカテゴリについて)

一時的な実行構成の作成はコンテキスト依存であるため、そのカテゴリは自動的に設定されます。永続的な実行構成の場合は「Run/Debug Configurations」ダイアログからカテゴリを指定して作成します。

「Run/Debug Configurations」ダイアログの左側上部にある「+」アイコンをクリックすると選択可能なカテゴリがポップアップするので、そこから任意のカテゴリを選択して実行構成を作成します。

図8 カテゴリを指定して実行構成を作る
図8 カテゴリを指定して実行構成を作る

選択可能なカテゴリは数多くありますが、Android Studioで意味があるカテゴリは「Android Application」「Android Test」の2種類のみです(あと「Gradle」くらい⁠⁠。他のカテゴリはほぼ無意味と思って良いです。

Android Application

Androidアプリケーションの実行構成に用います。⁠Module」に実行したいAndroidモジュールを指定します。元々、独自にAndroid開発をサポートしていたIntelliJが用意していたカテゴリです。そのためか「Package」にデプロイするAPKを指定できそうなのですが、Android Studioでは「Project Structure」で任意の「Artifact(成果物⁠⁠」を定義できないため、実質「Deploy custom artifact」は意味を成しません。

図9 Android Applicationの設定画面
図9 Android Applicationの設定画面

Android Tests

後述するAndroidテストの実行構成に用います。⁠Module」にAndroidテストが含まれるモジュールを指定し、⁠Test」にテストケースの種別(すべて/特定のパッケージ配下/特定のクラス/特定のメソッド)を指定します。

「Android Tests」の実行構成は「Run/Debug Configurations」ダイアログで作成するより、テストディレクトリやテストケースから直接作成する事のほうが多いでしょう。その手順についても後述します。

図10 Android Testsの設定画面
図10 Android Testsの設定画面

JUnitやTestNGなど、その他のカテゴリ

Android ApplicationやAndroid Tests以外にも数多くのカテゴリがあります。どれも利用可能かと期待に胸を膨らませがちですが、ほとんどがIntelliJの名残で残っているものばかりで、実行するには「それなりの」知恵と工夫が必要です。

この、その他大勢のカテゴリに興味があり使ってみたいのであれば、Android Studio上であれこれ知恵を絞るより、素直にIntelliJを使った方が良いでしょう。

Defaultsについて

「Run/Debug Configurations」ダイアログに現在有効な実行構成と一緒に並んでいる「Defaults」ですが、これらは各実行構成のカテゴリの デフォルト値 を設定するために存在しています。辺鄙なところに唐突に「Defaults」とあって「なんだこれ?」と思いがちですが、他に適した置き場がなかったのでしょう。

図11 ⁠Defaults」内の各カテゴリの設定
図11 「Defaults」内の各カテゴリの設定

実行構成を作成するたび、毎回設定しなおすのが面倒な項目があれば、こちらにあらかじめ設定しておくと良いです。ただ、これがまた悲しいことに「Defaults」で設定した内容は .idea/workspace.xml に保存されます。つまり、いくらマメにデフォルト設定を行っても、その内容は他のプロジェクトや他の環境に引き継がれることはありません。

Androidアプリケーションの実行

実行構成の使い方はAndroid Studioの初期バージョンの頃から何も変わっていないので、第3回で紹介した方法が今も通用します。ツールバーの Run」アイコンを押すだけです。

いちいちマウスを使うのが面倒な方はメニューバーの「Run → Run 」を、実行構成を選択してから実行したい場合は「Run → Run...」を選択してください。どちらもショートカットキーが割り当てられています。

図12 ⁠Run」メニューから実行
図12 「Run」メニューから実行

Androidアプリケーションの実行環境はエミュレータと実機の2つが選択可能ですが、正直エミュレータは遅くて使い物になりません。可能ならば実機を用いることをオススメします(筆者は、この記事のために安い中華Padを購入しました⁠⁠。

エミュレータが遅いのはAndroid Studioのせいというより、Android SDKのせいみたいです。どうやらこうゆうものらしいですね。

Androidツールウィンドウの使い方

Androidアプリケーションを実行すると「Androidツールウィンドウ」がアクティブになります。このツールウィンドウ、中身はまんまDDMS(Dalvik Debug Monitor Service)です。Android StudioはEclipseのような「パースペクティブ」という概念を持ちません。Eclipse ADTのDDMSパースペクティブに相当するのが「Androidツールウィンドウ」だと理解してください。

この「Androidツールウィンドウ」ですが、初期状態は図17のようなレイアウトになっていると思います。

図17 ⁠Androidツールウィンドウ」の初期状態
図17 「Androidツールウィンドウ」の初期状態

タブが2つあり、ひとつはLogcatを表示し、もう一方がADB(Android Device Bridge)のログを表示しています。Logcatのタブは、さらにDevicesタブとLogcatタブに分かれおり、全部で3つのタブから成り立っています。

このツールウィンドウのタブは実に特殊で、よーくみるとタブの右端に「隠す(Hide⁠⁠」アイコンが付いています。これをクリックすると、そのタブは上部ツールバーの右側にアイコン化されます。

図18 タブのアイコン化とその復元方法
図18 タブのアイコン化とその復元方法

「使用頻度の低いタブは畳んでおけ」という配慮なのでしょうか?正直どうでもいい機能だなと思っています。

それより注目なのは、個々のタブはドラッグ&ドロップで自由にレイアウトを変えられるという事です。そもそも何人がこの機能に気付いていたのか?というところから気になるのですが「Androidツールウィンドウ」に限ってはかなり自由にレイアウトを変えることができます。

たとえば、すべてのタブをひとまとめにしたり、

図19 すべてのタブをひとまとめにする
図19 すべてのタブをひとまとめにする

それぞれ独立させてみたり、

図20 それぞれのタブを独立させる
図20 それぞれのタブを独立させる

さらにはフローティングすることも可能です。

図21 すべてのタブをフローティングする
図21 すべてのタブをフローティングする
※「Androidツールウィンドウ」もフローティングさせています

この手のログ参照用ウィンドウは縦に長ければ長いほど使いやすいので、デュアル以上のマルチモニタ環境を使っている場合などは「Androidツールウィンドウ」そのものをフローティング化して別モニタに表示させておくと便利です。

Androidツールウィンドウでできること

主な用途はLogcatの参照です。⁠Devicesタブ」の上部ツールバーからログレベルの変更、検索、フィルタリングを行うことができます(検索フィールドは簡易的なフィルタ機能を兼ねます⁠⁠。

図22 ⁠Devicesタブ」の上部ツールバー
図22 「Devicesタブ」の上部ツールバー

ツールバーの Only Show logcat from selected process」をONにした状態で「Devicesタブ」からプロセスを選択すると、Logcatにそのプロセスのログだけが表示されます。 特定のプロセスのログだけ見たい場合は、フィルタを作成するより手軽にできます。

「Androidツールウィンドウ」のツールバー(左端)の各種アイコンからいろいろな操作を行うことができます。基本的にDDMSと同じ事ができますが、完璧にDDMSのまったく同じというわけではありません。

表1 Androidツールウィンドウのツールバーアイコンの機能一覧
アイコン機能
Screen CaptureAndroidのスクリーンショット(静止画)を撮ります。
Screen RecordAndroidのスクリーンキャスト(動画)を録ります。要Android4.4以上。
System InformationAndroid端末やエミュレータのシステム情報を取得します。
Terminate Application「Devicesタブ」で選択したプロセスを強制終了します。
Initiate GC「Devicesタブ」で選択したプロセスにGCを起こします。
Dump Java Heap「Devicesタブ」で選択したプロセスのメモリダンプをHPROF形式で取得します。
Start Method Tracing「Devicesタブ」で選択したプロセスのメソッドトレースの取得を開始します(実行すると停止アイコンに変わる⁠⁠。

実際に試してみると「System Information」はガッカリしますが、⁠Start Method Tracing」は意外な結果にちょっとビックリします。

なお、ツールバーもしくはメニューバーの「Tools → Android」から Monitor (DDMS included)」を実行すると、Android SDKのAndroid Device Monitorが立ち上がります。Android StudioのDDMSで物足りない場合は、こちらを直接利用しましょう。

図23 Android StudioからAndroid Device Monitorを起動する
図23 Android StudioからAndroid Device Monitorを起動する

Androidテストの作成と実行

初期のAndroid Studioでは未サポートでしたが、最近のAndroid StudioではAndroidテストを実行できるようになりました。

作り方

Android Studioでプロジェクトを作成した時点からAndroidテストの準備はできているのですが、初期状態のプロジェクトにはテストコードを格納するディレクトリが作られていません。GradleのAndroidプラグインではテストディレクトリは src/instrumentTest/java にデフォルト値が定められているので、その通りにまずディレクトリを作成します。

図24 テストディレクトリを作成する
図24 テストディレクトリを作成する

第5回で紹介したとおり、内部的にはsrc/instrumentTest/javaディレクトリはテストディレクトリとして認識されているので、ディレクトリさえ作成すれば準備は完了です。

あとはテストディレクトリ内にAndroidテストのテストコードを作成するだけです。本稿ではAndroidテストそのものについては割愛しますが、テストディレクトリ下にある実行可能なテストコードは図25のようにアイコンが変わります。

図25 実行可能なテストコードのアイコン
図25 実行可能なテストコードのアイコン

ちょっとだけ寄り道にそれますが、Android Studio v0.4.0あたりから「Project Structure / Modules / Dependencies」でテスト用のライブラリを指定できるようになりました。

図26 ⁠Project Structure / Modules / Dependencies」設定画面
図26 「Project Structure / Modules / Dependencies」設定画面

この「Dependenciesタブ」上での「Test compile」スコープは、build.gradleではinstrucmentTestCompileに対応します。すでにGradleに慣れ親しんでいる人は testCompile を想像しがちですが、そもそもGradle Androidプラグインには testCompile というスコープは存在しません。

参考までに、Gradle Androidプラグインに定義されていないスコープをbuild.gradleに定義すると「Project Structure / Modules / Dependencies」図27のように表示されます。どことなくあやしげです……。

図27 build.gradleにtestCompileスコープでライブラリを定義した場合
図27 build.gradleにtestCompileスコープでライブラリを定義した場合

実行方法

Androidテストが含まれるテストディレクトリの任意の場所(テストコードのファイルも含む)を選択し、コンテキストメニューから「Run」を実行します。場合によっては、さらにサブメニューが表示されAndroidテストとして実行するか、JUnitとして実行するか選択可能になりますが、必ず Androidテスト を選択するようにしてください。

図28 Androidテストとしてテストケースを実行
図28 Androidテストとしてテストケースを実行
※アイコンでAndroidテスト(上)かJUnit(下)かを区別します。

Androidテストとして実行可能な選択箇所は以下のとおりです。いずれの場合もコンテキストメニューに、何か実行対象になっているか表示されるので、そう迷うことはありません。

テストディレクトリやその配下のパッケージ
テストディレクトリのルートディレクトリを指定した場合は全てのテストを実行。パッケージを指定した場合はそのパッケージ配下のテストを実行します。
テストクラスを選択した場合
そのテストクラスのみを実行します。テストクラスをテキストエディタで開いている場合は、メソッドの外にカーソルがあれば、そのテストクラスを選択した事になります。
テストメソッドを選択した場合
そのテストメソッドのみを実行します。テストクラスをテキストエディタで開いている場合は、テストメソッド内にカーソルがあれば、そのテストメソッドを選択した事になります。

テストが開始すると「Runツールウィンドウ」図29のようなテストランナーが表示されます。

図29 Androidテストの実行例
図29 Androidテストの実行例

すでにIntelliJ IDEAを使っていたという奇特な人たちに向けて補足します。この「Runツールウィンドウ」に表示されるテストランナーは実行構成で「JUnit」「TestNG」を指定したときのものとよく似ています。同じ感覚で操作できるものと思ってしまいますが、Androidテストの場合、以下の操作ができません。

  • テストケースから
  • 失敗したテストケースのみを再実行できない

どちらも地味に不便なので、いずれ改善することを願っています。

普通のJUnitを使ったユニットテスト

Android SDK標準のAndroidテストはJUnit3ベースであったり、実行するたびエミュレータか実機を必要とするため、純粋なロジック寄りのテストをするにはあまり使い勝手が良いとは言えません。

できることならGradleのJavaプラグインのように素のJUnit4を使いたいのですが、一筋縄ではいきません。stackoverflow.comや海外のブログにいくつかチャレンジした結果が報告されています。

どれも「よくぞがんばった」的な内容で、筆者の感覚では「現状ではできない」と考えてます。そう思い至った理由は以下の通りです。

  • Androidテストとは別目的のテストディレクトリを認識できない
  • 複数のテストフォルダを複数の用途に使い分けできない

Android Studioが「テストディレクトリ」として認識できるのは、Androidテスト用に設定したディレクトリのみです。リスト1のように instrumentTestを設定して src/instrumentTest/java 以外のディレクトリをテストディレクトリに追加することはできますが、あくまでAndroidテスト用のディレクトリが増えるだけでしかありません。

リスト1 instrumentTestに別のソースディレクトリを追加する
sourceSets {
  instrumentTest {
    java.srcDir 'src/test/java'
  }
}

以前のAndroid Studioより遙かに build.gradle との連係が密になったのは喜ばしいのですが、不便な点もあります。AndroidモジュールはAndroidプラグインをベースにしているため、リスト2のようにbuild.gradleに、maininstrumentTestとは別のソースセットを定義しても、それをソースディレクトリと認識することはありません。

リスト2 独自のソースセットを定義する
sourceSets {
  unitTest {
    java.srcDir 'foobar'
  }
}

仮に instrumentTest とは別のテストディレクトリを認識できたとしても、Android Studioはテストディレクトリを用途別に区別することはできません。たとえば「ディレクトリAはAndroidテスト用、ディレクトリBはJUnit用」のようにはできず、ディレクトリAもBも1種類のテスト――つまりAndroidテスト用に設定されます。

いまのところ、Androidテスト以外のテストを行うには、Android StudioやGradleの仕組みを知った上であらゆる工夫をして、どうにか実行させる事ができる程度でしかありません。ただし「Androidテストを捨て、Robolectricのみに切り替える」といった割り切りをすれば、現状でもAndroidテスト以外のテストを行うことはできます。

  • JavaモジュールからAndroidモジュールを参照できない

比較的現実的な解では?と思って検証してみたのが、プロジェクトに別途Javaモジュールを作成し、そのモジュール内のテストでAndroidモジュールを参照するというケースです。

図30 JavaモジュールからAndroidモジュールを参照する
図30 JavaモジュールからAndroidモジュールを参照する

JavaモジュールはGradleのJavaプラグインに対応しているため、普通にJUnitのテストが可能です。図31のようにJavaモジュールからAndroidモジュールを参照するテストを作り、実験してみました。

図31 Androidモジュールを参照するJUnitのテストケース
図31 Androidモジュールを参照するJUnitのテストケース

結果は惨敗でした。Android Studio上では、一見するとコンパイルは通るのですが実行時にテストケースを見つけられず失敗します。また、Gradleから直接テストを実行すると、そもそもコンパイルに失敗します。どうもGradle上ではJavaプラグインからAndroidプラグインを参照できていないようです。

図32 GradleではJavaモジュールからAndroidモジュールを参照できない
図32 GradleではJavaモジュールからAndroidモジュールを参照できない

これは蛇足ですが、Androidモジュールを参照していない普通のJavaモジュールであれば、Android StudioからもJUnitテストを実行することができます。Androidのテストとは、だいぶ関わりが薄いので、だからどうした的な話ですが……。

Gradleのタスクの実行

最後にGradleタスクの実行方法について紹介します。通常は「Gradleツールウィンドウ」から任意のタスクをダブルクリックして実行します。

図33 ⁠Gradleツールウィンドウ」
図33 「Gradleツールウィンドウ」

「Gradleツールウィンドウ」から実行したタスクは、一時的な実行構成として登録されます。

図34 Gradleタスクの実行構成
図34 Gradleタスクの実行構成

Android StudioはビルドシステムにGradleを使っているので、⁠Build」メニューの"Make Project"や"Clean Project"などは内部的にGradleのタスクを実行しています。そのため独自タスクを定義した、などでは無い限り「Gradleツールウィンドウ」を使う機会もそう多くはありません。

仮にGradleタスクを実行する機会があったとしても「Terminalツールウィンドウ」から直接実行したほうが便利だと思います。

余談ですが、Android StudioではGradleの実行に用いるJVMは、そのプロジェクトで使っているJVM(Android SDKに割り当てているJVM)になります。これを任意のJVMに変更することはできません。⁠Run/Debug Configurations」ダイアログのGradleの実行構成の設定画面をみるとわかりますが、Gradleタスクを実行するときのJVMを指定する項目がありません。

今回のまとめと次回の予告

実行構成はIntelliJの時の仕組みを色濃く残しており、Gradleとどう連携させているのか正直ちょっと危うい感じを受けます。たとえば、AndroidアプリケーションでのAPKの指定でデフォルト以外のAPKをどうやって指定するのかなど、分からない点がいくつかあります。

デフォルトではうまくいくので、しばらくはPublic Previewだと大目にみて、追って整備されるのを勝手に期待しています。何かしらの方向性が提示されると良いですね。

次回は、今回保留にしていたデバッガの話です。

おすすめ記事

記事・ニュース一覧