2019年2月7日から8日の2日間にわたり、ベルサール新宿グランドにてDroidKaigi 2019が開催されました。5度目の開催となる今回も、国内外から1,000名を超える参加者が集うカンファレンスとなりました。今回は一部のセッションに対して同時通訳やライブ配信の実施、またオリジナルのCodelabsが提供されるなど、これまでにない新しい試みもありました。
応募されたセッションは国内外合わせ350件を超え、今回も幅広いジャンルのセッションが採択されました。昨年2018年5月に開催されたGoogle I/O 2018で発表されたAndroid Jetpackに関するセッションや、DroidKaigi公式アプリでも採用されていたマルチモジュールに関するセッション、FlutterやKotlin/Native、PWAといったクロスプラットフォーム開発に関するセッションなど、全部で87のセッションがありました。
本稿ではそれらのセッションから、「Navigation Architecture Componentによるアプリ内遷移の管理」と「マルチモジュールプロジェクトでのDagger2を用いたDependency Injection」の2つをピックアップして紹介します。
Navigation Architecture Componentによるアプリ内遷移の管理
このセッションは、昨年のGoogle I/O 2018で発表されたAndroid Jetpackの1つであるNavigation Architecture Componentをテーマにした発表です。5つの原則などの概要の説明から始まり、実際にプロジェクトで利用する際の流れをStep-by-stepで解説し、さらに踏み込んだ内容としてマルチモジュールプロジェクトにおける問題点とその解決策を提示しました。
アプリケーション開発においてほぼ避けて通れない道である画面遷移は、アプリケーションが大きくなればなるほど複雑になりがちです。講演者の@yt_hizi氏は画面遷移において、以下の複雑性に由来する既知の問題があると述べました。
- FragmentTransactionの取り扱い
- DeepLinkでのバックスタック形成
- 画面間の引数渡し
- Up & Backの制御
Navigation Architecture Componentは前述の問題解決に有用です。Navigation Architecture Componentは、FragmentTransactionやDeepLinkを自動的にハンドリングしてくれることで画面遷移の実装がより簡単になったり、SafeArgsによって前後の画面での値渡しをより安全に行えたり、NavigationEditorによって画面遷移が可視化され直感的に編集可能になるといった特徴を備えています。
Navigationをプロジェクトへ導入することは簡単に行うことができます。セッション内では、Navigationの導入手順を細かく解説していました。流れを簡単にまとめますと、NavigationGraphという、画面とそれらの遷移を記述した、いわゆる地図のようなXMLファイルを用意し、ActivityやFragmentの一部分を手順に沿って修正する、といった形になります。また、画面間でデータを渡す際はSafeArgsという仕組みを用いて安全にデータの受け渡しを実現できます。さらに、Toolbarとの連携やAnimationの指定なども行えるようになっていると@yt_hizi氏は解説していました。
セッションの後半では、マルチモジュール構成における画面遷移に話が進みます。「マルチモジュールというのはここ最近のAndroidにおけるトレンド」と@yt_hizi氏が述べているように、機能ごとにモジュールを分割するような構成をよく聞くようになりました。@yt_hizi氏はGitHub上で公開されている2つのプロジェクトを例に挙げ、それぞれがマルチモジュール環境においてどのように画面遷移を行っているか、そしてどのようにNavigationを使っているかを解説していました。Navigationを用いる場合は、DroidKaigi2019公式アプリのように、NavigationGraphを共通となるモジュール内に配置するのが現状の解決策であると@yt_hizi氏はまとめています。
マルチモジュールプロジェクトでのDagger2を用いたDependency Injection
このセッションは、「マルチモジュールで構成されたプロジェクトでDagger2を使ってDIする場合に、何が困るのか、そしてどう解決するのかを理解する」のがゴールであると講演者の@kgmyshin氏は冒頭に述べています。
DI(Dependency Injection:依存性注入)とはデザインパターンであり、結合が疎になったり、単体テストがしやすかったり、特定のライブラリやフレームワークへの依存度を下げられるなどのメリットがあります。DIはAndroidアプリ開発に欠かせない技術となっていて、アプリケーションでDIを実現するためには、どこになにをinjectするのかを網羅する必要があると@kgmyshin氏は手書きの説明とともに解説しています。
マルチモジュール環境において、従来のシングルモジュール環境と同じような方法で実装しDIを実現しようとすると、依存性注入を実行してくれるInjectorは複数管理できません。そのためInjectorが上書きされてしまい、アプリケーションがクラッシュするという状況に陥ってしまいます。
@kgmyshin氏は、1つの解決策として「Applicationで持つ1つのFragmentInjectorが複数のInjectorを持つようにする」という方法を提示しています。ModuleInjectorという独自のInjectorを定義しており、複数のInjectorを保持するフィールドを用意し、外部からInjectorの追加/削除ができるようにすることで、複数のInjectorの管理を実現しているようです。
Dynamic Feature Moduleではモジュール間の依存の方向が逆になってしまうため、前述の問題とは異なる問題が発生すると@kgmyshin氏は述べています。Dynamic Feature Moduleはモジュール間の依存の方向が逆になってしまうためです。これについても1つの解決策として、「適切なタイミングでinjectorを生成して、ModuleInjectorに追加する」という方法を提示しています。この方法であれば、DIを利用する側(Fragment)での変更を小さく抑えながら問題を解決できます。
まとめ
国内外から1,000名を超す参加者が集うDroidKaigiは、本稿の冒頭でも述べた通りカンファレンスをより良いものにするために様々なチャレンジを続けています。
筆者が最も大きなチャレンジと感じたのが、セッションの同時通訳です。年々日本語以外の言語を話す参加者が増えている中、「グローバルとローカルをつなぐダイバーシティを考える上で大事な施策である」と位置づけ、対象となったセッションの講演者と協力しながら言語の壁を取り払うべくチャレンジをしていました。
他にも、現地参加できない方のために一部セッションではライブ配信が、また学生向けの支援としてスカラシップ制度が提供されました。145名を超えるコントリビューターの強力な支援によって完成した公式アプリに、中学生によるコントリビュートがあったこともウェルカムトークで言及されました。
このように、Androidという技術を通して、年齢や国籍に関係なく多くの人が関わり、交流をしているという事実が素晴らしいことだと強く思いました。
開催からまだ1ヶ月も経っていませんが、すでにほとんどのセッションの録画データがYouTubeにて公開され、資料も公開され誰でも閲覧できる状態になっています。皆さんがDroidKaigi 2019で得られた多くの経験や知見は、発信することでまた誰かの経験や知見に必ずなるはずです。ぜひ、身近な人に伝えたり、ブログなどで発信してみてください。
次回のDroidKaigiで、また皆さんとお会いできることを楽しみにしています。