この記事は、Android Studio 1.1.0 時点での情報を元に作成されています。
Android Studio 2 の新機能についてはこちらの記事をご覧ください。

はじめに

 前回に引き続き、Android Studio についての特集になります。

 今回は、より実践的でマニアックな内容になっております。それでは早速見て行きましょう。  


Gradle

Android Studio の元になった IntelliJ IDEA が採用しているビルドツールが Gradle です。そのため Android Studio も、もちろん Gradle を採用しています。

Gradle とは

Gradle は、Java 環境におけるビルドシステムであり、従来のビルド環境と比べ、様々な改善が施されています。特徴としては以下のような物があります。

  • あらゆる目的に使用できる汎用ビルドツール
  • Maven のように規約によるビルドフレームワークを提供
  • マルチプロジェクトを強力にサポート
  • 依存関係管理がとても強力
  • Maven / lvy リポジトリを完全にサポート

Gradle の核となっているのは、拡張性の高い Groovy ベースの DSL であり、好きなように組み立てて記述することのできるビルド用の宣言型プログラミング言語と呼べるようなものです。従来の宣言的なビルド記述を更に上の段階へ推し進めます。

なぜ、Groovy なのかというと、その答えは Gradle が想定しているシチュエーションと環境にあります。Gradle は本来一般的な利用が可能な汎用的なビルドツールですが、メインとしてフォーカスしているのは Java のプロジェクトです。そのプロジェクトメンバーは Java に習熟しているのは明らかでしょう。

それでは、ビルド用の言語も Java にすればいいのでは無いかと思われますが、Java は、ビルド用の言語として使うには、表現力や機能に限界があります。そのため、Java 世界の住人にとって、飛び抜けたわかりやすさを提供し、ビルド用の言語として向いている Groovy が選ばれました。Groovy の文法は、Java をベースにしています。その上に様々な機能を構築してはいますが、土台は Java になります。

(引用 : Gradle User Guide)

Android Studio の Gradle

Gradle の Android プラグインで出来るいくつかのことについて取り上げたいと思います。

まずは新しいプロジェクトを作成した時に自動生成されるビルド設定ファイルを見てみましょう。

  • Project > build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        // android studioのバージョンが上がる毎に利用するgradleのバージョンが変わる可能性があります
        classpath 'com.android.tools.build:gradle:1.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
  • Project > Module > build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.test.testnewproject"
        minSdkVersion 10
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

これらのファイルに設定を追加することで、それぞれの環境にあった柔軟なビルドを行うことができるようになります。

ライブラリの依存性管理

使用するライブラリを記述しておくことで、バージョンを固定したり、常に最新のバージョンを使用したりすることが出来ます。

  • Project > Module > build.gradle
// アプリの依存性管理
dependencies {
  compile 'org.twitter4j:twitter4j-core:3.0.5'        // Twitter4Jの3.0.5を利用する
  compile 'com.facebook.android:facebook-android-sdk:3.21.+' // Facebook APIの2.0.xを利用する
  compile 'com.android.support:appcompat-v7:21.0.3'
  compile fileTree(dir: 'libs', include: '*.jar')    // libsディレクトリ内の全てのjarを参照する
}

 dependencies という部分を編集します。 ここに書いておくと、ビルド時に自動的にライブラリを落としてきてくれます。

そのライブラリを探す場所に関しては次に示します。

  • Project > build.gradle
buildscript {
    repositories {
        mavenCentral()
        jcenter()
    }
    /*中略*/
}

buildscript > repositories に書いてある部分に書いてある場所に取りに行くことになります。

デバッグ用とリリース用のビルド設定が出来る

※ Android Studio 0.9より、パラメータ名に一部変更がありました

BuildType.runProguard                              ->  minifyEnabled
BuildType.zipAlign                                      -> zipAlignEnabled
BuildType.jniDebugBuild                            -> jniDebuggable
BuildType.renderscriptDebug                    -> renderscriptDebuggable
ProductFlavor.renderscriptSupportMode -> renderscriptSupportModeEnabled
ProductFlavor.renderscriptNdkMode        -> renderscriptNdkModeEnabled

デバッグ用と、リリース用のビルド設定を個別に記述することが出来ます。実際に書く方法は以下にまとめていきます。

まずは、それぞれ個別の KeyStore を設定します。

  • Project > Module > build.gradle
android {
    /*中略*/
    // 署名(keystore)の設定
    signingConfigs {
        debug {
            storeFile file("conf/debug.keystore")
        }

        release {
            storeFile file("conf/release.keystore")
            storePassword "hogehuga"
            keyAlias "aliasName"
            keyPassword "hogeneko"
        }
    }
}

次に、ビルドの設定を記述します。

  • Project > Module > build.gradle
android {
	/*中略*/
    // 署名(keystore)の設定
     buildTypes {
        release {
            debuggable false // リリースモード
            zipAlignEnabled true   // zip圧縮を行うか?
            minifyEnabled true   // プロガードを実行するか?
            proguardFile getDefaultProguardFile('proguard.txt') // プロガード実行に利用する設定ファイル
            signingConfig signingConfigs.release // リリース用のkeystoreを利用
        }

        debug {
            debuggable true // デバッグモード
            zipAlignEnabled true // zip圧縮を行う
            minifyEnabled false // プロガードを実行しない
            signingConfig signingConfigs.debug // デバッグ用のkeystoreを利用
        }
    }
}

後はビルドする時に、それぞれ使いたい方を指定すればここに書いてある設定が反映されます。

フレーバー機能

プロダクトフレーバと呼ばれるこの機能は、Java ソースや、リソース、パッケージ名などを差し替えることができるものです。とても小さな変更などは、これを設定することで実現することが可能です。

書き方としては以下のようになります。

  • Project > Module > build.gradle
android {
    /*中略*/
    productFlavors {
        flavor1 {
            packageName "com.hoge.exsample.flavor" // ここでもパッケージ名の変更が可能
        }
    }
}

後は、実際に src 以下に、ここで宣言している名前のディレクトリを作成し、その中に差し替えたいファイルを追加します。そのため、この時に付けるフレーバーの名前は、すでに存在するビルドタイプや、instrumentTest ソースセットの名前と衝突しないように注意しなくてはいけません。

また、javaソースファイルについてはmainに同名のjavaソースファイルが存在すると衝突してしまうので、各フレーバーに分けて置く必要があります。


Java7対応

Android SDK 22.6からJava7の機能を一部利用できるようになりました。

Added support for Java 7 language features like multi-catch, try-with-resources, and the diamond operator. These features require version 19 or higher of the Build Tools. Try-with-resources requires minSdkVersion 19; the rest of the new language features require minSdkVersion 8 or higher.

(引用: SDK Tools Release Note)

リリースノートに記載されている利用出来る機能は以下の通りです。

multi-catch

今まではcatch句を複数書く必要がありました。

try {
    // etc...
} catch (IOException e) {
    // etc...
} catch (IlliegalArgumentExeption e) {
    // etc...
}

これを一つのcatch句でまとめることが出来るようになります

try {
    // etc...
} catch (IOException | IlliegalArgumentExeption) {
    // etc...
}

diamond operator

今まではListやMap等の初期化時に右辺も省略せずに書く必要がありました。

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

これを右辺を省略して書く事が出来るようになりました。

Map<String, List<String>> myMap = new HashMap<>();

try-with-resources(minSdkVersion>=19以上のみ対応)

今まではfinally句で解放処理を書く必要がありました。

static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
  BufferedReader br = new BufferedReader(new FileReader(path));
  try {
    return br.readLine();
  } finally {
    if (br != null) br.close();
  }
}

これがtry句に初期化処理を記述する事で自動的に解放してくれるようになりました。

static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}

他にも以下のJava7の機能が利用出来るようです。

  • Switch文にStringが利用可能になった
  • 数値リテラルの強化

(引用:Enhancements in Java SE 7)

Java7の機能を利用するための方法を以下に記載します。

まず、SDKをJava7にします

  • File > Project Structure > JDK location

次に以下のように記述することで、Java7の機能を利用することができます。

  • Project > Module > build.gradle
android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

引用: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Using-sourceCompatibility-1.7


その他 Tips

ここからは、Android Studio で開発していく上で、知っておくと得する小ネタについてまとめたいと思います。

Android Studio Plugin

Android Studio はプラグインを追加し、機能を拡張することが出来ます。
ただ、Android Studio 自体がすでに便利機能の塊のような IDE なので、そこまでプラグインに頼るということは無いと思っています。あくまでもちょっと便利になるくらいの感覚だと思ってください。

インストール手順

 それでは早速導入の方法を見て行きたいと思いますが、基本的に Android Studio の Plugin はとても導入しやすいようになっています。
Android Studio は Preferences の中に Plugins というメニューがあります。それを開くと以下の画像のような画面になります。ここから使用したい Plugin を探し、インストールすることが出来ます。

plugins

 赤枠で囲まれているボタンをクリックすると、plugin を検索することの出来る画面が表示されます。 表示される画面が以下の画像なのですが、その左上のテキストボックス部分にキーワードを入力することで、インストールしたいプラグインを検索することが出来ます。

インストールプラグイン検索画面

 検索した結果が以下のように出てくるので、インストールしたいプラグインを選択します。右側ペインにそのプラグインの詳細がでているかと思いますので、その中の 「Install plugin」 と書かれたボタンをクリックします。

検索結果

 インストールが完了すると、Install plugin と書かれていたボタンが Restart Android Studio というものに変化します。それをクリックすることで、Android Studio が再起動し、インストールしたプラグインを使用することが可能になります。

インストール結果

 ここまでがプラグインをインストールする一連の流れなります。これを一通り行うと、インストール済みの Plugin 一覧に追加されます。

 また、このページからダウンロードし、特定のフォルダへ置くことで、インストールすることも可能です。

 Android Studio にインストールされる Plugin は、Mac なら “HOME”/Library/Application Support/AndroidStudioPreview/plugins に、Windows なら “ドライブ”\Users\”ユーザ名”\.AndroidStudio\plugins という場所に入ります。先ほどのダウンロードしてきたプラグインを置く特定のフォルダというのがここになります。ちなみに、ひとつもプラグインがインストールされていない場合にはこのディレクトリ自体が存在しません。。

 なので、何か Plugin を入れる事によって Android Studio が動かなくなるようなことがあっても、このフォルダに行き、問題になっていそうな Plugin を消せば元通りに動くようになるはずです。

おすすめの Plugin

 それでは、インストールの方法がわかったところで、いくつかおすすめの Plugin を紹介したいと思います。

  • IdeaVIM
    言わずと知れた Android Studio に vim のキーバインドを追加するためのプラグインです。
    Androider にとても人気があり、Android Studio のプラグインを紹介しているサイトでは欠かさず紹介されています。
    コレはとりあえず入れておかなくてはいけないプラグインです。(emacs 用はすでに有るので。)

  • SelectorChapek for Android
    画像群からselector を生成するためのプラグインです。 準備としては、画像の名前の後ろに normal や、pressed 等のサフィックスを付けておくだけです。 とても簡単にあの面倒な XML を作成してくれます。

  • Android Parcelable code generator
    Parcelable 実装を生成してくれるプラグインです。 Parcelable を継承したクラス作成し、メニューから Generate -> Generate Parcelable を選びます。 保存するフィールドを選択します。 これだけでおわりです。とても便利なプラグインだと思います。

  • Android Holo Colors Generator
    Holo Style を自動生成してくれるプラグインです。 個人開発を行なっている方がこのプラグインを使いこなすとかなり便利だと思います。

  • Shifter
    ture/false や int/float/double/char/boolean などをコマンド一つで切り替えることのできるプラグインです。 切り替える値の編集などもできるようになっています。 便利なのかそうでもないのか判断をつけにくいです。

Android Studio での library project の import 方法

File -> Import Module

から、インポートするライブラリの “モジュール” を選択します。

LibraryModule をコンパイルする意味も込めて一度 ReBuild しておきます。

その後、 File -> Project Structure -> Modules -> アプリモジュール名 -> Dependencies タブ を選択し、 左下にある + ボタンを押します。その時に表示されるメニューから Module dependency を選択してください。そして、今さっきインポートした ライブラリプロジェクトのモジュールを選択すれば終了です。

Android Stuio の警告文

Android Studio が開発中に出してくれる警告がとても優秀なので一部を紹介したいと思います。

例えば、以下のコードを書いているとしましょう。

for(int i = 0;i<hogeList.size();i++){
    hogeClass hoge = hogeList.get(i);
    ・・・
}

この時 Android Studio は、foreach でループさせたほうが、書くコードの量も少なくすむし便利であるというのを理解し、その旨を警告という形で伝えてくれます。 しかも、それをリプレイスまでしてくれるというとても開発者にやさしい仕様になっております。

また、String の比較を == で行なっているときなどには、equals を使用しなさいという警告を出してくれます。

その他にも、一つのメソッドでしか使用されていないメンバ変数は、ローカルにしたほうがいいという警告まで出してくれます。

本当は技術者が気を付けないといけない項目ではあると思いますが、初心者の方にとってはとてもやさしい機能であると思います。

Navigation Editor

Navigation Editor という機能が Android Studio に追加されています。
この機能を一言で表すと iOS の Storyboard のようなものです。

GUI をそのままいじるだけで、Activity の追加や画面遷移などを作成することが出来ます。

コレを起動するには、上部メニューバーから

Tools -> Android -> Navigation Editor

と行くと、プロジェクトの直下に .navigation/raw/main.navg.xml というファイルが追加されます。
このファイルを開くことで Navigation Editor を使用することが出来ます。

navigation_editor

この画面の上でマウスの右クリックから Activity を生成することができます。
もちろんここで追加した Activity は、Manifest ファイルにも追加されます。

その後 shift + 左クリック からドラッグすることでアクティビティ同士をつなぎ合わせると、画面遷移を作成することが出来ます。この実装はコード上に反映されます。

この機能は、実際にアプリを作りこんでいく段階で使用するのではなく、アプリのプロトタイプを作成するために使用することになると思います。しかもその時に作成した Activity 使用すれば、プロトタイプ作成からそのまま実装へ移ることができてしまいます。一度この機能を実際に使用してみて、プロトタイプを作成し、そのままアプリを開発していくという流れを行なってみるのもいいかもしれませんね。

Android Studio で AIDL を使用する方法

Android で service とのプロセス間通信を行いたい場合使用するのが AIDL と呼ばれるインターフェースを提供する仕組みです。

AIDL ファイルの作成方法は簡単です。作成したパッケージ内の module/src で右クリック New -> AIDL で .aidl ファイルを作成します。そうすると、main 以下に必要なディレクトリを作成してくれ、その中に .aidl ファイルを作成してくれます。

後はもろもろのファイルを保存し、build すると、 build/generated/source/aidl/debug 内に 作成したアイドルファイルと同じ名前の .java ファイルが作成されます。

aidl の使用方法については作成するアプリケーションによって内容も違うと思いますので今回は割愛します。

Android Studio での Javadoc 生成

Javadoc は、 Tools -> Generate JavaDoc から生成することが出来ます。

Javadoc 生成

その際 Javadoc を生成するスコープを以下の 4 つから選択することができるようになっています。

  • プロジェクト全体
  • モジュールの中身
  • 現在のファイル
  • カスタムスコープ

このうち上 3 つについてはそのままの意味なので説明はいらないと思います。 なので、今回は カスタムスコープについて説明したいと思います。

Custom scope を選択すると、右側の プルダウンメニューと、ボタンを選択することが可能になります。 この内、まずは、右側ボタンをクリックしてください。そうするとスコープを選択するダイアログが表示されます。

no scope

開いたばかりの時には、まだカスタムスコープがひとつも作成されていない状態なので、何かひとつ作成してみる必要があります。左上の + ボタンを選択してください。すると Local か Share かを選ぶことになりますので、今回はとりあえず Local を選びましょう。すると、名前を聞かれますのでここに適当に入力すれば準備完了です。

名前設定

表示しているダイアログに、先ほど登録した scope が増えていて、右側で細かな設定を行うことが出来るようになっていると思います。

scope

画面の中段あたりにパッケージが書いてあると思いますので、その中の Production Classes -> モジュールへと遷移しましょう。

その中にパッケージとして区切られているはずなので、Javadoc を生成したいパッケージを全て選択し、include をクリックします。もちろんパッケージ全体ではなくソースコード単位での指定もできます。

これにより、出力したいファイルだけの Javadoc を作成することができます。

Android Studio は jar の作成機能がない!?

残念ながら、Android Studio には自動的に jar を作成してくれる方法はないようです。

しかし、jar を作りたいときは有ると思います。 そこでAndroid Studio で jar を作成する方法を紹介します。

まずは、build.gradle ファイルを開き、以下のように編集します。

apply plugin: 'android'
↓
apply plugin: 'android-library'

プロジェクトを作成する段階で、isLibrary を選択している場合には自動的にこのようになっていると思いますので確認しましょう。

次にコンソールを立ち上げます。これには、 Android Studio のコンソールを使ってもいいですし、mac や windows に入れているアプリケーションを使用しても構いません。使いやすい方を使いましょう。

まずは、ライブラリのプロジェクトのディレクトリへ移動します。
その後以下のコマンドを実行します。

$ ./gradlew clean
$ ./gradlew aR

PC の環境変数に gradlew へのパスが通っていないため、プロジェクトのルートディレクトリのものを使用します。

すると、build/libs 以下に プロジェクト名.arr というファイルが作成されます。

これは、Android Studio の他のプロジェクトでライブラリとして使用したい場合に使用するものです。この .arr ファイルをライブラリを使用するモジュールの libs 以下へコピーし、build.gradle ファイルへパスを書くことで使用することが出来ます。

しかし、この build/libs フォルダは、Android Studio のパッケージエクスプローラ内には表示されません。

そのため、引き続きコンソールでこのファイルを探すことになります。

以下のディレクトリへ移動してください。

Projectディレクトリ/module(任意の名前)/build/libs

上手くコンパイルできていれば、ここに module(任意の名前).aar というファイルが生成されています。
この .aar ファイルはただのアーカイブファイルなので、解凍すると中に様々なファイルが入っています。

その中にある classes.jar というファイルが、目的の jar ファイルになります。


おわりに

 今回の特集はいかがだったでしょうか?

 Android Studio には、開発を効率良く行うための機能が沢山ついています。それを知らないまま開発を行うのはとてももったいないと思います。

 今回のこの記事が、皆様の開発の効率アップにつながれば幸いです。

 これからもギャップロでは便利な情報やマニアックな情報を発信していきますので、またの更新を楽しみにお待ちください。