App execution process (Android)

์‚ฌ์šฉ์ž๊ฐ€ ๋””๋ฐ”์ด์Šค์—์„œ ํ”Œ๋Ÿฌํ„ฐ๋กœ ๊ฐœ๋ฐœํ•œ ์•ฑ์„ ์‹คํ–‰ํ–ˆ์„๋•Œ, Android OS ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

Android

1. ์•ฑ ํด๋ฆญ

์‚ฌ์šฉ์ž๊ฐ€ ๋””๋ฐ”์ด์Šค์—์„œ ์•ฑ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด, Android ๋Ÿฐ์ฒ˜๊ฐ€ AndroidManifest.xml์˜ <intent-filter> ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ฑ์˜ ์ง„์ž…์ ์„ ํƒ์ƒ‰/ํŒ๋‹จ ํ›„, ์‹œ์Šคํ…œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.

๐Ÿณ ์‹œ์Šคํ…œ ์„œ๋ฒ„: ์•ˆ๋“œ๋กœ์ด๋“œ ๋ถ€ํŒ…์‹œ, Zygote๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋งŒ๋“  ๋ณ„๋„์˜ ์‹œ์Šคํ…œ ํ”„๋กœ์„ธ์Šค.

  • ์•ˆ๋“œ๋กœ์ด๋“œ ์šด์˜์ฒด์ œ์˜ ํ•ต์‹ฌ ์„œ๋น„์Šค๋“ค์ด ๋™์ž‘ํ•˜๋Š” ๊ณณ.

    • ์•ฑ ์„ค์น˜/์‚ญ์ œ

    • UI ์œˆ๋„์šฐ ๋ฐฐ์น˜ ๋“ฑ

// MainActivity๊ฐ€ ์‹คํ–‰
<activity android:name=".MainActivity">
  <intent-filter>
    // MAIN ํ–‰๋™์„ ํ• ์ˆ˜ ์žˆ๋Š” LAUNCHER์— ๋œจ๋Š” ์•ฑ => ์•ฑ ์•„์ด์ฝ˜ ๋ˆŒ๋ €์„๋•Œ ์‹คํ–‰๋˜๋„๋ก ํ—ˆ์šฉ
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

๐Ÿณ intent-filter: ์•ฑ์ด ์–ด๋–ค ์‹คํ–‰ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…์‹œํ•œ ๊ฒƒ.

  • ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ์•ฑ ๊ฐ„ ํ†ต์‹ , ์‹คํ–‰ ์š”์ฒญ์„ intent๋ผ๋Š” ๋ฉ”์‹œ์ง€ ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

  • ๋”ฐ๋ผ์„œ, ์•ฑ์ด intent๋กœ ํ‘œํ˜„๋œ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก, AndroidManifest.xml์— ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.

2. Zygote ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ

Zygote์€ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์šด์˜์ฒด์ œ ํ”„๋กœ์„ธ์Šค์ด๋‹ค.

์‹œ์Šคํ…œ ์„œ๋ฒ„๋Š” ํด๋ฆญํ•œ ์•ฑ์ด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด, Zygote๋ฅผ ๋ณต์ œํ•ด ์‹คํ–‰๋  ์•ฑ์˜ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑํ•œ๋‹ค. ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค ์•ˆ์˜ ART๊ฐ€ 1๋ฒˆ์—์„œ ํƒ์ƒ‰ํ•œ ์•ฑ์˜ ์ง„์ž…์ ์ธ MainActivity๋ฅผ ๋กœ๋”ฉํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•œ๋‹ค.

๐Ÿณ Zygote: ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค

  • ์•ˆ๋“œ๋กœ์ด๋“œ OS ๋ถ€ํŒ…์‹œ, ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋จ.

  • ์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์—, ์•ฑ์„ ์‹คํ–‰ํ• ๋•Œ๋งˆ๋‹ค ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • ์ด๋•Œ, ์•ฑ๋งˆ๋‹ค JVM ๋“ฑ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์‹ค์‹œํ•˜๋ฉด ์•ฑ ์†๋„ ์ €ํ•˜๋กœ ์ด์–ด์ง

  • ๋”ฐ๋ผ์„œ Zygote ๋ผ๋Š” ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šดํ›„, ์•ฑ์ด ์‹คํ–‰ ๋ ๋•Œ๋งˆ๋‹ค Zygote๋ฅผ ๋ณต์‚ฌํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ

    • Zygote์—์„œ๋Š” ์ด๋ฏธ ์‹คํ–‰์ค‘์ธ JVM์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™” ๋น„์šฉ์„ ์ค„์ผ์ˆ˜ ์žˆ์Œ.

3. MainActivity ์‹คํ–‰

Flutter๋ฅผ ์‚ฌ์šฉํ•œ ์•ฑ์˜ ๊ฒฝ์šฐ, MainActivity๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ FlutterActivity๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค.

์ฆ‰, MainActivity ์‹คํ–‰ โ‡’ ART๊ฐ€ MainActivity ์ธ์Šคํ„ด์Šค(FlutterActivity๋ฅผ ์ƒ์†ํ•œ) ์ƒ์„ฑ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ ์žฌ ์ธ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด FlutterActivity๋Š” ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

FlutterActivity๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ libflutter.so๋ผ๋Š” Flutter ์—”์ง„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ Dart VM์„ ์ƒ์„ฑํ•˜๊ณ  Dart์˜ EntryPoint์ธ main.dart๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ dart์ฝ”๋“œ๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿณ Flutter ์—”์ง„์„ ART๊ฐ€ ์‹คํ–‰ํ•ด์„œ ๋„์šด๋‹ค ๋ผ๋Š” ํ‘œํ˜„์„ ์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž

  • FlutterActivity ๋‚ด๋ถ€์—์„œ๋Š” JNI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์ธ libflutter.so๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    • ๐Ÿณ JNI: Java์—์„œ C++ ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ธŒ๋ฆฟ์ง€ ์—ญํ• 

  • ๋ถˆ๋Ÿฌ์˜จ libflutter.so๋กœ ์ธํ•ด, Flutter ์—”์ง„์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ๊ทธ๋Ÿฐ๋ฐ ART๋Š” Java ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๊ณ , C++ ์˜์—ญ์€ ART์™€ ๋ณ„๊ฐœ๋กœ JNI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ๋ถˆ๋Ÿฌ์„œ ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค.

  • ์ฆ‰, ํ˜ธ์ถœ ์ž์ฒด๋Š” ART๊ฐ€ ํ–ˆ์ง€๋งŒ, Flutter ์—”์ง„์€ C++ ๋Ÿฐํƒ€์ž„์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ART์™€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. (ART๋Š” Java ๋Ÿฐํƒ€์ž„)

4. UI ๋ Œ๋”๋ง

void main() {
  runApp(MyApp());
}

์‹คํ–‰๋œ Flutter ์—”์ง„ ๋‚ด๋ถ€์—์„œ Dart VM์ด ์‹คํ–‰๋˜๋Š”๋ฐ, ์ตœ์ดˆ EntryPoint์ธ main.dart์˜ main ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด Flutter ์•ฑ ๋ Œ๋”๋ง ํŒŒ์ดํ”„ ๋ผ์ธ์ด ์‹คํ–‰๋œ๋‹ค. (Flutter์˜ ๋ Œ๋”๋ง ํŒŒ์ดํ”„ ๋ผ์ธ์€ ๋”ฐ๋กœ ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด๋‹ค)

Last updated