俺得gradleテンプレート(随時更新)

私は[AndroidAnnotations](https://github.com/excilys/androidannotations)をほとんど全てのアプリで使っているのですが、Android Annotationsを導入するために毎回ググるのが面倒なのでここに書いておきます。

Android Studio 2.2 (で使われているGradleビルドツール2.2) から、アノテーションプロセッシングが組み込まれるようになり、以下の記述をするだけで AndroidAnnotations を使うことができます。

```groovy
dependencies {
    annotationProcessor 'org.androidannotations:androidannotations:4.3.1'
    compile 'org.androidannotations:androidannotations-api:4.3.1'

    // OrmLite
    // annotationProcessor 'org.androidannotations:ormlite:4.3.1'
    // compile 'org.androidannotations:ormlite-api:4.3.1'

    // Rest client
    // annotationProcessor 'org.androidannotations:rest-spring:4.3.1'
    // compile 'org.androidannotations:rest-spring-api:4.3.1'
}
```

ただし、この方法でビルドしているとたまにうまく動かない場面に遭遇したりします。そういうときは従来からの`android-apt`プラグインを使う方法で対応します。
以下のようにビルドスクリプトの依存関係として`com.neenbedankt.gradle.plugins:android-apt`を追加して`android-apt`プラグインを適用します。

```groovy
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // android-aptを使うために必要
    }
}

repositories {
    jcenter()
}

apply plugin: 'com.android.application'
apply plugin: 'android-apt' // アノテーションプロセッシングをするのに必要

dependencies {
    // AndroidAnnotations
    apt 'org.androidannotations:androidannotations:4.3.1'
    compile 'org.androidannotations:androidannotations-api:4.3.1'

    // AndroidAnnotations OrmLite
    // apt 'org.androidannotations:ormlite:4.3.1'
    // compile 'org.androidannotations:ormlite-api:4.3.1'

    // AndroidAnnotations Rest client
    // apt 'org.androidannotations:rest-spring:4.3.1'
    // compile 'org.androidannotations:rest-spring-api:4.3.1'
}

// アノテーションプロセッシングを行うための設定
apt {
    arguments {
        androidManifestFile variant.outputs[0].processResources.manifestFile
        resourcePackageName android.defaultConfig.applicationId
    }
}

android {
    ...
}
```

-----

## いろいろなライブラリまとめ

私がよく使う便利なライブラリたち。

### Fabric

Analytics代わりに入れたり、クラッシュレポートを受け取ったり。導入が若干面倒。

```groovy
buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.19.0'
    }
}

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

apply plugin: 'io.fabric' // Fabric

dependencies {
    compile('com.twitter.sdk.android:twitter:1.14.1@aar') { transitive = true; } // Twitter Kit
    compile('com.crashlytics.sdk.android:crashlytics:2.2.4@aar') { transitive = true; } // Crashlytics Kit
}
```

### Firebase

google-services.json のダウンロードとコピーを忘れずにおこなうこと！（ドキュメント参照）

```groovy
dependencies {
    def firebaseVer = '10.0.1'
    compile "com.google.firebase:firebase-core:$firebaseVer"                // Analytics
    compile "com.google.firebase:firebase-database:$firebaseVer"            // Realtime Database
    compile "com.google.firebase:firebase-storage:$firebaseVer"             //  Storage
    compile "com.google.firebase:firebase-crash:$firebaseVer"               //  Crash Reporting
    compile "com.google.firebase:firebase-auth:$firebaseVer"                // Authentication
    compile "com.google.firebase:firebase-messaging:$firebaseVer"           //  Cloud Messaging / Notifications
    compile "com.google.firebase:firebase-config:$firebaseVer"              // Remote Config
    compile "com.google.firebase:firebase-invites:$firebaseVer"             //  Invites
    compile "com.google.firebase:firebase-invites:$firebaseVer"             //  Dynamic Links
    compile "com.google.firebase:firebase-ads:$firebaseVer"                 //  AdMob
    compile "com.google.android.gms:play-services-appindexing:$firebaseVer" //  App Indexing
}

apply plugin: 'com.google.gms.google-services'
```

### Support Library

```groovy
dependencies {
    def supportLibVer = '25.1.0';
    compile "com.android.support:support-v4:$supportLibVer"
    compile 'com.android.support:multidex:1.0.1'
    compile "com.android.support:appcompat-v7:$supportLibVer"
    compile "com.android.support:cardview-v7:$supportLibVer"
    compile "com.android.support:gridlayout-v7:$supportLibVer"
    compile "com.android.support:mediarouter-v7:$supportLibVer"
    compile "com.android.support:palette-v7:$supportLibVer"
    compile "com.android.support:recyclerview-v7:$supportLibVer"
    compile "com.android.support:preference-v7:$supportLibVer"
    compile "com.android.support:support-v13:$supportLibVer"
    compile "com.android.support:preference-v14:$supportLibVer"
    compile "com.android.support:leanback-v17:$supportLibVer"
    compile "com.android.support:support-annotations:$supportLibVer"
    compile "com.android.support:design:$supportLibVer"
    compile "com.android.support:customtabs:$supportLibVer"
    compile "com.android.support:percent:$supportLibVer"
}
```

### Google Play Service

```groovy
dependencies {
    def playServiceVer = '10.0.1';
    compile "com.google.android.gms:play-services-plus:$playServiceVer"
    compile "com.google.android.gms:play-services-identity:$playServiceVer"
    compile "com.google.android.gms:play-services-base:$playServiceVer"
    compile "com.google.android.gms:play-services-appindexing:$playServiceVer"
    compile "com.google.android.gms:play-services-appinvite:$playServiceVer"
    compile "com.google.android.gms:play-services-analytics:$playServiceVer"
    compile "com.google.android.gms:play-services-cast:$playServiceVer"
    compile "com.google.android.gms:play-services-gcm:$playServiceVer"
    compile "com.google.android.gms:play-services-drive:$playServiceVer"
    compile "com.google.android.gms:play-services-fitness:$playServiceVer"
    compile "com.google.android.gms:play-services-location:$playServiceVer"
    compile "com.google.android.gms:play-services-maps:$playServiceVer"
    compile "com.google.android.gms:play-services-ads:$playServiceVer"
    compile "com.google.android.gms:play-services-vision:$playServiceVer"
    compile "com.google.android.gms:play-services-nearby:$playServiceVer"
    compile "com.google.android.gms:play-services-panorama:$playServiceVer"
    compile "com.google.android.gms:play-services-games:$playServiceVer"
    compile "com.google.android.gms:play-services-safetynet:$playServiceVer"
    compile "com.google.android.gms:play-services-wallet:$playServiceVer"
    compile "com.google.android.gms:play-services-wearable:$playServiceVer"
}
```

### LoganSquare

JSONシリアライズ・デシリアライズライブラリ。GSONやJacksonと違って実行時にリフレクションを利用せず、コンパイル時に自動生成されるクラスで処理を行うため、高速。

```groovy
dependencies {
    annotationProcessor 'com.bluelinelabs:logansquare-compiler:1.3.6'
    compile 'com.bluelinelabs:logansquare:1.3.6'
}
```

### Apache Commons

いくつかあるけど、Androidプロジェクトで使うことがあるのは以下のものくらい？

#### Commons IO

InputStreamやファイル読み書きのユーティリティライブラリ。ファイル全体を文字列として読み込んだり、行ごとに処理したり、ファイルやディレクトリをコピーしたり移動したり……といった処理を簡単に書ける。

#### Commons Lang

大抵のプロジェクトで共通して書かれる`if (x != null && x.equals(y))`のような、よくある処理を簡単に書けるようにするユーティリティメソッドライブラリ。

```groovy
dependencies {
    compile 'commons-io:commons-io:2.5'            // Commons IO
    compile 'org.apache.commons:commons-lang3:3.4' // Commons Lang
}
```

### Gson

JSON文字列←→Javaオブジェクトの変換を行うライブラリ。Androidでは動作が遅いと言われているリフレクションを使うのでLoganSquareよりもパフォーマンスが劣ってしまうが、クラスへのアノテーションが不要なので気軽に導入できる。

```groovy
dependencies {
    compile 'com.google.code.gson:gson:2.8.0'
}
```

### AndroidAsync

HTTPクライアント・サーバーのライブラリで、WebSocketクライアント・サーバー、Socket.ioクライアントの実装を含む。アプリ内でHTTPサーバーを動作させて端末のファイルを外部からのHTTPリクエストに応じて送信するような仕組みや、WebSocketでWebブラウザからリモートコントロールするような仕組みが作れる。

```groovy
dependencies {
    compile 'com.koushikdutta.async:androidasync:2.1.9'
}
```