これから Android 開発をするなら抑えておきたい環境構築AtoZ

AndroidStudio や Gradle の登場で、Android の開発を始める時の環境構築の面での進化が止まらない近頃の Android 開発。
特に、AndroidStudio は継続的にバージョンアップが配信され、正式版の発表も秒読みなのではないかと言われる程には、開発環境が以前よりも格段に良くなってきています。

今回は、チームで開発する上でも、個人で開発する上でも、プロジェクトを最初に立ち上げる時に抑えておきたい、環境構築のポイントを紹介したいと思います。

# Gradle に入れておきたいプラグイン達

## 1. SDK Manager のセットアップを自動化するプラグイン

Android SDK Manager は、無くてはならないものですが、それをセットアップするのは地道な作業が続いて意外と面倒くさかったりします。
どのバージョンまでをサポートするかによって、入れる必要があったりなかったりするものもあったり、人によっては入れているバージョンに差があったりして、地味にハマる部分でもあります。

そういった地味に面倒なことを、アプリのビルドコマンド一発で解決できたら…

https://github.com/cookpad/gradle-android-sdk-manager

https://github.com/JakeWharton/sdk-manager-plugin

https://github.com/nobuoka/vc-gradle-android-sdk-manager

できるんです。そう、Gradle ならね。

アプリがターゲットとしている API Level を見分けて、セットアップしていなければ、よしなに Android SDK Manager に必要なバージョンのものをインストールしてくれます。
これで、どんな環境にコードを持って行っても、最低限 Gradle が動けばすぐにアプリの開発に取り掛かれます。

## 2. ライブラリを Maven Central にプッシュするためのプラグイン

ライブラリプロジェクトを作っていると、jar や aar にかためて Maven などのリポジトリにアップロードしたくなります。
GitHub を使っているのであれば、GitHub のリポジトリを Maven のリポジトリとして活用することが出来るので、その手段を使っても良いですが、より簡単にライブラリの依存を解決できるようにするには、Maven Central へアップロードする方がよいでしょう。

しかし、Maven Central へアップロードするのは意外と面倒なことが多いです。
おそらく、全てを手動でアップロードするようなことは、誰もが望まないはず。どうせなら、必要な手続きは全部自動化して欲しい…

https://github.com/chrisbanes/gradle-mvn-push

ありました。さすが Gradle、プラグインで何でも解決できますね。
このプラグインを使う上では少しクセがあり、Issue でもディスカッションされている部分がありますが、その話題は[こちらの記事](http://qiita.com/KeithYokoma/items/e9ee24e7f6a62623f2fb)と[この記事](http://qiita.com/KeithYokoma/items/2b5bd7a98523ed78ec87)で紹介しています。

## 3. テスト版アプリの配信をコマンドで実行するためのプラグイン

アプリの開発が進むと、テスト版やベータ版を配布したい場面が出てきます。
そんなとき、手元に端末を持ってきてもらって、USB をつないで、IDE からビルドしてインストールするのは手間が掛かりすぎてしまいます。
また、デバッグビルドとリリースビルドで微妙に動きが違う、という時に、一々両方のビルドを入れたり消したりを USB 経由でするのは時間が勿体ない。

そこで、DeployGate の登場です。

https://github.com/DeployGate/gradle-deploygate-plugin

Gradle プラグインも用意されており、複数のフレーバーを設定することで、様々な種類の apk を同時にアップロードすることも出来ます。
これでもう、テスト版やベータ版の配信で困ることはありませんね。

# 設定とスクリプトを分離する

## 1. キーストアの設定を、ビルドスクリプトから分離する

キーストアに関連する設定は、ビルドスクリプトに記述しておくことが出来ます。
しかし、デバッグ用のキーストアは良いにしても、リリース用のキーストアの情報（エイリアスやパスフレーズなど）は、そのままビルドスクリプトに記述したくありません。

設定を書いたファイルだけをリポジトリに入れないようにして、ビルドスクリプトでは、その設定を読むだけにしたい。
それを叶えるには、以下のように設定ファイルを読むコードをビルドスクリプトに埋め込んでおきます。

```groovy:build.gradle

Properties props = new Properties()
props.load(new FileInputStream(file("conf/build.properties")))
```

上記のコードでは、モジュール以下に`conf`ディレクトリを掘っていて、その中に`build.properties`というテキストファイルを配置していることになっています。
キーストアなどの秘密な情報はここに固めて入れておき、チームでの共有はアプリケーションのリポジトリ以外から持ってくるようにしておけば、知られたくないものはリポジトリに入らなくてすみます。

```text:build.properties

STORE_PATH=conf/release.keystore
STORE_PASSWORD=hogehoge
KEY_ALIAS=oreore
KEY_PASSWORD=fugafuga
```

上記のファイルから値を読み出すときは、以下のようにします。

```groovy:build.gradle

android {
    signingConfigs {

        release {
            storeFile file(props['STORE_PATH'])
            storePassword props['STORE_PASSWORD']
            keyAlias props['KEY_ALIAS']
            keyPassword props['KEY_PASSWORD']
        }
    }
```

AndroidStudio では、しれっとビルドスクリプトから参照されている properties ファイルの値はエディタ上で色が変わるようになっているので、うまく使えているかどうかも視覚的に判別できます。

# デバッグ用途に便利なライブラリ達

## 1. メモリリークの調査をしやすくしてくれるライブラリ

Eclipse 時代には、Eclipse に統合された MAT があったお陰で、hprof データを MAT に渡して、メモリの使用状況が観測できました。
AndroidStudio になって、0.5.6 の現在、Eclipse の MAT Plugin 相当のプラグインはありません。
スタンドアロン版の MAT を使うのも手ですが、それらを入れてもらう手間がどうしても出てきます。もちろん、必要なツールですから、開発者にとっては必携ですが、できるなら Android Studio に統合されていて欲しい…

MAT と同じような機能を持つ AndroidStudio 向けプラグインないし機能は現在、[要望は上がっている](https://groups.google.com/forum/#!topic/adt-dev/yRGx9dgY8fk)ものの、あまり活発に開発されているわけではないようです。

そこでどうするか。
まずは Logcat を活用するところから始めてみましょう。

https://github.com/sys1yagi/leak-checker

Activity のライフサイクルコールバックに、Google Analytics の計測を埋め込む感覚で、メモリの状況をプリントするよう呼び出しを行うだけで、メモリの使用状況を出してくれます。
また、リークしているかどうかを調べたいオブジェクトも、このライブラリで調査することが出来ます。

## 2. デバイスの差を吸収するライブラリ

デバイスごとに、微妙に振る舞いが違うことが、まれによくある事例として起こります。
そんな時、それらを一々全部追いかけるのはとても大変…

ある程度はまとめて取り扱えるようになっていると嬉しいですね。

https://github.com/mixi-inc/Android-Device-Compatibility

もう、解決されているんです。

そこそこよく知られている問題は、ほぼこのライブラリが吸収してくれます。

## 3. レイアウトをデバッグしたい

レイアウトの構造を可視化して、自分が思っているのと正しい構造になっているかを確認したいとき、ありますよね。
特に、静的なレイアウトだけではなく、すこしリッチでダイナミックな動きをするものを作った時には、その過程や結果として、どのような構造になるかはとても気になります。

エミュレータを使えば、ヒエラルキーを可視化するための標準ツールが使えます。
また、UI Automator の登場により、UI AutomatorView が導入され、ある程度は視覚的に確認できるようにはなりました。

しかし、両者とも制限が多く、使いづらい場面も多々あります。

できれば、端末上で、バージョンの制限もそれほどない環境で試したい…

https://github.com/JakeWharton/scalpel

すごい。かっこいい。平面ではなく 3D で見える。
胸熱。

## 4. テストをもっと早く動かしたい

Android の標準テストフレームワークは、JUnit3 をベースに作られており、実機やエミュレータにインストールしてテストを実行します。
つまり、テストで使う API は古い上に、実行速度が遅い…

今や JUnit は 4 ですし、もっと早くテストが動いてくれたら、と思うこと山のごとし。

http://robolectric.org/

Robolectric なら、実機やエミュレータが無くてもテストが出来ます。JVM で動かすので、実行速度も速いです。そして、JUnit4 でテストが書けます。
予め Gradle と Robolectric をセットアップしたテンプレートプロジェクトも公開されています。

https://github.com/robolectric/deckard-gradle

あわせて、テストのためのユーティリティもどうぞ。

https://github.com/square/fest-android

https://code.google.com/p/mockito/

## 5. よくあるコードは手続きをまとめておきたいときに使うライブラリ

これはもう、そこら中に有ります。

http://commons.apache.org/

https://code.google.com/p/guava-libraries/

https://github.com/nohana/Amalgam

Gradle 版も。

https://github.com/gfx/gradle-android-utils

# AndroidStudio のプラグイン集

## Otto を使うなら

https://github.com/square/otto-intellij-plugin

## Dagger を使うなら

https://github.com/square/dagger-intellij-plugin

## 命名規則から StateListDrawable を自動生成するなら

https://github.com/inmite/android-selector-chapek

## AndroidStudio から adb のコマンドを打つなら

https://github.com/pbreault/adb-idea

# なんでもいいから、どんなライブラリがあるか知りたい

[ここ](https://github.com/m3n0R/AndroidElementals#filepickers)とか、[これ](http://qiita.com/KeithYokoma/items/fb6872a72a75e9b6f2e6)とかをチェックしよう！