M1 Macとビルド時間とそれからメルカリAndroidアプリ

こんにちは。メルカリにてSoftware Engineerをしている@kuu 🍣です。 この記事は、Mercari Advent Calendar 2021 の20日目の記事です。

はじめに

 私は所属しているメルカリJPにて、Software EngineerとしてAndroid向けアプリの開発をしています。

 今回の記事では、Apple Silicon(M1)版PCを使いAndroidアプリ開発する上での問題点とその解決方法について説明します。また、参考としてある程度規模の大きいAndroidアプリをApple Silicon 版MacBook ProとIntel版MacBook Proそれぞれでビルドしたときにかかる時間を共有します。

メルカリ Android アプリ開発の特徴と現状

 メルカリAndroidアプリは、大人数で一つのアプリを開発しているためアプリ・ソースコードの規模が大きいです、手元で cloc を使い計測したところテストコードを含めて大体十万行前後になりました。また、Jetpack Compose を使ったデザインシステムの実装など、新しい技術でも役に立つと判断できればGo Boldに取り入れています。 まだまだ他にもありますが、詳細はこちらの記事をご覧ください。

 ソースコードの規模が大きく、相対的に非力なノートPCを使うとプログラムのコンパイルに時間がかかり開発効率が落ちてしまいます。そのため、強力なCPUと十分なメモリを搭載したiMac Proを活用し開発しています。

Apple Silicon 版PCを開発で使う背景

 2021年10月、 AppleよりM1 Pro/M1 Max搭載のMacBook Proが発表されました。CPUの速度もベンチマーク上ではノートPCタイプなのにデスクトップPC並みの性能で、メモリも64GBまで搭載でき、弊社の開発作業でも十分すぎる性能です。そのため、弊社のAndroid Engineerの中でも開発で使いたいとの声が多く上がりました。

 今回の記事は、導入する前に弊社のAndroidアプリ開発で問題が発生しないか・それは解決できる問題なのかを調査した結果を共有するものになります。

結論から書くと無事にApple Siliconを搭載したPCにて問題なく開発を行えています。

Apple Silicon版PC対応のハードル

 Apple Siliconは以前のIntel製CPUと違いCPUの命令セットが AArch64 です、そのため x86向けにしか提供されていないライブラリに依存していると開発する上での問題になりました。 例を挙げるとAndroidアプリ内で使えるデータベースライブラリの Room の内部で使っているJDBCドライバーが AArch64 に対応しておらずビルドできない状況でした。

現在は、ライブラリのバージョンを上げることで解決できます。具体的にどのバージョンまであげれば大丈夫なのか調べる必要がありました。その調査結果を共有したいと思います。

Apple Silicon対応表

一般的に使われる頻度が高いであろうツール・ライブラリの対応状況についてまとめてみた。

名前 対応状況 コメント
Android Studio Android Studio Arctic Fox (2020.3.1) から 筆者は Android Studio Arctic Fox を利用し開発している。.
Kotlin 1.5.30 よりサポート ちなみに、Jetpack Compose は 1.5.31 以上を推奨している
Gradle 6.9 or 7.0 よりサポート 弊社では Gradle version 7.1.1 を使っている
Android Gradle Plugin 弊社では 7.0.3 を使っている。ちなみに、 AGP 7.x 以降よりJava 11 を使う必要がある。
Android Emulator SDK Manager より取得できる M1搭載PCだとスペックがやや足りてない気がするが普通に動いてくれる
Room 2.4.0-alpha03 よりサポートしている 現在(2021/12/13) 、未だ 2.4.0 の正式版は出ていない…(が、JDBCドライバだけ更新するのも悩ましい)
Android Debug Bridge 対応している 最新版にて動作を確認した
scrcpy 対応している 最新版にて動作を確認した

M1 MacBook Proでのビルド速度比較

検証環境

 日常での開発で使うことを前提にSlackやGoogle Chromeなどを立ち上げた上で計測した。ビルド対象は弊社Androidアプリの最新ブランチを利用した。

検証方法

以下のコマンドを実行し平均ビルド時間を計測しました

multitime -p -n 10 ./gradlew clean :app:assemble --no-build-cache -q

検証結果

端末名 平均実行時間 構成
M1 MacBook 292秒 M1/16GB
Intel MacBook 307秒 MacBook Pro 2019 16インチ i9/32GB
iMac Pro 224秒 iMac Pro Xeon W 10 Core/ 64GB

 ビルド速度としては、 iMac Pro >> M1搭載MacBook Pro >= Intel搭載MacBook Proとなりました。一方、PCの排熱の観点から行くとM1搭載MacBook Proは優秀でした。かすかにファンの音が聞こえる程度でした。一方iMac ProとIntel搭載MacBook Proではファンの音がうるさく排熱もキーボードに触りたくなくなる程度にありました。

考察

 以上より、規模の大きなAndroidアプリの開発においてはiMac Proのようなコア数の多いPCは未だ価値があるようです。また、既存のIntel搭載MacBook Proを利用している場合はM1搭載MacBook Proに置き換えても開発速度は向上せずむしろiMac Proからの移行では遅くなる結果になりました。M1 Proを手に入れた暁にはそちらでも試してみたいです。

M1 搭載MacBook Proでのビルド速度について考察

M1 MacBook Proの搭載できる最大メモリ容量は16GBです。 そのため、普段の開発のようにGoogle Chrome, Slack, Android Studioなどを並行して利用しているとそれだけでメモリを使い切ってしまいます。 その結果メモリスワップが頻繁に行われビルド速度に影響が出たものと考えています。(実際にアクティビティMonitorを確認するとディスクI/Oが頻繁に使われている)

さいごに

この記事では、「M1 Macとビルド時間とそれからメルカリAndroidアプリ」というタイトルで、Apple Silicon版PCでのAndroidアプリ開発に対応した知見を共有しました。  Kotlinやライブラリ等のバージョンアップは大変かと思いますが頑張っていきましょう。

––

メルカリでは、一緒に働いてくれる仲間を募集しています。ご興味のある方は、是非求人情報 (Mercari, Mercoin, )をご覧ください。

明日の記事はsanposhihoさんです。引き続きお楽しみください。