【Android】Jetpack、AndroidX、Architecture Componentsなどの用語や関係性を整理する

Android の [Architecture Components](https://developer.android.com/topic/libraries/architecture/) を使ってみたくて情報を調べていたら、「Jetpack」「AndroidX」などの用語も合わせてよく見かけた。Android 開発経験が1年に満たない自分には、まだこれらの意味や関係性がピンと来ていなかったので、この機会に一通り調べて整理してみた。

※自分なりに解釈したものなので、もし間違っているところがあればコメントなどをください:pray:

# Android Jetpackとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/3de2cda6-5d43-5b18-a3ee-7b93bd6cbd4e.png)


https://developer.android.com/jetpack

> Jetpack は、高品質の Android アプリをデベロッパーが簡単に作成するための一連のライブラリ、ツール、およびガイダンスです。

**Android Jetpack** とは、Google 公式の「Android 開発のベストプラクティス集」のようなもの。「思想」と言ってもいいかもしれない。「思想」にとどまらず、実際にそのベストプラクティスを実現するためのツールやライブラリも提供されている:pray:

## Jetpackの構成要素（コンポーネント）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65644/c33489bd-4151-bf8b-fcdc-0e689d3633fa.png)


https://developer.android.com/jetpack#android-jetpack-components

Jetpack という思想に含まれる構成要素は、上記のスクリーンショットからもわかるように色々ある。大きく4種類に分類される。

* **基盤 (Foundation)** Kotlin向けの拡張、テストなど。
* **アーキテクチャ (Architecture)** Jetpackの目玉。ViewModelやLiveData、Navigationなど、実践的なアプリでよく使われるパターンが公式にライブラリ化されている。
* **動作 (Behavior)** Androidが提供するサービス（カメラ、通知など）へのより良いアクセス方法。
* **UI** UI向けの便利機能。アニメーション、絵文字、フラグメントなど。

「Architecture Components」は、↑の2番目のコンポーネント群のこと。Architecture Component の詳細は後述する。

# AndroidXとは？

https://developer.android.com/jetpack/androidx

> AndroidX は Android チームが  [Jetpack](https://developer.android.com/jetpack?hl=JA)  内でのライブラリの開発、テスト、パッケージ、バージョン管理、リリースに使用しているオープンソース プロジェクトです。

**AndroidX** とは、Jetpack という「思想」のリファレンス実装のようなもの、と解釈した。`androidx.*` という名前空間のライブラリ群で構成されていている。

たとえば、Jetpack の一部に[ナビゲーション](https://developer.android.com/guide/navigation)というコンポーネントがあるが、AndroidX での実装が [`androidx.navigation` ライブラリ](https://developer.android.com/jetpack/androidx/releases/navigation)として提供されている。

Android のプラットフォーム API (`android.*`) を基盤にしているが、それとは独立したバージョニングになっている。

Jetpack、AndroidX、プラットフォーム API の関係は以下のようになる（と考えられる）。

```
Android Jetpack: 思想

↓ リファレンス実装

AndroidX: ライブラリ(androidx.*)

↓ 基盤

Android プラットフォーム API (android.*)
```



# Android Architecture Components

> Android アーキテクチャ コンポーネントは、堅牢でテストとメンテナンスが簡単なアプリの設計を支援するライブラリのコレクションです。

https://developer.android.com/topic/libraries/architecture/

Jetpack の一部で、おそらく一番の目玉が **Arcitecture Components**。関心の分離、ビューモデル、データバインディングなど、「良い」アプリで実践されているアーキテクチャのパターンがまとめられている。

Jetpack の一部なので、Architecture Components 自体は「考え方」の集合。以下のページを見るとわかりやすい。
https://developer.android.com/jetpack/docs/guide

とはいえ考え方だけでなく、それを実現するための実装にもちゃんと触れられている。

## Architecture Componentsの始め方

本筋とは若干逸れるが、Architecture Component についてもう少し掘り下げて調べた時の参考資料も載せておく。

* [アプリのアーキテクチャガイド](https://developer.android.com/jetpack/docs/guide)
	* まずはこれを見る。前半は、Architecture Componentsのベースになっているアーキテクチャ思想の紹介。これ自体はAndroidXを使わなくても一般的に適用できる原則。後半はそのアーキテクチャをAndroidXで実現する方法の概略。ViewModel、LiveData、DI (Dagger 2)、Roomなどの紹介。
* [アーキテクチャ コンポーネントの新機能（Google I/O '19）（動画）](https://www.youtube.com/watch?v=Qxj2eBmXLHg&hl=JA) 
	* Architecture Componentsが何を解決するのか、問題点と比較しながら解説されている。一回ざっと見ると良い。
* [ライフサイクル](https://developer.android.com/topic/libraries/architecture/lifecycle?hl=JA)、[LiveData](https://developer.android.com/topic/libraries/architecture/livedata?hl=JA)、[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?hl=JA)、[Room](https://developer.android.com/topic/libraries/architecture/room?hl=JA)などの主要機能を深堀りする。適宜ググって第三者の情報で補っても良い。

# まとめ

* Android Jetpackが一番大きな概念で、Android開発のベストプラクティス集のようなもの。
* Jetpackはいくつかのコンポーネント群で構成されていて、そのうちの1つのコンポーネント群が Architecture Component。
* AndroidXは、Jetpackの思想に則って実際にアプリを作るためのライブラリで、いわば「Jetpackのリファレンス実装」のようなものと考えられる。