😺

iOSエンジニアがAndroid開発をやってみた

2022/07/24に公開

One Week Challenge という個人プロジェクトを去年からやっていて、今年はまずAndroidをやってみることにしました。

つくったもの

電卓アプリです。
そんなに出来は良くないですが、最低限の四則演算ができます。

https://github.com/0si43/AndroidSampleCalculator

技術要件

まずJetpack Composeを使う、というのは自分の中でなんとなくマストでした。
言語はKotlin。
なるべく最新のAndroid開発の手法と思われる方法でやってみることにしました。

僕自身はSwiftUIとかReactとかで宣言的UI自体はかじってたので、Jetpack Composeも雰囲気は似てるので、そんなに苦しまずに書けました。
ただ宣言的UIがはじめてだと、XMLレイアウトでやった方が楽なこともあるかもです。

学習ルート

2022年のmixiの新卒研修資料をまず読みました。

https://speakerdeck.com/mixi_engineers/2022-android-training

ハンズオンもあるんですが、ハンズオン2までやりました。
3からは RecyclerView でリスト表示する内容なので、今回僕がやろうとしてる要件で使わないのでスキップしました。
APIも叩いてないですし、本当に泥開発の表面をなぞっただけ感ありますね。

↑この資料を読む中で、「iOSで言うxxxはAndroidだと何?」という気持ちになることが多かったので、副読本的に↓を読みました。

https://speakerdeck.com/akatsuki174/iosensiniatasi-androidahurimozuo-rerutesiyo

で、この二つの資料を読みながら、Android Studioでmixiの研修用リポジトリをいじくりました。

「そろそろ実装に入るかあ」という気持ちになったところで、Android Studioの新規プロジェクト生成からつくりはじめました。
「Empty Compose Activity(Material 3)」をチョイス。
イマイチ無印と(Material 3)の違いがわかっていません。

iOSアプリ開発と似ているところ

チーム事情で、iOSエンジニアからAndroidエンジニアにキャリアチェンジする人をちょいちょい見てますが、やってみるとやはり似ているなと思いました。
たとえば、iOSとAndroidでほぼ同じ立ち位置にある用語は、

iOS Android
Objective-C Java
Swift Kotlin
ViewController Activity
Storyboard XMLレイアウト
AutoLayout ConstraintLayout Chain
SwiftUI Jetpack Compose
Human Interface Guidline Material Design

などがあります。
もちろん詳細は違うんですが、なんというか世界観は同じです。

違うところ

まずAndroid開発はビルドシステムにGradleを標準で採用しています。
今いる会社のiOS開発環境だと、Makefile使ってるんですが、これはApple標準というわけではありません。

また、Android開発はimportの単位がiOS開発と違って、かなり細かく指定します。
iOSだと必要なライブラリまるっと書く感じなんですが、Androidはこんな感じです。

import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp

dp/spはViewのサイズやフォントサイズの指定で使う単位なんですが、それすらimport要るのかよ! と思ってしまいました。
Android Studioのimport補完でポチポチするだけですし、*使うことである程度は指定を省略できるんですが、僕は相当なめんどくささを感じました。

Jetpack Composeのクセ

開発してて苦しんだポイントとしては、Jetpack Composeのレイアウトが思ったように効かなくて、最後まで持ち越しました。

普通に組むとこんな感じでボタンが配置されてしまって、
僕がやりたかった「画面の縦横に対して、ボタンのサイズを調整して、全画面表示」というレイアウトにはなりませんでした。
画面はColumnにRowが入ってるという構成だったので、まず fillMaxWidth() だの fillMaxHeigth() だのを試しましたが、思うようにいきません。

Column(
    modifier = Modifier.fillMaxSize(),
    verticalArrangement = Arrangement.SpaceEvenly
) {}

これでやると、ボタンのサイズが小さいままでした。
子コンポーネント全部に fillMaxWidth() をつけてもダメでした。
結局色々試したところ、.weight() を指定すると上手くいくことが判明しました。

Row(
    modifier = Modifier.fillMaxWidth()
                    .weight(1.0f),
    horizontalArrangement = Arrangement.SpaceEvenly
) {

.weight(1.0f) を均等に表示したい子コンポーネント全部につけると、重みづけが同じなので、子要素を均等に敷き詰めて配置してくれます。

罠としては、このモディファイヤーはRowとColumnの引数でないと指定できないので、別コンポーネントに分割していると、
.weight() を指定しようとしても、コンパイルエラーになります。

僕はボタンコンポーネントを別ファイルに分割してたので、これでしばらく苦しみました。
親コンポーネント上で子コンポーネントの引数に指定することは可能なので、そっちで対応しました。

完走した感想

Android開発はiOS開発と雰囲気が似ているので、シフトしやすいというのは感じました。
お互いがお互いの良さを吸収している(パクってるとも)ので、開発環境も両プラットフォーム間で似てきている印象です。
今もし僕がAndroid開発を本業にするならば、半年ぐらいあればキャッチアップできるんじゃないかなあと思いました。
(※iOS開発仕事にしはじめてから、キャッチアップできたなと感じたのは1〜2年ぐらいかかった気がします)

Kotlinはモダンな言語できる機能はだいたいある感じです。
静的型付け、クロージャー記法、Nullable、Enum、ジェネリクスあたり。
ただ、記法はあんま好きじゃないというのが正直なところです。
Javaから移行する人はしっくり来るんでしょうか?

Android Studioは、ショートカットがXcodeと全然違うんで苦しみましたが、慣れたら使い勝手良さそうなIDEだなと思いました。
個人的には、開発で使いたいエディタは、VSCode > Android Studio > Xcode の順ですかね。

AndroidもiOSと一緒で、前提知識がだいぶ増えてきたせいで、入門するハードルが高くなっているのも感じました。
2010年代前半くらいは、「夏休みでちょろっとアプリつくってみました!」みたいな手軽さがあったと思うんですが、
今の環境だとなかなかちょっとしたものをつくるにしても、時間がかかる気がします。
職業としてやってる人間としては、参入障壁が高くなるのは雇用的にはいいのかもですが、業界としては若い人がカジュアルに入ってこないと良くないだろうなと思ったりはします。

スクラップ

https://zenn.dev/st43/scraps/598969d28babb9

Discussion