Mobile Build
Overview
モバイル開発のビルド手法をまとめたセクション。
ネイティブAPIのバージョンと最低サポートOSのバージョン
iOSアプリ、Androidアプリとしてビルドする際にバージョンを指定する。
- 最低サポートOSのバージョン
- ビルドSDKバージョン
- ターゲットSDKバージョン(Androidのみ)
最低サポートOSのバージョン
最低サポートOSのバージョンはアプリをインストールできる最低のOSバージョン。
このバージョンを低く保つことでより多くのユーザーがアプリを利用できることになりますが、その分古いOSでの挙動についても考慮する必要がある。
iOSについてはAppleのデベロッパーサイトにてバージョン別のシェアが公開されており、この数値を参考にするとよい。
AndroidについてはAndroid Studioの新規プロジェクト作成時にバージョン別のシェアを確認できる。
最低サポートOSのバージョンを決める際には、いくつかの要素を考慮する。
一般的には次のような基準で決定されることが多い。
- ユーザーシェア
対象プラットフォームのOSバージョン別のシェアを確認する。
例えば、iOSやAndroidの各バージョンの利用割合は公表されており、対象ユーザーのほとんどが使用しているバージョン以上をサポートするのが一般的。
古いバージョンのユーザーが少ない場合は、それらをサポート対象外にすることが多いです。 - プラットフォームの公式ガイドライン
AppleやGoogleは、定期的に古いOSバージョンのサポートを終了するため、最新のベストプラクティスに従うことが推奨されている。
特に、App StoreやGoogle Play Storeでの申請には最新のOSバージョンに対応したSDKが必要になる場合もある。 - 使用するサードパーティライブラリ
使いたいライブラリが特定のOSバージョン以降でしかサポートされていない場合、そのバージョンを最低限サポートしなければならない。
また、新しいOSでのみ使える機能を活用したい場合も、最低サポートバージョンを上げることがある。 - アプリのパフォーマンス 最新OSでは性能が最適化されていることが多く、パフォーマンス重視のアプリでは新しいOSバージョンをサポート対象とする傾向がある。
ビルドSDKバージョン
ビルドSDKバージョンはビルド時に使用するSDKのバージョンで、このバージョンを上げることで新しいネイティブAPIを利用することができる。
ただし、このバージョンを上げると古いOSで挙動が変わることがあるため注意が必要。
この挙動の変化は特にAndroidに多く見られる。
アプリバージョンとビルド番号
Flutterアプリでは、pubspec.yaml に version フィールドを定義することで、アプリのバージョンとビルド番号を管理します。
version: 1.2.3+45
1.2.3: 表示用のバージョン名(ユーザー向け)+45: 内部的なビルド番号(App Store / Google Play での識別に使用)
ビルド番号の重要性
iOS・Androidともに、アプリをアップデートする際に ビルド番号が前回より大きくなっている必要があります。これを怠るとストアへのアップロードが拒否されます。
- iOS(CFBundleVersion)
- Android(versionCode)
FlutterではCLI引数で上書きすることも可能です:
flutter build apk --build-name=1.2.4 --build-number=46
flutter build ios --build-name=1.2.4 --build-number=46
CI/CDにおける自動更新の慣例
ビルドごとにバージョンやビルド番号を更新する場合、次のようなアプローチがよく使われます:
- Gitのタグを
build-nameに使用し、コミット数やCIのビルド番号をbuild-numberにする pubspec.yamlをCIで書き換えるスクリプト(Perlやsedなど)を用意する- Dartの
pub_version_plusパッケージでCLIからのインクリメントを行う
CIでの例(GitHub Actions):
- name: Set version from tag
run: |
VERSION=${GITHUB_REF#refs/tags/v}
echo "version: ${VERSION}+${GITHUB_RUN_NUMBER}" > pubspec.yaml
これにより、安定して連番かつ一意なバージョン管理が可能になります。
iOSのビルドSDKバージョンの設定
iOSには実はビルドSDKバージョンという考え方はない。
Xcodeのバージョンによって使用できるAPIが変わる。
Xcodeのバージョン変更により、Flutterアプリの挙動が大きく変わることはまれだが、バージョンを上げる際は慎重に動作確認する。
AndroidのビルドSDKバージョンの設定
AndroidのビルドSDKバージョンはアプリのビルド構成ファイル android/app/build.gradle に記述する。
androidエントリのcompileSdkVersionが該当する。
Androidは gradle というビルドツールを使用しており、Androidプロジェクトを構成するために Android Gradle Plugin というプラグラインを使用している。
gradle のバージョン、Android Gradle Pluginのバージョンn
- gradleのバージョン
- Android Gradle Pluginのバージョン
- compileSdkVersion
上記はそれぞれは互いに依存関係がある。
compileSdkVersionのみを変更するとビルドできないこともある。
また compileSdkVersionを変更する際はAndroidの公式ドキュメントを参照し、動作の変更点をチェックする必要がある。
ターゲットSDKバージョン
Androidのみに存在する概念。
アプリを動作させたいSDKバージョンを指定する。
SDKのバージョンによって見た目や挙動が変わることがあるためどのバージョンで動作させる想定なのかを明示する設定になる。
Google Play Storeでは、このtargetSdkVersionを毎年新しいバージョンに引き上げることを必須要件として開発者に課している。
targetSdkVersionを更新しなければ、アプリをアップデートできなくなったり、新しいOSのAndroidからはストアでアプリを検索できなくなったりする。
ビルドと証明書の流れ
1. アプリのビルド ⇨ 証明書の流れ(iOS/Android)
FlutterやReact Nativeを使ったクロスプラットフォーム開発においても、最終的には各プラットフォーム固有の形式(iOSなら .ipa、Androidなら .apk / .aab)でビルドされます。これらの成果物を配布・公開するためには、「証明書(コード署名)」が必要です。
iOSの場合
flutter build iosやxcodebuildを実行すると、Xcodeプロジェクトがビルドされる。- この時点では、まだ最終的なApp Store配布用
.ipaは生成されていない(署名なし or 開発用署名)。 - App StoreやTestFlightにアップロードするには、「本番用署名」が必要になる。
- 通常は以下の2パターンで署名を行う:
- 手動:Apple Developerサイトからプロファイル・証明書を取得し、Xcodeの設定で管理。
- 自動(推奨):Cloud-managed certificates を使い、Appleに証明書管理を委ねる。
- Fastlaneの
build_appやgymコマンドを使うことで、証明書の管理・署名・.ipaの生成を自動化できる。
Androidの場合
flutter build apkまたはflutter build appbundleを使うことで、署名付きまたは未署名の成果物を出力できる。- 本番用の署名を行うには、
android/app/以下にkey.propertiesを設置し、build.gradleのsigningConfigsを構成する。 - CI/CDでは環境変数としてキー情報を渡すことで安全に署名処理ができる。
- Fastlaneの
gradleコマンド経由でビルド・署名・アップロードまで一貫して自動化可能。
このように、ビルドの最終工程における署名処理は、プラットフォームごとに異なるが、Fastlaneを活用することで統一的かつ安全に運用できる。
手法
モバイルアプリのビルド手法には、目的やプロジェクトの要件によっていくつかの方法があります。大きく分けると、以下のような手法が存在する。
1. ローカルビルド
自分のPCで直接ビルドを行う方法。
-
メリット
- すぐに試せる(手軽にビルド&テストが可能)
- CI/CDの設定が不要
- ネイティブの設定やデバッグがしやすい
-
デメリット
- 環境構築が必要(Xcode, Android Studio, 各種SDKのセットアップ)
- 複数人で開発する場合に環境差異が出る
- 自動化されていないので手間がかかる
-
代表的なツール
- Xcode(iOS)
- Android Studio(Android)
- react-native run-ios / react-native run-android
- flutter build ios / flutter build apk
2. CI/CDを利用したビルド
CI/CD(継続的インテグレーション & デリバリー)を使ってビルドを自動化する手法。
-
メリット
- 複数人の開発環境が統一される
- 毎回手動でビルドする必要がなくなる
- 自動テストやリリースのワークフローと連携しやすい
-
デメリット
- 設定が必要(GitHub Actions, Bitrise, Codemagicなど)
- ネイティブの設定変更があった場合、適切に対応しないとビルドが失敗する
-
代表的なサービス
- GitHub Actions GitHubと連携しやすい。YAMLでワークフロー管理。
- Bitriseモバイル特化のCI/CD。GUIで設定しやすい。
- Codemagic Flutter開発に特化。
- EAS Build (Expo) Expo向けの公式ビルド環境。
- Fastlane iOS/Androidの自動化ツール(CI/CDと組み合わせて利用)。
3. クラウドビルドサービス
ローカル環境ではなく、クラウド上でビルドを行う方法。
-
メリット
- 環境構築が不要
- Macを持っていなくてもiOSアプリがビルドできる(M1 Mac必須のビルドでも使える)
- CI/CDの一部として利用できる
-
デメリット
- 無料枠に制限がある(ビルド回数・時間)
- クラウド側の障害で影響を受ける
-
代表的なサービス
- EAS Build Expo向けのクラウドビルド
- App Store Connect (Xcode Cloud) Apple公式のクラウドCI/CD
- Firebase App Distributionテスター向けの配布サービス付き
- TestFlight Apple公式のベータ版配布サービス
4. Over-the-Air (OTA) 更新
アプリをストアの審査なしで更新できる手法。
-
メリット
- JavaScript/TypeScriptの修正を即時リリース可能(React Native)
- アップデートの手間を減らせる
-
デメリット
- ネイティブコードの変更は不可
- Appleのガイドライン変更で利用制限があるかも(将来的なリスク)
-
代表的なツール
- CodePush (2025年3月終了予定) App CenterのOTA更新(React Native向け)
- EAS Update Expoの公式OTA更新
- Firebase Remote Config一部の機能を動的に変更可能
どのビルド手法を選ぶべきか?
- ローカルビルド → 開発初期や簡単な確認
- CI/CDビルド → チーム開発or自動化したい場合
- クラウドビルド → ローカル環境の依存を減らしたい場合
- OTA更新 → JavaScriptレイヤーのみの即時更新が必要な場合
特にExpo EAS Build + EAS Updateは、今後React Nativeでのアプリ開発の主流になりそう!