Android studio の Gradleについて調べてみた

# はじめに

gradleはビルドツールってぐらいの認識であまり深く理解せずに使ってました。
が、いざAndroid StudioをVersion upしてみるとクラッシュしたりコンパイルエラーが取れなくなったりと開発できなくなってしまいました…
このままじゃダメなのでちゃんと理解して開発環境を適切にupdateできるように自分なりに調べてみることにしました。

# gradleとは
素晴らしい記事がたくさんありますので詳細は割愛してポイントだけ箇条書きで。

- gradleはビルドシステム
- Gradleの記述言語はGroovy
- 記述言語はGroovyだけどJavaコードでも書ける
- Product Flavor、Build Typeとかで環境に応じてビルド設定を分けられる
- ビルド依存関係を管理

・・・などなど


参考URL

- [Android studio developer [ビルドを設定する]](https://developer.android.com/studio/build)
- [Gradle入門](https://qiita.com/vvakame/items/83366fbfa47562fafbf4)

# build.gradleについて

今回はとあるアプリを流用改造してスタートしたプロジェクトなので、既存のbuild.gradleがあります。４つも？！そんなにいるの？

調べたら共通の依存関係とか設定とかを上位に置いて、プロジェクト毎の設定は個別に設定できるらしい。なるほど！！


```text
root
  ┣ build.gradle
  ┣ app1
  ┃  ┗ build.gradle
  ┗ app2
     ┗ build.gradle
```
こんな感じでbuild.gradleファイルがいくつか存在する形にできるみたいです。
私が今やってるやつは

```text
root
  ┣ build.gradle
  ┣ app
  ┃  ┗ build.gradle
  ┗ サブプロジェクト
     ┣ app
     ┃  ┗ build.gradle
     ┗ ライブラリ
        ┗ build.gradle

```
こんな感じでサブプロジェクトのbuild.gradleが２つあったので合計４つになっていました。

# build.gradleの編集について

build.gradleはいつもソースコードを直編集してましたが、GUIでの編集もできるみたいです。
というかこちらが正攻法？なのでしょうか？？

[File]→[Project Structure...]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325497/11ed5a31-7087-4387-da25-34d592fc1f05.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325497/9fe18c65-15fa-b62d-8017-de4f43456128.png)

個人的にはソースの方がわかりやすいですけどね。

# build.gradleの記述について

書き方については素晴らしい記事があるのでここでは掻い摘んで記載します。

素晴らしい記事

- [AndroidStudioでGradleを使う際のメモ](https://qiita.com/chikurin/items/0a37c77679422023198d)
- [Android studioにおけるbuild.gradleの設定について](https://qiita.com/kazuhiro1128/items/9279ca432e7a900acdcc)
- [Androidアプリのビルド設定管理（Product Flavor、Build Type）](https://qiita.com/alt_yamamoto/items/7c9546a003984d53637f)


**プロジェクトの共通設定の例**

```groovy

buildscript {
    repositories {
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath 'com.google.gms:google-services:4.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
 } 
```

上の例の場合は**dependencies**でどのライブラリを使うかを指定しています。
そして**repositories**はどこから取ってくるかを書いてあります。
このプロジェクトの場合は全てのプロジェクトでjcenterとgoogleから取ってくる必要があるので**allprojects**で定義しているみたいです。

**アプリのbuild.gradleの例**

```groovy

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'


android {
    // コードを コンパイル/ビルド するのに必要なSDKやbuild-toolのバージョン
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    // マニュフェストエントリ
    defaultConfig {
        applicationId PACKAGE_NAME
        minSdkVersion 23
        targetSdkVersion 28
        versionCode VERSION_CODE
        versionName VERSION_NAME
    }
}

// ライブラリの依存関係
dependencies {
    implementation project(':pnp:library')
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
}
```

**apply plugin**で使うプラグインを指定します。

**android**で括ってコンパイルのSDKのバージョンやgradleビルドツールのバージョンを指定します。
※勘違いしそうですが**gradleのバージョンとgradleビルドツールのバージョンは別物**なので注意です。gradleのバージョンが最新でもgradleビルドツールのバージョンが古いってことがありますのでよく確認しておきましょう。

**defaultConfig**にマニフェスト情報を記述しておくことでビルド時に自動で追加してくれます。
のでここで書いておいた方が良いかなと思います。

**dependencies**に使うライブラリを追記していきます。
使うライブラリ側のREADMEとかに例があるのでそれをみて追記していきましょう。

基本的にはこんなところだと思いますが、実際のプロジェクトの場合はもっと色々な設定があります。

ほぼ必須な設定としてProduct Flavor、Build Typeです。
[Androidアプリのビルド設定管理（Product Flavor、Build Type）](https://qiita.com/alt_yamamoto/items/7c9546a003984d53637f)
デバッグとリリースでアプリのビルド設定を切り替えることができます。例えばDBの向け先を変えたりとか。

他にも色々あるので調べてみるとビルドが快適になること間違いなしです！


# 終わりに
今までなんとなくで使っていましたが、きちんと理解することによって開発がより効率的に進められるようになると思います。そして自分で開発環境の構築もできるようになります。
勉強することたくさんありますが時代に置いていかれないように頑張りますw

ほぼ独学の為、間違い・語弊がありましたらご指摘いただけると幸いです。

# 参考URL
大変勉強になりました。ありがとうございました🙇‍♂️
- [Gradle入門](https://qiita.com/vvakame/items/83366fbfa47562fafbf4)
- [AndroidStudioでGradleを使う際のメモ](https://qiita.com/chikurin/items/0a37c77679422023198d)
- [Android studioにおけるbuild.gradleの設定について](https://qiita.com/kazuhiro1128/items/9279ca432e7a900acdcc)
- [Androidアプリのビルド設定管理（Product Flavor、Build Type）](https://qiita.com/alt_yamamoto/items/7c9546a003984d53637f)