Androidアプリ開発を始める 2019年春版 ライブラリ編

前回の記事から分離。

dr1009.hatenablog.com

2019年現在、よく使われるライブラリと過去使われているために現在知見が求められがちなライブラリについて、独断と偏見で選んで簡単にまとめてみました。

Android Architecture Components

developer.android.com

2017年のGoogle IOで発表された、Googleが提供するフレームワーク群です。 Androidの各ライフサイクルコールバックの再整理をベースに、DBや画面遷移などの様々なAndroid固有処理のライブラリを提供しています。

このうち、下記2つは(すぐには使わなくとも)確認しておくと後ほど便利です。

そのほか、不揮発性のDBを組みたい場合にはRoomを、Fragmentによる画面遷移を考えたい場合にはNavigationを確認すると良いと思います。

既存プロジェクトでは歴史的な経緯や、技術的にどうしても譲れない箇所が発生することがあるため、必須のライブラリとは言えません。 一方で新規に特殊な制約のない環境でアプリ開発を行うのであれば、LiveDataとViewModel程度は導入することになるのではないかと思っています。

Network

通信処理に関連するライブラリ。

OkHttp3 + Retrofit2

ど定番。

square.github.io

square.github.io

OkHttp

v3.13 から対応OSがAndroid 5.0 以上に引き上げられたことが記憶に新しい、HTTP通信用のデファクトスタンダードライブラリです。 なお、AndroidだけでなくJavaアプリケーションでも利用できます。

OkHttpはRetrofitだけでなく、KtorGlideなどのライブラリで組み合わせて利用する方法が提供されています。 なぜOkHttpがデファクトスタンダードになったかは、下記のような歴史的な経緯が大きいです。時代を感じます。

qiita.com

Retrofit

Retrofit turns your HTTP API into a Java interface.

RetrofitはHTTP API(GETやPOST, PUTやDELETEなど)をルールに則りinterfaceクラスとして定義することで、Annotation Processorによりコードを自動生成することができるライブラリです。 開発者としてはサーバーサイドAPIに合わせたinterfaceクラスを作成するだけで通信処理を記載することができるため、大幅なボイラーコードの削減を行うことができます。

Adapterと呼ばれるオプションを追加することで、RxやGsonなどの様々な処理を追加することもできます。 OkHttpとRetrofitがなければ、アプリ開発がままならなくなる現場も多いはず。それだけ重要度も知名度も高いライブラリです。

Image

どうしてもキャッシュしたいけどキャッシュ処理を書くのが厄介なネットワーク越しの画像取得をあれこれしてくれるやつ。

bumptech.github.io

square.github.io

機能比較は色々なところでされていますが、日本語文献でよく参照されるのは下記の記事だと思います。

qiita.com

PicasoとGlideはAPI設計が似ているので、どちらかを使っていればもう一方にスイッチするのも簡単だと思います。 設定を見る限りGlideの方が設定できる項目が多いのですが、特に設定しないようであればどちらを利用しても大差がないのではないか、と感じます。

更新頻度で見るとGlideの方が活発ですが、Picasoは機能がシンプルなのでそこまで差は無いのではないでしょうか。 なお、個人的にはGlideを利用する傾向があります。

Android固有の問題対応

Androidのバージョン差に対応するタイプのライブラリです。

Permissions Dispatcher

Android 6.0(Android M)より導入されたRuntime Permission対応を簡単に行うことができるライブラリです。

github.com

Runtime Permissionについては下記の公式ドキュメントを参照してください。 「カメラやストレージへのアクセス、位置情報取得などの際にユーザーに認証を求める機能」と書けば、ユーザーとして利用したことがあるはずです。

developer.android.com

Runtime Permissionに対応する際には、まずPersmissions Dispatcherの利用を検討してください。

ThreeTenABP

最低対応OSをAndroid 7.0(Android N)以前とすると、Java 8の機能を全て使うことはできません。*1

特に困るのは、日付型の扱いです。

Java 8よりLocalDateなどのTime APIが追加されました。 これらのTime APIAndroid 7.0未満をターゲットにしたアプリで利用できるようにするライブラリが、ThreeTenABPとなります。

github.com

Time APIによる日付の扱いが非常に優秀なため、多くのケースで利用するライブラリになります。

Dagger2 or Koin

DIについては下記ブログを参照してください。

kobakei.hatenadiary.jp

DIを行う際に利用されるライブラリは、DaggerとKoinに絞られている印象があります。*2

google.github.io

github.com

RxJava

非同期処理のデファクトスタンダードとしてRxが利用されていた(されている)ため、必須となることが多いライブラリです。 Android用のRxAndroidと合わせて利用されることが多くなります。

github.com

github.com

ただKotlin Coroutinesが登場したことで、本当に必要な場合にのみRxJavaが利用されるケースが増えるのではないか、と個人的に感じています。 Kotlin Coroutinesだけで済むのであれば、あえて入れる必要はないのではと思います。

古いコードを読み解くために

おそらく新しく作るプロジェクトでは利用することはないが、既存プロジェクトのリーディングなどでよく出会うライブラリです。

ButterKnife

jakewharton.github.io

findViewBy を省略できるライブラリです。 最近では同じ目的でもDataBindingライブラリが使われる場合が多い印象です。

developer.android.com

@BindView というアノテーションが見えたら、ButterKinifeを調べてみてください。

Realm

realm.io

AndroidのORMの歴史は少々複雑なため、下記の記事などを参照してみてください。

academy.realm.io

gfx.hatenablog.com

Realmは非常に優秀なライブラリなのですが、個人的にはアクセスするスレッドの管理などが難しいなと感じることもあり、新規に採用するならRoomかOrmaにするかなと思います。 RealmObjectを継承したクラスが現れたら、Realmについて簡単に調べてみてください。また、iOS版とは雰囲気がだいぶ異なるので参考にする文献には注意が必要です。。。

終わりに

簡単にまとめるつもりが5000字近くになってしまった。。。 ライブラリ選びの参考になれば幸いです。 なにかありましたら、ぜひコメントしちゃってください。

*1:ラムダ式などの機能は利用することができます。 詳しくは

Use Java 8 language features  |  Android Developers

を参考にしてください。

*2:Daggerしか使ったことないです