最近のAndroid開発でよく使われているっぽいライブラリまとめ(2021/08)

私は去年から真面目にAndroid開発を始めたのですが、プロダクトの開発で息するように使われているライブラリなどは誰も教えてくれず知るまでなかなか時間がかかりました。この記事ではこれからAndroid開発を始める人向けに今よく使われているライブラリをまとめます。

「よく使われている」は完全に主観です。

## AAC

Android Architecture Componentsの略で、Android Jetpackのコンポーネントの一つです

https://developer.android.com/jetpack?hl=JA

AACに含まれるライブラリの中でも特によく使うものについて紹介します。

####  Data Binding Library

https://developer.android.com/topic/libraries/data-binding/?hl=JA

文字通りデータバインディングに使うライブラリです。私はMVVMでの開発でよく使ってます。XMLにオブジェクトをバインドしたり、後述するLiveDataなどで双方向のデータバインディングもできるので大変便利です。

#### Lifecycle

https://developer.android.com/topic/libraries/architecture/lifecycle?hl=JA

ActivityやFragmentのライフサイクルを管理します。LifecycleObserverを使うとActivityやFragmentのライフサイクルイベントを他のクラスで監視することができるのでとても便利です。

#### LiveData

https://developer.android.com/topic/libraries/architecture/livedata?hl=JA

LiveDataはライフサイクルと連動して、値の変更を通知することができます。私はRxのSubjectを使ってレイヤー間の通知を行っていた部分をLiveDataに置き換えました。双方向のデータバインディングにも利用できて便利です。

#### Room

https://developer.android.com/topic/libraries/architecture/room?hl=JA

RoomではSQLiteをスムーズに使えるようなインターフェースを提供しています。私はそこまでがっつり使ってないのでなんとも言えません。

#### ViewModel

https://developer.android.com/topic/libraries/architecture/viewmodel?hl=JA

ViewModelはActivityやFragmentのライフサイクルと関連づけてUI関連のデータを管理することができます。いわゆるMVVMのViewModelとは文脈が少々異なる物だと思いますが、MVVMでのアプリケーション開発にはとても役立ちます。私はめちゃくちゃ使っています。

#### Navigation

https://developer.android.com/topic/libraries/architecture/navigation.html?hl=JA
  
Fragmentの遷移をXMLで管理することが出来ます。`safeArgs`というプラグインを導入することで、Fragment間のデータの受け渡しを簡単に定義出来るので便利です。


#### Paging

https://developer.android.com/topic/libraries/architecture/paging/?hl=JA

よくある無限スクロールでのページングが簡単に(?)実装できます。

#### その他

- [WorkManager](https://developer.android.com/topic/libraries/architecture/workmanager?hl=JA)
  - ぶっちゃけ使ったことないので知りません

## Jetpack Compose

Jetpack Composeは前述のAndroid Jetpackの一部です。

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

Jetpack Composeを使用するとKotlinのコード上でUIを定義することができます。
Jetpack Composeを使用することで、Webフロント界隈ではスタンダード(?)になっている宣言的UIをAndroidで実現することができます。「よく使われている」かはまだ微妙なラインですが、今後どんどん使われていく流れを感じます。

### accompanist

https://github.com/google/accompanist

Jetpack Composeの様々な拡張が提供されているライブラリです。Jetpack Composeを使っているプロジェクトではかなり使用されているように思います。

## 通信周り

`okhttp + retrofit + RxJava(RxKotlin) + RxAndroid + moshi(gson)` みたいな構成をよく見ます。 最近はcoroutineを使った非同期処理もよく見かけます。

###  HTTPクライアント

#### okhttp

https://github.com/square/okhttp

デファクトでしょう。私はこれが無いと生きていけないです。

#### retrofit2

https://github.com/square/retrofit

RESTをいい感じに扱えるライブラリ。okhttpと一緒に使うことが多し。

### JSONパーサ

一昔前はJacksonが使われていたらしい？

#### gson

https://github.com/google/gson

google製です。よく見ます。私はDeserializerを自分で書かなきゃいけない時など複雑な要件の時に使ってます。

#### moshi

https://github.com/square/moshi

square製です。最近は専らこっちを使ってます。

## 画像

#### glide

https://github.com/bumptech/glide

画像表示には欠かせない存在です。よく見ます。

#### picasso

https://github.com/square/picasso

こっちもよく見ます。体感的にはglideの方が使われてそう。

#### COIL

https://github.com/coil-kt/coil

COILは`Coroutine Image Loader`という意味で、Kotlinのコルーチンを利用した画像ライブラリです。軽量かつ高速です。

## Rx

### RxJava

https://github.com/ReactiveX/RxJava

リアクティブプログラミングというパラダイムのコード記述ができます。学習コストは高いですが覚えると大変便利です。非同期処理用のライブラリだと思われがち。最近は他の技術に置き換える流れを感じますがまだまだ色んなところで使われているし個人的にはこれが無いとかなり辛い。

### RxKotlin

https://github.com/ReactiveX/RxKotlin

RxJavaのKotlin拡張です。KotlinでRxを使うならぜひ導入しましょう。

### RxAndroid

https://github.com/ReactiveX/RxAndroid

Android開発におけるRxJavaでの非同期通信には欠かせない存在です。

## RecyclerView

#### groupie

https://github.com/lisawray/groupie

最近人気すぎて怖い。でも確かに便利です。

#### epoxy

https://github.com/airbnb/epoxy

airbnb製。複雑なRecyclerViewを簡単に構築することができます。DataBindingとも併用が容易で使いやすいです。MvRxなどairbnbの他のライブラリとの相性も良さげ。

## デバッグ関連

### Log代替

#### timber 

https://github.com/JakeWharton/timber

android.util.Logのラッパーです。誰も教えてくれないけどみんな使ってます(主観)。ビルドタイプによる機能の切り替えなどができます。

### メモリ管理

#### leakcanary

https://github.com/square/leakcanary

信頼と実績のsquare製。アプリのメモリリークを検出し、通知します。当たり前のように使われている感じがします。

### 通信ログ周り

#### stetho

https://github.com/facebook/stetho

okhttpに噛ませるとChromeで通信ログなどが見れます。めちゃ便利。

#### flipper

https://github.com/facebook/flipper

Facebook製。Android以外のプラットフォームでも使えます。プラグインを追加することで様々な機能が利用できるようになります。便利〜

### その他

#### Hyperion-Android

https://github.com/willowtreeapps/Hyperion-Android

色々できます。詳しくはこちらの[記事](https://qiita.com/takahirom/items/2f6557f945ddd7c5e074)を見てください。

## DI

Dependency Injectionの略です。最近は知ってて当たり前感があります。[参考](https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f)

#### dagger2

https://github.com/google/dagger

square発google製。めちゃくちゃ使われてます。学習コストはかなり高いと思います。

#### koin

https://github.com/InsertKoinIO/koin

Kotlin実装のDIライブラリ。知名度も上がってきて勢いを感じます。daggerよりわかりやすいので私は好きです。

#### dagger hilt

https://dagger.dev/hilt/

AndroidでDaggerをより簡単に扱えるようにしたものです。前述の通り、daggerはかなり学習コストが高いですが、hiltを使うとかなりシンプルな記述でAndroidアプリにdaggerを導入できます。今後のスタンダードになりそうな予感がします。


## テスト周り

#### mockito

https://github.com/mockito/mockito

モッキングフレームワークです。デファクト感があります。

#### mockk

https://github.com/mockk/mockk

Kotlin実装のモッキングライブラリです。最近見かけるようになりました。


#### spek

https://github.com/spekframework/spek/

Kotlin製のテストフレームワークです

#### truth

https://github.com/google/truth

Google製のアサーションライブラリ。AndroidXのテストのドキュメントでも採用されているようです。

## その他

#### ThreeTenABP

https://github.com/JakeWharton/ThreeTenABP

Androidで日付を簡単に扱えるライブラリ。誰も教えてくれないけど大変便利で使ってる人も多いはず。

## 所感

- Java -> Kotlinの流れを強く感じます(koinとか)
- 最近のAndroid開発ではdaggerやRxなど学習コストの高いものを覚える必要があり、開発を始める敷居が高くなっているように思います
- 「これはみんな使ってるっしょ！」みたいなライブラリがあれば是非教えてください