Now in REALITY Tech #22 REALITY Androidで使っている技術【令和4年最新版】
REALITYでAndroidのテックリードをしているメタルおじさんです。
以前REALITY Androidで使っている技術についてまとめた記事を公開しました。
カジュアル面談などでREALITY Androidの技術要素について説明する時はこの記事を参照しつつ話しをしているのですが、少しずつ内容が古くなってきたように感じました。年明けというちょうどよいタイミングなので、改めて現時点での情報をまとめることにしました。
はじめに
REALITY Androidを触ったことのない方や、昔触ったことあるけど最近触ってない方は、Google Playからインストールして遊んでみてください。
基本的なところ
簡単にまとめると以下のような感じです。
100% Kotlin
Unityをライブラリとして取り込んだAndroidアプリです
Jetpack Compose はじめました
とはいえ画面の大半はまだView Binding/Data Bindingです
minSdkVersion 24
targetSdkVersion 31
DIはKoin
AndroidX
ViewModel
LiveData
Navigation
Room
Paging 3
WorkManager
割とマルチモジュール化しています
だいたいSingleActivity化しています
意外と普通のAndroidアプリじゃないですかね!
100% Kotlin
ごくごく一部にJavaのコードを利用しているところやJNIでC, C++を利用しているところがありますが、普段REALITY Androidのエンジニアが触るコードは100% Kotlinです。
本記事執筆時点のバージョンは1.5.31です。Jetpack ComposeのStable版がアップデートされたら1.6系に上げようと思っています。
アバター部分はUnity
アバターの描画など、3D表現に関する部分でUnityを使用しています。こう聞くと「AndroidエンジニアもUnityを触らないといけないのでは?」と思われるかもしれませんが、REALITYではAndroidのコードとUnityのコードは疎結合になっていて、基本的にはAndroidエンジニアがUnityの実装の詳細を意識することはありません。REALITYでAndroidエンジニアとして働く分には、Unityの経験がなくても大丈夫です(もちろん、Unityも触れた方がシステムの理解を深められるので、触れるに越したことはないのですが)
Jetpack Compose
去年の記事から大きく変わったのはここです。最近リリースされたビデオチャットなど新しい機能ではJetpack Composeで画面を作っています。画面やUIパーツの様々な状態をプレビューできたり、ダークテーマON/OFFやロケール切り替えでUIがどうなるかを一度に確認できたりと、大変役に立っています。
一方で、まだ多くの画面はまだXMLベースのViewで作られているので、エンジニアのスキルセットとしてはJetpack Composeだけでなく従来のXMLベースのViewについての知識も求められます。個人的にはこの辺もレガシーコードになる前になるべくJetpack Composeに移行していきたいなと考えています。
まだチーム内でもJetpack Composeのコーディングガイドラインやベストプラクティスを模索中です。一足早くプロダクトにJetpack Composeを導入した経験のある方、その知見をREALITYでも活かしませんか?ご応募お待ちしております!
SDK Version
去年から変わらずminSdkVersion 24です。世間的には高い方なのではないでしょうか。下図はAndroid Studioで新規プロジェクトを作成する時に確認できるAndroidバージョンのシェアです。
メディアやパーミッション周りの変更が24〜29あたりで結構段階的に発生しているので、そろそろminSdkVersion 26くらいには上げたい気持ちです。が、まだAndroid 7の端末でREALITYを使ってくれている方々も結構いるので(特に日本以外の地域で)もう少し先の話かもしれません。
DIはKoin
意外に思われるかもしれませんが、DIにはKoinを使っています。これは開発開始当時にはまだHiltがなくて、Daggerに詳しい人もいなかったため、シンプルに扱えそうなKoinを採用したという感じです。
Kotlin Multiplatform MobileのサンプルアプリでKoinが採用されていたりもするので、先見の明があった選択だったのでは…?と思ったりしています。(まぁ、当時決めたのは私ではないんですけどね)
AndroidX
REALITY AndroidではAndroidXのライブラリも積極的に導入しています。代表的なものをピックアップするとこんな感じです。
ViewModel
LiveData
Navigation
Room
Paging 3
WorkManager
どれも現代のAndroidアプリの開発には欠かせないものばかりです。AndroidXに関しては、開発している機能に必要だなと思ったものは積極的に使っていくスタイルです。
逆にサードパーティーライブラリについては、割と慎重に検討しています。過去にメンテされていないライブラリを導入していたことが原因でGradleのバージョンアップができなくなったりAndroid OSの更新に追従できなくなったりなどの問題に遭遇したことが度々あったからです。
とはいえ、こういうふうに考えられるということはそれだけKotlinやAndroidのファーストパーティライブラリが便利で充実してきたということだと思います。良い時代になったなぁ……
マルチモジュール
REALITY Androidのコードベースはリポジトリこそ単一ですが、機能ごとにモジュール分けを進めています。おかげでCPUのコアをフルに使用したビルドができています(ビルド中はPCが重い…)。
SingleActivity
開発当初は画面ごとに別々のActivityとして実装されていましたが、SingleActivity化を進めた結果、現在は大半の画面を一つのActivity内で遷移するように作っています。Activity内での画面遷移の多くはNavigationで実装しています。
AndroidX以外で使ってるライブラリ
ざっと挙げるとこんな感じです(全てではないです)。
Moshi
Retrofit
OkHttp
Ktor
Glide
Coil
ExoPlayer
Lottie
Flipper
ネットワーク周り
バックエンドとの通信はRetrofit + OkHttpで行っています。通信の中身はJSONで、Moshiでエンコード・デコードをしています。WebSocket通信をしている箇所もあり、ここではOkHttp + Ktorを使用しています。一部の通信でProtocol Buffersを使用している箇所もあります。
ですが今後はKtorとKotlinx Serializationに移行したく、準備を進めています。それから、現在JSONで通信している部分についても、Protocol Buffersへの置き換えを検討中です。
このあたりに興味・知見のある方は、まずカジュアル面談をしましょう。
画像系
画像の読み込みはGlideで元々作っていましたが、Jetpack Composeで画像読み込みをするのにGlideは使いづらかったので、公式ドキュメントでも紹介されていたCoilを導入しました。Glideにこだわりがあるわけではないので、Coilへの移行を進めようかと考えているところです。
その他
一部に動画を再生する機能があるのでExoPlayerを使っています
アニメーションの実装にLottieを使っている箇所があります
デバッグに便利なのでFlipperを使っています
Firebaseもちょいちょい使います
CI/CD
去年の記事の時点ではJenkinsを使っていましたが、ここ1年でBitriseへ移行しました。まだ日々の業務でJenkinsに依存したタスクは残っていますが、Androidのコードのビルドに関してはBitriseで行えるようになっています。
これで今後はBitriseメインで使っていくのかと思っていたら、社内のGitリポジトリがGitHub Enterprice ServerからGitHub Enterprice Cloudに移行する話が出てきており、今後はGitHub Actionsを利用する流れになるかもしれません(現在調査中です)。
CI/CD周りの知見がある方も大募集中です!
開発マシン
社用開発マシンとしてはみんなMacを使っています。環境構築ドキュメントやシェルスクリプト等もMac前提で書かれているので、Windowsを使うのは大変だと思います。キーボードは日本語・英語が選択可能です。
ちなみに、M1 Macも選択可能です(在庫があればですが)。私はチーム内でもいち早くM1 Macに乗り換えて人柱をやっていますが、今のところ致命的な問題には遭遇していません。
Android Studio arm64がまだStableになってないのは若干気になりますが、M1 Macで開発したい方はまずカジュアル面談をしましょう。
おわりに
以上、REALITY Androidの技術周りの最新情報をお伝えしました。
REALITY Androidを開発してみたい!と思った方は下記リンクよりご応募お待ちしております。
応募までは行かないけどちょっと話を聞いてみたい!という人は以下のアカウントまでお気軽にお声がけください。