gradleのファイル多すぎて訳わからん【Android】アプリ開発【Flutter】


いっぱいある gradle ファイルをまとめてみました。

- gradle/wrapper/gradle-wrapper.properties
- gradle.properties
- settings.gradle
- build.gradle
- app/build.gradle

# そもそも gradle とは?

元々は Java 言語向けに作られたツールで、書いたコードをまとめたり、足りないライブラリをダウンロードしてきて製品を作り上げてくれます(ビルドツール)。最近よく使われる Kotlin 言語も Java 言語と同じ仕組みの上で動いているので Android 開発では公式に採用されています。

# それぞれのイメージ

Gradle をサンタさん、プロジェクトを家、アプリをその家の子供だとしましょう。
Gradle は必要なものを子供に届けてくれる役割をします。

![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/87045c8e-35e7-419c-861c-2a6a8acf5571.png)

## gradle/wrapper/gradle-wrapper.properties
Gradle そのものを準備してくれます。
node.js に対する .nvmrc Flutterに対する .fvmrc, みたいな役割です。(...伝わるかな)
サンタさんを召喚してくれるようなイメージです。

![1.wrapper.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/819fa3c9-058a-b1c3-22b8-9716783ba957.png)


## gradle.properties
これから使う Gradle の設定です
パソコンのスペックや開発スタイルに合わせて処理速度や省エネみたいなことを設定可能で、
Git の config のようにスコープ(PC全体,ユーザー毎,プロジェクト毎)の設定も可能です。
サンタさんの移動速さ、服の色、袋のサイズのようなイメージです。

![2.properties.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/95cf860d-63a2-726b-8d0c-66cfc96e4baf.png)


## settings.gradle
プロジェクト同士の関係図を定義します。複数のプロジェクトの連携を設定するための設定です。「プロジェクト」と呼んでいるものは曖昧で、「この Gradle が担当する範囲」くらいの意味です。
この家には配らない、とか、この家とこの家はこの道で繋がってるよとか、このサンタさんが担当する範囲、のような意味合いで設定を書き込みます。

![3.settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/cf86845f-3889-b9bf-2d5f-b1354f6e071f.png)


## build.gradle
Gradle の中心的なファイルであり、このフォルダに対するビルドの手順書です。
このアプリ専用の設定で、ライブラリのバージョンや、どこからダウンロードするか。サポートOSバージョンなどを記述します。
何時ごろに、どの煙突から入って、どの玄関から入って、どのプレゼントを渡すかのような記述をします。

![4.build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/6cd9f930-b52b-622b-6a70-4f97cefa1954.png)


## xxx/build.gradle
より個別のモジュールに対するビルドの手順書です。
同じ家でも子供が複数いたり部屋が分かれているときは、それぞれ個別の設定をここに書きます。
多くの場合1人しか子供がいないようなアプリ構成(appフォルダだけ)で作るので実質的には app/build.gradle を編集することが多いかと思います。

![5.sub-build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/1ab833ff-96de-0cef-42d2-eb8a4c2b1ce3.png)


実際にアプリを実行するときもこれらと同じ順番に読み込まれていきます。

gradle/wrapper/gradle-wrapper.properties
↓ 
gradle.properties
↓ 
settings.gradle
↓ 
build.gradle
↓ 
app/build.gradle
  

先に `.properties` 系
後に `.gradle` 系
が読み込まれるんだなと覚えておきましょう。



  
# 記述方法

## .properties 系

ただのキーバリュー形式です。

```
A=1
B=2
C=3
```

## .gradle 系

歴史が古く、言語や書き方が数パターンあります。

- Groovy 言語 or Kotlin 言語
- 旧式 or 新式

## Groovy 言語 or Kotlin 言語

*厳密には gradle 向けに調整された言語 (DSL) になっています。

### Kotlin 言語
- 拡張子は `.gradle.kts`
- 新しい言語なので将来性 👍
- Android Studio などとの連携の便利さ 👍
- よくあるプログラミング言語っぽい書き方ができる

```
// 関数の引数にはカッコをつける
myFunction(30)

// 代入はイコールでつなぐ
myValue = 30
```

### Groovy 言語
- 拡張子は `.gradle`
- ビルド速度はまだ Kotlin より早い。若いもんには負けん (2024年現在)
- シンプルな書き方ができる

```
// 関数の引数は空白で区切る
myFunction 30

// 代入も空白で区切る
myValue 30
```


## 旧式 or 新式

スマホアプリ開発のとき、この2種類の書き方を知っておくと混乱しません。調べて出てきた記事と自分のアプリで全然違う書き方になってるってことありますよね。

### 旧式 (Kotlin言語版)

```
// build.gradle
buildscript {
    repositories {
        xxx()
        yyy()
    }
    dependencies {
        classpath("xxx.xxx:1.2.3")
        classpath("yyy.yyy:1.2.3")
    }
}

// xxx/build.gradle
apply(plugin: "xxx.xxx.xxx")
apply(plugin: "yyy.yyy.yyy")

// settings.gradle
...なし...

```

### 新式 (Kotlin言語版)

```
// build.gradle
plugins {
   id 'xxx.xxx' version '1.2.3' apply false
   id 'yyy.yyy' version '1.2.3' apply false
}

// xxx/build.gradle
plugins {
   id 'xxx.xxx.xxx'
   id 'yyy.yyy.yyy'
}

// settings.gradle
pluginManagement {
    repositories {
        xxx()
        yyy()
    }
}
```


この2つは同じ意味になります。新式では settings.gradle が追加されていますね。

具体的に何を書いてあるのかは、また別の記事でやりましょう。
これらを知っておくだけで、何かエラーが出たときの対応が少しスムーズになるはずです。

それでは！