torutkのブログ

ソフトウェア・エンジニアのブログ

Androidアプリケーションプログラミングを5年振りに

はじめに

Androidアプリケーションのプログラミングは5年前に半年ちょっと程の期間取り組んで以来となります。

2015年初頭のAndroid開発環境は、最新OSがAndorid 4.4(KitKat)から 5.0(Lollipop)になった頃で、開発環境はそれまで主流のEclipseからAndroid Studioに移行が始まった頃です。

Javaは、Java SE 8仕様のJDK 8がリリースされ1年、ラムダ式が導入された等話題となりましたが、Android開発環境へのJava SE 8は進展がほとんどありませんでした。

2015年のAndroidアプリケーション・アーキテクチャ

画面レイアウトをXMLで記述し、アクティビティ、ブロードキャストレシーバ、サービス、コンテンツプロバイダと4種類のコンポーネントを必要に応じて組み合わせてAndroidアプリケーションを構成していました。

画面レイアウトがView、ActivityがController、コンテンツプロバイダがModel1となるMVCアーキテクチャと認識されていたようです。ただ、Activityがかなり頑張るファットコントローラーになっていました。

Activityの肥大化を抑制するため、Butter Knife、EventBusなどのライブラリが作られ割と広まっていたようです。 Modelのデータを永続化する際は、SQLiteアクセスを簡単にするORM(Object Relation Mapper)ライブラリがいくつかありました(例:Active Android)。

画面遷移を伴うアプリケーションでは、Activityを複数用意してIntentで切り替えるのではなく、Fragmentを導入して画面の一部を切り替えることが推奨でした。

この頃のアプリケーション実行はDalvik VMで、DEXファイルにはメソッド総数の制限等がありました。

5年振りのプログラミング(リハビリ期)

まず、開発環境としてAndroid Studioをインストールします。現時点での最新リリースバージョンは4.0.1でした。

アプリケーション実行はDalvik VMに替わりARTとなっていますが、ARTも初期のAOT(Ahead Of Time Compile)だけではなく、JITも取り入れたハイブリッドとなっていました。

Java SE 8(JDK 8)対応も進んでおり、ラムダ式(メソッド参照)、デフォルトメソッド等のJava SE 8言語仕様やJava SE 8の標準ライブラリを取り込みつつあります。これは朗報です。

また、Kotlin言語の使用も随分浸透しているように見えます。

いい感じに成熟してきているではないですか。

2020年のAndroidアプリケーション・アーキテクチャ

それでは、次はアプリケーションの構成をどうしようかと考えはじめてみたところ、

MVP、MVVM、DataBinding、LiveData、Jetpack、Room、DDD、Clean Architecture、‥‥と怒涛のようにキーワードが噴出してきました。

MVPとMVVMは、GUIアプリケーションを作成する際のアーキテクチャパターンで、Windows等のデスクトップアプリケーションでは以前から登場していたパターンです。DDDはドメイン駆動開発の略ですし、Clean Architectureはロバート C. マーチン氏の著になる書籍です。これらがAndroidアプリケーションのアーキテクチャの文脈に揃って出てきているのに驚きを覚えました。いったい何が起きているんだろう?

状況を整理するには、Jetpackを中心に調べるのがよさそうです。というのは、JetpackはGoole I/O 2018で発表された、次世代のコンポーネント、ツール、アーキテクチャガイダンスであり、今後のAndroidアプリケーション開発の指針およびライブラリ集となる存在です。DataBinding、LiveData、Room2 といったライブラリもJetpackに含まれています。 ViewModelライブラリも含まれ、これはどうやらMVVMパターンを構成するようです。その他お馴染みの Support Libraryも含まれます。

ということで、今後のAndoridアプリケーション・アーキテクチャはこのJetpackに沿っていくものと思われます。これから新規にアプリケーションを作成する際は、Jetpackのガイダンスとライブラリ集を利用するのがよいようです。

参考資料

developer.android.com

developer.android.com


  1. 別なアプリケーションとModelを共有せず、そのアプリケーション内で使うだけならばコンテンツプロバイダでなくPOJO(ふつうのJavaクラス)で実装する

  2. RoomはSQLiteを利用するORMで、@Entity、@Dao、@Database の3つのクラスでデータベースアクセスを実装