きっかけ
Androidプロジェクトのbuild.gradleファイルでエラーが起きた際、そもそもアプリがビルドされ、ユーザーの端末で起動するまでにどのような処理が動いているのか、その全体像が気になったことがこの記事をまとめたきっかけです。
アプリがユーザーの元に届き、起動するまで
Androidアプリの開発からユーザーによる起動までには、大きく分けて2つのフェーズが存在します。
- ビルドフェーズ: 開発者のPCで、ソースコードからインストールファイルを作成する段階。
- 起動フェーズ: ユーザーの端末で、アプリアイコンがタップされてから画面が表示されるまでの段階。
ここでは、それぞれのフェーズの処理の流れを記述しています。
【1. ビルドフェーズ】 アプリがビルドされる時の処理の流れ
開発者がAndroid Studioでアプリをビルドする際、Gradleというツールがbuild.gradleやsettings.gradleといった設定ファイルを元に、インストールファイル(APK/AAB)を構築します。
Step 1: settings.gradle の評価
ビルドの初期化 フェーズです。
- プロジェクトにどのモジュールが含まれているかを定義します。
- Gradleはまずこのファイルを評価し、プロジェクトの全体構造を把握します。
Step 2: プロジェクトルートの build.gradle の評価
構成 フェーズです。
- プロジェクト全体に共通する設定(リポジトリの場所やビルドツールのバージョンなど)を定義します。
Step 3: 各モジュールの build.gradle の評価
- モジュールごとの詳細な設定(依存ライブラリ、SDKバージョン、アプリのバージョンなど)を定義します。
これらのプロセスを経て、アプリのインストールファイルが完成します。ユーザーの端末では、この完成品だけが使用されます。
【2. 起動フェーズ】 ユーザーがアプリを起動する時の処理の流れ
ユーザーがスマートフォンのホーム画面でアプリアイコンをタップした後の流れです。
Step 1: ユーザーがアイコンをタップ
- ホーム画面アプリである
Launcherが、ユーザーのタップ操作を認識します。
Step 2: Activity Manager Service (AMS) への通知
-
LauncherがAndroidシステムの司令塔であるAMSに「〇〇アプリを起動してほしい」と伝えます。
Step 3: アプリプロセスの準備
- AMSは、そのアプリのプロセスが存在するか確認します。
-
存在しない場合(初めての起動など):
- Android OSの特別なプロセス
Zygoteをコピーして、新しいアプリ用のプロセスを素早く作成します。 - Zygoteとは
アプリの起動を高速化するために、基本的なライブラリなどを予め読み込んで待機している「プロセスの雛形」です。
- Android OSの特別なプロセス
-
存在する場合(バックグラウンドで待機中など):
- バックグラウンドで待機中などの既存プロセスを再利用します。
-
存在しない場合(初めての起動など):
Step 4: Applicationクラスの起動
- 新しく作られたプロセス上で、アプリ全体の初期化を行う
Applicationクラスがインスタンス化され、そのonCreate()メソッドが呼び出されます。(アプリ起動中に一度だけ呼ばれます)
Step 5: Activityの起動とライフサイクル
- AMSは、
AndroidManifest.xmlで指定された起動Activity(通常はMainActivity)のインスタンスを作成します。 - ここから、以下のライフサイクルメソッドが順番に呼び出されます。
- onCreate(): Activityが生成される最初のタイミング。UIのレイアウト設定など、起動時のほとんどの初期化処理をここで行います。
- onStart(): Activityがユーザーに見えるようになる直前。
- onResume(): Activityが完全に前面に表示され、ユーザーが操作可能になった状態。
Flutterの場合
起動されるActivityがネイティブのFlutterActivityとなり、そのonCreate()の中でDartの世界が動き出します。
Step 6: UIの描画
-
onResume()までの処理が終わると、AndroidフレームワークがonCreate()で指定されたレイアウト情報を元に、UI要素の計算→ 配置→ 描画を行います。 - 最初のフレームがレンダリングされ、ユーザーはついにアプリの画面を見ることができます。
参考資料