🐡

Flutter 開発者が Android ネイティブ開発して思ったこと

2021/12/20に公開

今回は、Flutter 開発者が Android ネイティブ開発してみて思ったことをまとめたいと思います。

ネイティブ開発から Flutter 開発を始める人は数多くいるものの、私のように Flutter 開発からモバイルアプリ開発を始めて、その後ネイティブ開発をしてみる人はあまりいないのではないかなと思います。

そのため、現在は Flutter 開発していて、 Android ネイティブ開発してみようかなと思う人に役立てば良いなと思います。

Flutter とは?

そもそも、Flutter とは何なのか分からない人もいると思うので、簡単に説明したいと思います。

Flutter は、クロスプラットフォームの開発フレームワークとして Android / iOS 向けのアプリケーション開発をすることができます。

iOS 向けアプリは Swift/Objective-C で開発し、Android 向けアプリは Kotlin/Java で開発する必要があり、どちらの OS でもアプリをリリースしたい場合は、別々の言語で開発して、別々のソースコードを書いていく必要がありまし

その一方で、Flutter そして開発言語 Dart を使用すれば、一つのソースコードを用意するだけで、iOS/Android どちらでも動くアプリを作ることができます。

Flutter 開発のメリットは以下の記事が参考になります。

Flutter とは? エヌ次元が企業として Flutter 開発を採用する理由

なぜ Android 開発を始めたか

そもそも、なぜ Android ネイティブ開発をしてみようと思ったのか。

そのきっかけは単純で、業務で新しくアサインされたプロジェクトが Android ネイティブ開発だったからです。

社内でちらほらネイティブ案件が来るという噂は聞いていましたが、私が担当する日がこんなに早く来ると想像していませんでした。

なぜならば、モバイルアプリ開発に対する情熱が失せてきて、違う分野、例えばサーバーサイド側を担当したいと会社に伝えていたからです。

ただし、弊社はモバイルアプリ開発が事業の中心の一つであり、私が今後もモバイルアプリ開発に携わるならば、ネイティブ開発の経験は欲しいとは思っていました。

その理由は、 モバイルアプリ開発をより深く理解するためにはネイティブ開発をしてみたほうが良い と思うからです。世の Flutter 強強エンジニアの方々は、なんだかんだ言って、どちらかのネイティブ開発経験者が多いですしね。

そんなどっちつかずな気持ちの状態で、かつ知識ゼロの状態でアサインされて、開発がスタートしましたが..................

Android 開発、めっちゃ楽しいです!
Flutter 開発よりも楽しく Android 開発をしていて、毎日が楽しいです!

Android 開発チームによる公式トレーニング教材やドキュメントの充実さ

僕は新しい言語やフレームワークの学習をする時には、Udemy や Youtube といった動画教材を使って、最初の一歩目を歩み始めます。

しかし、今回 Android 開発の一歩目は、そうした動画教材ではなく、以下の公式トレーニング教材を使用しました。

Android Basics in Kotlin

このトレーニング教材で用意されている UI 構築や画面遷移、HTTP 通信、DB 関係のコースを通じて、Android 開発の基礎を学習し、アサインされたプロジェクトの開発する準備を整えることができました。

また、それ以外にも公式ドキュメント「デベロッパー ガイド」はより深堀りする上で役に立ちましたし、現在でも参考にしています。

Android 開発に関心のある方は、これら公式のトレーニング教材(無料)をやってみると良いと思います。

話変わって、iOS側担当の同僚に聞くと、iOS側は公式ドキュメントがあまり整備されておらず、ドキュメントで詰まっている問題解決することがなかなか難しいと聞きます。

新しいアーキテクチャに触れることができた

これまでに携わってきた Flutter 開発では、Provider や flutter_redux といった状態管理手法を使った開発が主であり、前者は画面単位、後者はアプリ全体に使用していました。

僕にとって、Flutterのアーキテクチャ === 状態管理 というイメージがあり、アーキテクチャに対して関心を払ったり、意識できていなかったと思います。

Android 開発では、公式チームが MVVM (Model - View - ViewModel)というアーキテクチャを使用した開発をすることを推奨されています。

今回アサインされたプロジェクトでは、この MVVM にクリーンアーキテクチャで提唱されている UseCase や画面遷移等の責務を持つ Coordinator を導入しました。

出典:アプリ アーキテクチャ ガイド

アーキテクチャに対する知識が浅かったため、ビジネスロジック実装の部分で大いに悩みました。

しかし、 責務に応じた実装を心がけることで、どのファイルも肥大化することなく綺麗に分離することができ、気持ちの良さ を感じています。

それと同時に、 「アーキテクチャをより理解したい」 という気持ちも芽生え、年末年始にたくさんのインプットをしたいなと思います。

こうした関心の変化は個人的にとても嬉しいことで、Android ネイティブ開発に参画して良かったなと思う大きい理由です。

ちなみに、先日には上記の引用画像で示した公式のアーキテクチャに変更が加わり、レイヤーごとに区分されるようになりました。
中身は大きく変化していませんが、新たにオプションとして UseCase(Domain レイヤー)の導入が加わりました。

出典:Guide to app architecture

Kotlin の存在

日々 Android 開発を進めている中で Kotlin で書いていますが、楽しく開発を進められているのも Kotlin のおかげと言っても過言ではないです。

Kotlin の書きやすさ、書いていて感じる気持ちよさはこれまでに触れてきた言語の中でも特出していると感じます。

Flutter の開発言語の Dart も同じく書きやすい言語ですが、Kotlin のように書いていて楽しいと感じることはあまりなかったです。

これは単純に相性の問題なのかもしれませんが、Kotlin という言語に出会うことができて良かったです。

Android Studio 最強

これまでの Flutter 開発では、JetBrains が開発する IDE「Android Studio」 を使ってきました。

Android 開発でも、引き続きこの Android Studio を使用していますが、この IDE をより好きになりましたし、この IDE の真骨頂を見れている気がします。

Flutter 開発時には、IDE が重くなったりすることがよくあり、ストレスに感じる部分がありました。
それが主だった理由で、Android Studio から VS Code に移行する人が多いのかなと思います。

その一方で、Android 開発になってからは、そのようなストレスを感じることがほぼなくなり、毎日快適に開発ができています。

また、JetBrains が Kotlin を開発しているということもあり、Kotlin へのIDEの提案してくれるレベルが非常に高いです。
日々、Opt + Enter にお世話になりまくりです。

そして、Flutter 開発ではできなかった IDE の最新バージョンへのアップデートもどんどん行うことができ、新しいツールを業務レベルで使っていくことができるのは楽しいなと思います。

XML でのレイアウトの大変さと Jetpack Compose の未来

Android 開発での UI 構築は XML でレイアウトを書いていきます。

ただし、XML でレイアウトを書いていく工程はけっこう大変です。

僕がまだまだ慣れていないだけかもしれませんが、UI 構築では圧倒的に Flutter の方が楽です。

そんな中、Android でも Flutter や React のように宣言的に UI 構築ができるライブラリ「Jetpack Compose」がリリースされました。

この Jetpack Compose はまだまだ不完全なところもあり、Jetpack Compose だけでは実現できない UI 構築もあるようですが、今後はこの Jetpack Compose が主流となり、効率的に UI 構築ができるようになりそうです。

この Jetpack Compose のおかげで、Android ネイティブ開発してみようと思う人も増えていくのではないかなとも感じています。

僕はプロジェクトの都合上 Jetpack Compose を導入できていませんが、年明け以降に Jetpack Compose を部分的に導入できるプロジェクトをやれたらいいなと楽しみにしています。

Flutter だったらこうやってできるのに...と考えてしまうことをやめた

これは全く Android のせいではないですが、Android 開発当初には Flutter 開発の経験を基礎として実装を進めていたため、「Flutter だったら...」と考えてしまいがちでした。

そのため、Flutter への哀愁を感じることもしばしばありましたが、途中からこれではいけないと思い立ち、Flutter は Flutter、Android 開発は Android 開発と切り離して実装作業を進めるようにしました。

それからは、これまで Flutter 側がやってくれていたことを開発者側でしっかりと考慮しないといけない部分に対しても、Android 開発の面白さを感じるようになりました。

ググった際に、大分昔の情報がヒットする

自分のググり方が悪いのかもしれませんが、Android 開発で一つ困ったことがあります。

例えば、開発中に詰まったところがあり、ググります。

Android how to change positive button text color in alert dialog

すると、検索結果は往々にして3年前とかの Stack Overflow の質問で、かつ中身は Java です。
また、Kotlinの対応方法があっても、deprecatedしていることも多いため、最新の対応方法を見つける必要があったりします。

Flutter は比較的新しい技術であり、世界的にも流行りの技術でもあるため、常に最新の回答を見出すことができます。

Android 開発者はモバイルアプリ市場の中でも最もエンジニア数が多いと思いますが、比較的新しい情報が出てこないのはなぜでしょうか。

Android 開発者は基本的にすごい出来るエンジニアが多いので、そもそも僕のように詰まることがないのでしょうか。
それとも、僕のように新しく Android 開発する人が少ないのか。

いずれにせよ、開発を進めていく中で、良い検索方法などを習得していく必要があります。

まとめ

実は Flutter エンジニアとして働いているものの、Flutter に対して情熱を持って勉強したりすることはなく、「仕事だから」やっていました。

そのため、「モバイルアプリ開発はもういいかな」と思い始め、個人でも Web 開発寄りの勉強をしたり、会社に対しても「サーバーサイド側をやりたい」と積極的にアピールしていました。

ただ、Android ネイティブ開発をしてみると、とても楽しい。
同じモバイルアプリ開発だけれども、Flutter とは異なる楽しさを感じています。

今後も業務で Flutter 開発を続けていきますが、公私で Android 開発をどんどんやっていきたいと思います。

終わりに

42Tokyo では部活動のような「スマホアプリ部」があり、僕も初期から参加させてもらっています。

現在スマホアプリ部では、 Android 開発に関心を持って情報交換している学生は僕とメルカリで現役で働いている強強エンジニアのゆー◯んさんだけです。

Android 開発に関心のある方、良かったら一緒に情報交換しませんか?

GitHubで編集を提案

Discussion