Androidアプリエンジニアになって気づいたiOSとの違い

この記事はフラー Advent Calendar 2020 の 2 日目の記事です。

フラーには今年の10月にAndroid アプリエンジニアとして入社しました。ちょうど2ヶ月が経ち、まだまだ不慣れながらも日々楽しくKotlinを書いています。 今回は前職でやってたiOSアプリ開発とのギャップに改めて感じたことを思い出として残しておこうかと思います。

Activityのライフサイクル管理が複雑

もちろん iOSのViewController/Viewにもライフサイクルの考慮は必要なんですが、AndroidのActivity/Fragmentのそれはより難しいと感じます。 特にActivityは割とあっさり捨てられ、再生成されます。なのでそんな場合にもアプリの状態を保持できるよう気を配る必要があります。

自分が関わっていたプロジェクトでも、 プロセス起動中に設定で位置情報パーミッションの設定を変えるだけでActivityが再生成される という現象による不具合がありました。Activity死に過ぎ...

その際に他のエンジニアから教えて頂いたのが、開発者向けオプションのアクティビティを保持しない 機能です。

f:id:gibachan03:20201129202854p:plain:w200

これを有効にするとアクティビティが破棄される挙動を再現しやすいので、この手の問題を確認するのに便利です。

サポートする OS/デバイスのバラエティが広い

iOSでは、デバイスの種類が限定的で、比較的ユーザーが新しいOSへ移行しやすい傾向があるのに対し、Android ではデバイスの種類が多彩で、そのためか利用されているOSのバージョンの幅も広いです。実際に古いOSだkでは使えない機能にもぶつかりもしました。

ただ、Googleが提供するAndroid Jetpackのおかげで、AndroidAPIを扱う際には古いOSのことを基本的には気にせずに済むようになっています。とはいえ、Jetpackの内容を把握するのも結構大変。。。

バックボタン対応

はい大変。Androidではアプリの状態によって常に「今バックボタン押されたらどう振る舞うべきか?」を考えなくてはいけません。特に画面遷移フローにおいて困ります。ログイン画面でログインした後にバックボタン押したらログイン画面には戻したくないとか。

いま携わっているプロジェクトでは Single Activity の構成を採用しており、画面遷移はAndroidX Navigationを利用しています。
Navigationでは画面遷移をXMLファイルで定義します。これが結構良くて、XMLで画面遷移の遷移先や一緒に渡すパラメータ、アニメーションなんかも定義できます。その際にもバックボタンで戻る挙動(Fragmentのスタック)も考慮します。考えることは多いですが、XMLのなかに画面遷移に関わる情報が集約されるでわかりやすく感じました。(あとAndroidXMLは人間に優しいのが嬉しい!!普通に読めるし、キーワードから定義元へのジャンプとかもできるとは)

(画面遷移にはAndroidX Navigationを使わず、ActivityからActivityへ遷移する、またはActivityからFragmentを呼び出したりする方法もまたあります。)

ビルドシステムが Gradle

iOS で外部ライブラリを利用するのにCocoaPods/Carthageなどを利用しますが、それらは最初のセットアップがちょっと面倒でした。

Androidでは、アプリの依存モジュールやビルド設定などは build.gradle に記述します。これがプロジェクトに統合されてる分、iOSと比べて扱いやすいなと感じました。ボタンポチだけでライブラリのインストールが済むのは楽ちんです。

まあ、iOSでも最近はSwift Package Managerがサポートされてきて、そこまで差はないかもです。
(余談ですが、Xcode 11からswift packageを直接開けるようになったので SPMの generate-xcodeproj オプションがひっそりとdeprecatedになったのを最近知って時の流れを感じました)

build.gradle はGroovyで記述するので、慣れないうちはちょっと抵抗がありましたが、今ではkotlin でも記述できるようなので、移行しておけば楽そうです。

コードのディレクトリが深くなりがち

Androidではディレクトリ構造がより深くなりがちで、ファイルを行ったり来たりするのが少し辛いです。 特に、マルチモジュール構成のプロジェクトではディレクトリ間の移動が多くなるのでさらに。。。

f:id:gibachan03:20201201215443p:plain:w180 (目的のファイルまでめっちゃ深い)

個人的にファイル間の移動でよく使っているのが、Android Studioショートカット の「shift キーを 2 回押す」で使える すべてを検索(コードとメニューを含む) 機能です。開きたいファイルの名前やキーワードからファイルに飛べるので重宝しています。

あとAndroid StudioのProject tool windowの中にある Always Select Opened File にチェックを入れています。

f:id:gibachan03:20201129211640p:plain:w300

これによってファイルを開いた時に、Project tool windowの該当ファイルも一緒に開いてくれるのでなんとか迷子にならずに済んでいます。 (Xcodeのshift+command+Jを自動的にやってくれる)

XcodeAndroid Studio でショートカットが違う

これはもうIDEが違うので仕方がないです。仕方がないのでAndroid Studioの設定を変えて、できるだけXcodeの時と同じようにしています。 (デフォルトのCtrl + Hで変なウィンドウ開いて困惑しました)

設定を変えると、今度は私用PCと仕事用PCなどの複数の端末で設定し直すのが苦痛になります。 そこで便利だったのが、Android StudioSettings Repository 機能でした。 私用PCと仕事用PCなど、複数の端末で設定し直すのが苦痛でしたが、これによってGitHubで一元管理できるので助かりました。

f:id:gibachan03:20201201220600p:plain:w500

まとめ

Swift/Kotlinの比較は良く見るので、それ以外の部分で実感したものを挙げてみました。
なんかAndroid辛い。。みたいな感じになっちゃたかも。でもそれよりも日々学びがあり、楽しくAndroidと格闘できているので、今後も頑張っていく所存。