Androidテンプレートレポジトリ作ったので晒す


# はじめに
こんにちは！Androidエンジニア3年目のgotlinです。
今回はAndroidのテンプレートレポジトリを作ってみたので、晒してみます。
[チームで育てるAndroidアプリ設計](https://peaks.cc/books/architecture_with_team)を読んでからずっとAndroidのテンプレートレポジトリを作りたかったのですが、どの機能までをテンプレートにいれるか結構悩んだりしてて、最近まぁこのくらいでいいかっていうのが、見えてきたところです。

個人開発レベルのテンプレートリポジトリなので、そぎ落としている部分もあります。

作成したリポジトリは以下です。

https://github.com/goutarouh/BaseAndroidProject/tree/main

移植時の方法もREADMEにあるので良かったら使ってみてください！

# 設定したこと

## Gradle設定周り

### バージョンカタログ
設定は[こちら](https://github.com/goutarouh/BaseAndroidProject/blob/main/gradle/libs.versions.toml)です。
Gradle7.4から安定版になりました、バージョンカタログを利用します。メリットとしては
- 後述するRenovateが利用できる。
- モジュール分割していても、バージョンなどの宣言を一か所に集約できる。
- `buildSrc`を利用した方法よりビルドが速いらしい(この規模だと体感差はありませんが..)
- pluginsやbundlesの定義(関連ライブラリをまとめられる)が可能

導入も簡単で、Gradle7.4からはファイルを作成するだけで勝手に読み込んでくれます。

バージョンカタログに記述す名前は、パッケージ名を全て入れるか、モジュール名だけを入れるかで、いつも悩みます。最近以下の方法で落ち着いてきました。

- appcompatなどのモジュール名だけだと分かりずらい場合
→ パッケージ名の中で一番グルーピングできそうな`androidx`だけとって、`androidx-appcompat`にする

- hiltなどモジュール名だけでも比較的分かりやすい場合
→ そのまま`hilt-android`

### 初期ライブラリについて
[build.gradle](https://github.com/goutarouh/BaseAndroidProject/blob/main/app/build.gradle.kts)を見てもらえれば分かりますが、`Compsose`と`Hilt`は使えるようにしています。
この二つはどのようなケースのAndroidアプリを作るにしても使いたいですし、使えると思っています。
ネットで見つけたよさげなサンプルコードを実際に動かしてみたい！って思った時にHiltがなくてもできなくはないですが、やはり本番さながらのコードに近い状態で書けます。`Application`クラスを作って、`@HiltApplication`を設定して...など毎回やるのは面倒なので、定義していた方が良いと思います。

### ビルドロジックについて
最近は`Composite Build`で各モジュールのビルドロジックをまとめるのが流行りでしょうか？ ([Compposing build](https://docs.gradle.org/current/userguide/composite_builds.html))
大きなプロジェクトでは恩恵を受けられるのかもしれませんが、私はやりすぎなのかと考えています。
まぁ一度設定すればあまり修正の必要がないとはいえ、どうしてもやや複雑になるので避けました。

ただしビルドロジックの集約という観点ではSDKバージョンは集約できるようにしました。個人的にモジュール事にこの値を変更するのはやや面倒なので。。

あまりネットにはない？ような気がするのですが、 `build.gradle`で定義する`minSdk`や`targetSdk`はバージョンカタログの値を利用できます。

バージョンカタログで以下のように記述します。
```toml
[versions]
...
compileSdkVersion = "33"
minSdkVersion = "26"
targetSdkVersion = "33"
...
```

そして`build.gradle`側では以下のように設定します。
```kotlin
minSdk = libs.versions.minSdkVersion.get().toInt()
targetSdk = libs.versions.targetSdkVersion.get().toInt()
```

### `build.gradle`のkts化
ここはたいして説明することはないですが、最近はほどほどのケースでkts化しておいた方が良いのではないでしょうか？サンプルなどもktsのものが増えてきたと思いますし、プロジェクト作成時にktsに変更するのも面倒なので、テンプレートレポジトリでkts化しておくと楽です。

### Renovateの導入
[ここ](https://docs.renovatebot.com/getting-started/installing-onboarding/)が公式ドキュメントです。ポチポチ設定してたら、自動で[こんな感じの設定PR](https://github.com/goutarouh/BaseAndroidProject/pull/1)を作ってくれます。

そしてライブラリバージョン更新のためのPRを[こんな感じ](https://github.com/goutarouh/BaseAndroidProject/pull/2)で自動で作ってくれます。

個人開発はライブラリバージョン上げ等がおろそかになりがちなので非常に助かりますし、自分でRelease Noteを見に行かなくてもある程度把握できるのでとても便利です。

## CIの設定
設定は[こちら](https://github.com/goutarouh/BaseAndroidProject/blob/main/.github/workflows/Build.yaml)です。

Lintチェックやビルド、ローカルテスト、インストルメントテストなどを回しています。個人ではこのくらいチェックしておけば十分だと思っています。(本当はスクショチェックとかも導入してみたいなぁ。。)

前述したRenovateが作成したPRをそのままいれるのは怖いので、
1. 自動PR内ののリンクにあるRelease Noteを自分で読んで問題なさそう
2. CIが通る

が確認できたらPRをmergeするようにしています。



## PULL_REQUEST_TEMPLATE
Android関係ないので書くか悩みましたが、念のため書いておきますw
設定は[こちら](https://github.com/goutarouh/BaseAndroidProject/blob/main/.github/PULL_REQUEST_TEMPLATE.md)です。
まぁ個人開発でもこのくらいは書いておくと、後で見返しやすいので便利です。この実装どうやってやったんだっけ？みたいなときにたまに使えます。

# おまけ: Template Repositryを実際に利用する。

1. リポジトリの設定から`Template repository`にチェックを入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2130833/f7b8909e-4ae3-f64e-4d85-411d03a7d786.png)

2. レポジトリのTOPで「Use this template」→「Create a new repository」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2130833/702cf9a5-2774-adaa-8ef7-4817dc6cfdbc.png)

3. 各種設定を新プロジェクト用に変更する。
[README](https://github.com/goutarouh/BaseAndroidProject)に書きました。
(この辺りの設定変更、スクリプトとかで自動でできるのか？)


# 終わりに
今回は結構前からやりたいと思っていた、Androidテンプレートリポジトリを作って紹介してみました。

結構前の転職活動でアプリ制作の課題があったのですが、オレオレのビルド設定やプロジェクト設定をしていたらそれだけで一日使ってしまい、後悔しました。簡単なアプリを作ろうと思った時もどうしても毎回設定することってありますし、テンプレートリポジトリがあるだけで、ストレスなく本当にやりたい作業に入れると感じております。

他にもおすすめのAndroidテンプレートリポジトリの設定などあったら教えてください！