Flutterの学習 - 構成の理解

こんにちは！

前回までに、以下の記事を書きました。
- [開発環境の構築](https://qiita.com/yam_dev/items/f58dc02260df7aa053ed)
- [簡単なGeminiアプリの起動](https://qiita.com/yam_dev/items/c069680e1deb669c109b)

今回は、構成について理解します。

# テンプレートで起動した直後の構成
Geminiアプリのテンプレートで起動した際に、以下のディレクトリ構成になりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/f645b023-fb0a-495e-66ae-16d22021d6a8.png" width="400px" />

各ディレクトリについて、役割を調べてみます。

# 各ディレクトリやファイルの役割

簡単に言うと、appフォルダにアプリの本体が、Gradle Scriptsにビルドに関する設定が入っています。
開発においては、主にappフォルダ内のKotlin/Javaコード(kotlin+java)とリソース(res)を編集します。

**app:**
アプリケーションのメインモジュール。
コード、リソース、設定ファイルなどが含まれます。

**manifests**
アプリケーションのマニフェストファイル(AndroidManifest.xml)を格納。
アプリの権限、コンポーネント、メタデータなどを定義します。
![スクリーンショット 2024-11-17 9.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/1f04be64-ef46-c540-4772-e55b108dea5a.png)

**kotlin+java:**
KotlinとJavaのソースコードを格納。
アプリのロジックを実装します。
![スクリーンショット 2024-11-17 8.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/0af90e23-8b99-9ccb-48eb-f668781ad1f7.png)

**java (generated):**
自動生成されたJavaファイル。
通常、直接編集する必要はありません。
![スクリーンショット 2024-11-17 9.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/3f57e748-f51a-a2f3-6a11-9c2bbb8d1e1f.png)

**com.example.mygeminiapp:**
アプリのメインソースコード。
![スクリーンショット 2024-11-17 9.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/8e2af05d-1987-3d5e-b32e-853ba1a0a00a.png)

**com.example.mygeminiapp (androidTest):**
Android Instrumentationテストのコード。
実機またはエミュレータ上で実行されます。
![スクリーンショット 2024-11-17 9.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/679d6722-ae24-ddb0-5a90-eb02d12d1f49.png)

**com.example.mygeminiapp (test):**
ローカルユニットテストのコード。
開発マシン上で実行されます。
![スクリーンショット 2024-11-17 9.08.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/7ac47dd7-9d80-2020-75af-6c952078be52.png)

**res:**
アプリのリソースファイルを格納。
![スクリーンショット 2024-11-17 9.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/dd56365c-f904-4dee-8f98-9a5f65fef64d.png)

**drawable:**
画像ファイルなどを格納。
![スクリーンショット 2024-11-17 9.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/71d8baef-036c-e9ef-58ed-634c280c5628.png)

**mipmap:**
アプリのアイコンを格納。
異なる解像度のアイコンを用意することで、様々なデバイスで適切な表示を実現します。
![スクリーンショット 2024-11-17 9.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/62b2ba9e-c9b1-5432-30cd-bc73d7ebeb13.png)

**values:**
文字列、色、スタイルなどのリソースを定義するXMLファイルを格納。
![スクリーンショット 2024-11-17 9.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/99e89ee1-ac87-e304-4e96-64fa01ed0301.png)

**xml:**
その他のXMLリソースファイルを格納。
![スクリーンショット 2024-11-17 9.18.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/e84985df-ea2c-6c84-aa0e-9d7085801d81.png)

**res (generated):**
自動生成されたリソースファイル。
通常、直接編集する必要はありません。
![スクリーンショット 2024-11-17 9.22.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/a20d82d5-6784-a31d-84bf-8368af82b7c0.png)

**Gradle Scripts:**
プロジェクトのビルド設定ファイルを格納。
![スクリーンショット 2024-11-17 9.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/1c53cadb-3d92-b9c6-176b-fab3e7fcfae5.png)

**build.gradle.kts (Project: My_Gemini_App):**
プロジェクト全体のビルド設定。
依存関係、プラグインなどを定義します。
![スクリーンショット 2024-11-17 9.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/31416dc4-9f06-483c-e150-81fba2cf448c.png)

**build.gradle.kts (Module: app):**
appモジュールのビルド設定。
モジュール固有の依存関係、設定などを定義します。
![スクリーンショット 2024-11-17 9.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/289b11a2-8f50-d99f-3be5-a88999d0cce6.png)

**proguard-rules.pro:**
ProGuardの設定ファイル。
コードの難読化、最適化、サイズ削減などを設定します。
リリースビルド時に使用されます。
![スクリーンショット 2024-11-17 9.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/685a80a2-c27b-6178-4372-5f4a7db658f7.png)

**gradle.properties:**
プロジェクトレベルのプロパティを設定するファイル。
![スクリーンショット 2024-11-17 9.26.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/5b24fdb2-0004-e553-53d8-1eca456937df.png)

**gradle-wrapper.properties:**
Gradle Wrapperの設定ファイル。
プロジェクトで使用するGradleのバージョンを指定します。
![スクリーンショット 2024-11-17 9.26.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/564352e0-e68e-9fa9-25ac-cef6fd03dafd.png)

**libs.versions.toml:**
依存ライブラリのバージョンを管理するファイル（Version Catalog）。
![スクリーンショット 2024-11-17 9.27.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/f56505db-39e8-3ca5-5d17-064500bb0288.png)

**local.properties:**
通常、このファイルはバージョン管理システムには追加しません。
Android SDKのローカルパスなどの、マシン固有の設定情報を格納します。
![スクリーンショット 2024-11-17 9.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/a2773297-a4be-168d-be9d-81a112084837.png)

**settings.gradle.kts:**
マルチモジュールプロジェクト（複数のモジュールで構成されるプロジェクト）の構成を定義します。
![スクリーンショット 2024-11-17 9.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/b32bdafa-5a0b-d162-c567-90a6942bc79e.png)

# おわりに
今回は、Android Studioで作成したプロジェクトの構成について理解しました。

次回はカスタマイズして、さらに理解を深めます。