Android Jetpackってなにもの？

# はじめに

Android JetpackがGoogle I/O 2018で発表されましたが、何ができるようになったかわかっていなかったので、今更ながらなにができるようになったのか、なにがJetpackに含まれているのか、についてAndroid Developersに書かれていることを中心にまとめてみました。

# [Android Jetpack](https://developer.android.com/jetpack?hl=JA)とは

Android Jetpackは、Androidアプリの開発を加速させる次世代のコンポーネント、ツール、アーキテクチャガイダンスとしてGoogle I/O 2018で、発表されました。

その実態は、優れたAndroidアプリを作成するためのコンポーネントやツール、ガイダンスなどをひとまとまりにしたもので、既存のSupport LibraryとArchitecture ComponentsもJetpackに統合されています。
ひとまとまりとは言っても、それぞれのコンポーネントは、ライブラリとして提供されているので、開発者が使用したいコンポーネントを、自由に選択してアプリに含めることができます。
また、ライブラリとして提供されているため、Androidプラットフォームよりも高頻度で更新され、常に最新のAndroid Jetpackコンポーネントを使用することができます。

また、Jetpackは新しい名前空間であるAndroidXとなっており、AndroidXを使用するにはTargetAPIを28以上にする必要があります。そのため、Jetpackを使用したい場合は、必然的にAPI28以上にする必要があるということになります。(SupportLibraryはバージョン28.0が最終バージョンです。)

特定のOSバージョンに左右されずに機能を提供できるため、さまざまなバージョンのプラットフォームでアプリを実行でき、古いOSバージョンをサポートしなければいけない場合も、使用することができます。

Android Jetpackは、4つのカテゴリに分類されています。

![https://developers-jp.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html](https://qiita-image-store.s3.amazonaws.com/0/275913/3cfbdac1-2b18-7b04-5c4a-6c787bc0c8f9.png)

## Android Jetpackの特徴

- Kotlinのサポート
  Android Jetpackは、Kotlinを活用しながら使用することができるように設計されています。
  Kotlinをより使いやすくするための便利な拡張機能の集まりであるKTXもAndorid Jetpackに含まれています。
  詳細については後述しますが、Android KTXを追加すると、より簡潔な書き方ができるようになるので、積極的に使うことをおすすめします。


- ボイラーテンプレートの撤廃
  Android Jetpackは、基本的な処理(権限のリクエストや通知、バックグランドでの処理)などの面倒な部分の管理を行ってくれる仕組みを用意してくれています。
面倒な部分はAndroid Jetpackコンポーネントにおまかせして、アプリ独自の機能など、開発者が気になる部分の実装に集中することができます。


- 高品質
  近代的なデザインプラクティスに基づいて構築されているので、後方互換性を維持しながらクラッシュとメモリリークを少なくしています。


# Android Jetpacに含まれるコンポーネント

Android Jetpackのコンポーネントは、それぞれ4つのカテゴリに分類されますが、それぞれのカテゴリは、以下のように説明されています。


- Foundation
  Foundationコンポーネントは、下位互換性、テスト、Kotlin言語サポートなどのクロスカッティング機能を提供します。


- Architecture
  Architectureコンポーネントは、堅牢で、テスト可能で、保守可能なアプリケーションを設計するのに役立ちます。


- Behavior
  Behaviorコンポーネントは、アプリが通知、権限、共有、アシスタントなどのAndroidサービスと統合するのを支援します。


- UI
  UIコンポーネントは、ウィジェットとヘルパーを提供し、アプリを簡単に使うことができるだけでなく使いやすくします。

なんとなくそれぞれのカテゴリに、どんな機能を持ったコンポーネントが含まれているかをざっくり把握できたかなと思います。
具体的にどのようなコンポーネントがあるのかをいくつか取り上げて確認します。

## Fondation

### AppCompat
AppCompatは、下位互換性のためのライブラリで、アクションバーのデザインサポートを追加します。このライブラリには、マテリアルデザインのユーザーインターフェース実装がサポートされています。

### AndroidKTX
AndroidKTXは、Kotlin拡張機能のセットです。いろいろと便利な拡張機能が追加されています。
KTXを使うことで記述が簡潔になる例として、使用頻度が高いと思われるSharedPreferencesとFragmentの例を見てみます。

- **SharedPreferences** 
SharedPreferencesは、KTXを使用することで、値のセットをラムダで行うことができるようになります。

  - Kotlinの場合
  
```kotlin

sharedPreferences.edit()
    .putBoolean("key", value)
    .apply()
```

  - Kotlin + KTXの場合

```kotlin

sharedPreferences.edit {
    putBoolean("key", value)
}
```

- **Fragment**
Fragmentも、Fragmentの管理がラムダの中で行えるようになります。

  - Kotlinの場合
   
```kotlin

suppportFragmentManager
    .beginTransaction()
    .replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
    .commitAllowingStateLoss()
```

  - Kotlin + KTXの場合
  
````kotlin

supportFragmentManager.transaction(allowStateLoss = true) {
    replace(R.id.my_fragment_container, myFragment, FRAGMENT_TAG)
}
````

### Test
UnitテストとUIテストを行うためのAndroidテスト用フレームワークです。
以下のツールが含まれています。

- AndroidJUnitRunner
- Espresso
- UI Automator

Androidのテストについては、PEAKSさんから『[Androidテスト全書](https://peaks.cc/android_testing)』が出ているので、そちらを読んでみてください！

## Architecture

### Data Binding
データバインディングは、レイアウトに各要素を宣言し、アプリケーションロジックと、レイアウトをバインドするために必要なコードを最小限に抑えるためのライブラリです。

以下のサンプルがデータバインディングの例です。


- **レイアウトの作成**

まずは、データバインディング用のレイアウトを作成します。

```xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>
```

データバインディング用のレイアウトファイルは、通常のレイアウトファイルと異なっており、layoutタグ、data要素、view要素のように構成されています。

data要素には、このレイアウトで使用するプロパティを記述します。
view要素では、”@{}”構文を使用した属性プロパティで記述します。


- **データオブジェクトの作成**

次にデータオブジェクトを記述します。
今回は、firstNameとlastNameをプロパティに持つ、Userクラスを作成します。

```kotlin

class User(var firstName: String, var lastName: String)
```

- **データのバインディング**

デフォルトでは、レイアウトファイルの名前をパスカルケース(アッパーキャメルケース)に変換して、末尾に”Binding”をつけたものがバインディングクラスになります。(ex. main_activity.xmlの場合はMainActivityBinding)
実際にバインディングクラスとデータオブジェクトを関連付けるには、以下のように記述します。

```kotlin

override protected onCreate(val savedInstanceState: Bundle) {
  super.onCreate(savedInstanceState)
  val binding: MainActivityBinding
     = DataBindingUtil.setContetView(this, R.layout.main_activity)
  val user = User("firstName", "lastName")
  binding.setUser(user)
}
```

もしくは、以下のように記述します。

```kotlin

val binding = MainActivityBinding.inflate(getLayoutInflater())
```

その他の実装については、以下のドキュメントを参照してください。
https://developer.android.com/topic/libraries/data-binding/

### Lifecycles
Lifecyclesコンポーネントは、アクティビティやフラグメントなどのライフサイクルステータスの変化に対応して、別のコンポーネントでアクションを実行するためのものです。
アクティビティやフラグメントの各ライフサイクルメソッド内には、多くの処理を記述することが多くなる場合があります。
このコンポーネントを使用することで、そのような状態になることを避けることができ、より保守性、可読性の高くすることができます。

### LiveData
LiveDataは、もととなるデータベースのデータが更新された場合、ビューに通知するためのコンポーネントです。

### Navigation
Androidアプリでのナビゲーションの実装を簡単にするためのコンポーネントです。これを使用することで、単一アクティビティのアプリを簡単に作成することができます。
単一アクティビティとは、アプリに含まれるActivityクラスは、1クラスのみで、それぞれの画面の構成は、Fragmentで行うというアーキテクチャです。
Navigation Editorを使用することで、Navigationを使用したレイアウトの画面遷移などの情報を視覚的に表示および管理するNavigationGraphを簡単に作成することができます。

### Room
Roomは、SQLiteをフルパワーで活用しながら、より堅牢なデータベースアクセスを可能にするためのライブラリです。

### ViewModel
ViewModelは、ライフサイクルを意識した方法で、UI関連のデータを格納及び管理するように設計されています。
onCreateからonDestoryまで、データを保持することができるので、画面回転などで再描画がされた際に、ViewModelを使用することができます。
ViewModelは、Android Studio 3.2を使用することで、プロジェクトを作成する際に、テンプレートを選択することができます。
また、Android Jetpackの”Get Start”では、ViewModelを使用したアプリのテンプレートを作成する手順を参照することができます。

### WorkManager
WorkManagerライブラリを使用することで、遅延タスク、非同期タスク、および実行するタイミングを簡単に指定できます。

## Behavior

### Download manager
Download managerは、大規模なダウンロードのスケジュールと管理を行うためのライブラリです。

### Media & playback
メディアの再生とルーティングのための下位互換性のあるAPIです。

### Notifications
通知のための下位互換性のあるAPIです。

### Permissions
アプリの権限をチェックしてリクエストするための下位互換性のあるAPIです。

### Preferences
設定画面を作成するためのAPIです。

## UI

### Animation & Transitions
ウィジェットの移動と画面間の遷移のためのAPIです。

### Emoji
古いプラットフォームで最新の絵文字フォントを使用するためのコンポーネントです。

### Fragment
Fragmentを利用するためのコンポーネントです。

### Layout
さまざまなアルゴリズムを使用してウィジェットをレイアウトするためのコンポーネントです。

# 各コンポーネントの最新のバージョンについて

各コンポーネントの最新のバージョンは、[こちら](https://developer.android.com/jetpack/androidx/versions/?hl=JA#version-table)から確認することができます。


# まとめ

今回は、Android Jetpackに含まれているコンポーネントの一部をまとめました。
Android Jetpackには、さまざまなコンポーネントが含まれており、Support Libraryに含まれていたものも一部含まれています。
イメージ的には、Support Libraryよりも大きな便利コンポーネントのまとまりという感じです。

Android Jetpackを使用することで、いままで苦労して実装していたものが、簡単に実装できるようになる可能性があるため、どんなことを実現するためのコンポーネントが含まれているのかと、今後機能が追加された際にはチェックしておいたほうが良いと思います。
実装方法は知らなくてもどんな機能があるかだけでも知っておけば、自前で実装してしまったあとに「Android Jetpackを使えば簡単に実装できるのか…」などという悲しいことがなくなると思います。

特に気になった、Navigation、Lifcycles、ViewModel、DataBinding、Room、LiveDataについては、それぞれのコンポーネントごとに別途まとめたいと思います。

今回の内容は、ほとんどGoogleさんが用意してくれているAndroid Developersの内容をまとめたものです。
Android Developersには、それぞれのコンポーネントについての資料が用意されているので、気になったものに関してはそちらを見てください。

実際にアプリにAndroidJetpackに組み込む場合のサンプルについては、Techboosterさんの『Jetpack Handbook』が参考になると思います。
https://techbooster.booth.pm/items/948696