BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JetPackとDropbox Storeを使った最新のAndroidアプリケーションアーキテクチャ

JetPackとDropbox Storeを使った最新のAndroidアプリケーションアーキテクチャ

原文(投稿日:2020/01/20)へのリンク

Dropboxは先頃、現在のAndroid開発者エコシステムにより合うように改良するために、オープンソースのStoreライブラリの所有権を獲得した。 New York Timesがオリジナルを開発した後、CoroutinesFlowをベースにKotlinで書き直されたStoreは、Google JetPackライブラリコレクションとともに、最新のAndroidアプリ開発ソリューションを提供するライブラリである。

JetPaclkの公開時、Googleは、Androidwプラットフォームにおける高品質アプリの開発を促進するという、壮大な目標を掲げていた。その目標に向けてJetPackは、2つの重要なアイデアを持って設計されている。ひとつは、Kotlinの先進的な機能を活用して、プログラマの書かなければならない定型的コードを削減するという目標であり、もうひとつは、Fragments[Activities](https://developer.android.com/guide/components/activities/intro-activities)のように、Android SDKの機能上に高レベルな抽象化を提供することによって、複雑な処理をシンプルに表現できるようにすることだ。

JetPackには独立的に使用可能なコンポーネントが数多く含まれているが、以下の図に示すように、おもにFoudation、Architecture、Behavior、User Interfaceという4つの概念をカバーしている。

JetPackに合わせてGoogleは、Androidアプリの推奨アーキテクチャも公開しており、アプリで一般的に使用するモジュールと、それらが相互にインタラクションする方法について定義している。アーキテクチャを十分に考したAndroidアプリでは、以下のイメージに示すように、関心事の分離(separation of concerns)、モデル駆動UI、モジュールの単一方向依存といったことが実現されている。

JetPackはGoogleの推奨アーキテクチャに従って、Repositoryレイヤを除く、Androidアプリ開発に必要なコンポーネントの大部分を提供している。この点について、Storeを開発したMike Nakhimovich氏が次のように書いている。

Repositoryのサンプルは現時点では数が少ない上、さまざまな実装で動作するような、再利用性のある抽象化もありません。DropboxがStoreを買収した理由はそこにあります — 上記のアーキテクチャモデルにあるギャップを解決するためなのです。

リアクティブデザインを取り入れることで、Storeは、ユーザに"戻る"、"進む"といったナビゲーションを強要したり、あるいは明示的な"更新"操作を求めないような、シームレスな方法によるUIデータのイン/アウトフローが可能なAndroidアプリの開発をサポートしようとしている。

リアクティブなフロントエンドは、現代のモバイルアプリケーションに必要なマルチリクエストスロットリングやディスクキャッシュといった複雑な機能を抽象化するシンプルなAPIを使用して、宣言型データストアをどのように開発できるか、ということを考えさせます。

Dropbox Storeは、簡単に言うと、データ関連のすべての操作を集中化する宣言型インターフェースを使用して、アプリのモデルを外部データソースに結合するためのものだ。ネットワーク使用量の最適化による低減も考慮されている。Kotlinの採用と合わせて、Storeに行われた大きな変更のひとつは、それまでのRxJavaに代えて、Kotlinリアクティブストリームに実装された構造化並行性(structured concurrency)</ a0>パラダイムを採用したことだ。構造化並行性は、エントリと脱出点、およびコントロールフロー全般を明確に定義したプログラム構造を使用して、コンカレントタスクをカプセル化する。コンカレントタスクの使用するすべてのリソースがタスク終了時に適切に解放されることを保証する上で、これは大きな影響を与える、とNakhimovich氏は言う。RxJavaのパブリッシュ/サブスクライブアプローチでは、アンサブスクライブの責任はプログラマにあり、エラーの元になっていた。

バックグラウンド処理を見た場合、RxJavaのアプローチの大きな問題は、disposeコールを忘れやすいという点にある。アクティブなサブスクリプションのdisposeを行わないことは、直接的にメモリリークにつながる。

StoreはTTLとサイズポリシに基いたメモリキャッシュ、ディスクキャッシュ、応答のマルチキャスト、明示的にキャッシュをスキップして新しいデータをデータソースから取得する操作などをサポートしている。

Storeについて詳しく知りたいのであれば、Nakhimovich氏の提供している、APIの入門的ウォークスルーを見るとよいだろう。JetPackの資料は、GoogleのAndroid Developerサイトでアクセスすることができる。

この記事に星をつける

おすすめ度
スタイル

BT