Skip to content

SeongUgJung/Android-Fundamental

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

12 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Android-Fundamental

์ด ๊ธ€์€ ๋„ค์ด๋ฒ„์˜ ๋…ธ์žฌ์ถ˜ ๊ฐœ๋ฐœ์ž๋‹˜๊ป˜์„œ ์ฃผ์‹  ์งˆ๋ฌธ์ง€์ด๋ฉฐ ์ œ ์Šค์Šค๋กœ์—๊ฒŒ ๋‹ต์„ ํ•ด๋ณด๊ณ ์ž ๋งŒ๋“  ๋‹ต๋ณ€๋“ค์ž…๋‹ˆ๋‹ค.

Disclaimer

์ž˜๋ชป ์•Œ๊ฑฐ๋‚˜ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ MR ์„ ํ†ตํ•ด ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฐ˜์˜ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ? ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹ต๋ณ€์€ ํ‹€๋ฆฐ ๋‹ต๋ณ€์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.

Binder ๊ฐœ๋…๊ณผ Binder์—์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ

? ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ ๋งŒ๋“  ๊ฒƒ

  • ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์—์„œ ๊ธฐ์กด Socket ์ด๋‚˜ File ์ž…์ถœ๋ ฅ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋” ํšจ์œจ์ ์ด๊ณ  ๋น ๋ฅธ ํ”„๋กœ์„ธ์Šค ํ†ต์‹ ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง. ํ”„๋กœ์„ธ์Šค๊ฐ„ ํ†ต์‹ ์ด๊ธฐ ๋•Œ๋ฌธ์— Binder๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ์ œํ•œ์ด ์žˆ์Œ. ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ RemoteException / ANR๋“ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

  • ๋ฆฌ๋ˆ…์Šค ์ปค๋„๋ ˆ๋ฒจ์—์„œ ์ œ๊ณตํ•˜๋Š” IPC ๋ฉ”์นด๋‹ˆ์ฆ˜

  • ์ผ๋ฐ˜์ ์ธ IPC ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ fd๋‚˜ shmem๊ฐ™์€ OS๋ ˆ๋ฒจ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ

  • ์›๋ž˜๋Š” BeOS์—์„œ ์‚ฌ์šฉํ•˜๋˜ IPC ๋ฉ”์นด๋‹ˆ์ฆ˜์ด์—ˆ์ง€๋งŒ, OpenBinder๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋กœ ๋ฆฌ๋ˆ…์Šค์— ํฌํŒ…๋จ. (ํ•ต๋ณธ ์—ฌ์‚ฌ๋‹˜ ๋งŒ๋งŒ์„ธ)

  • Ref

by @suribada ์งˆ๋ฌธ ์˜๋„: ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์žˆ๋Š”๊ฐ€? ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœํ•˜๋ฉด์„œ Binder๋ผ๋Š” ๊ฑธ ๊ณ ๋ คํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๊ฐ€?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) ์•ฑ์€ ๊ฐ๊ฐ ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ Binder๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ContentProvider๋‚˜ Aidl์„ ์‚ฌ์šฉํ•œ Remote ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค. Binder๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ์ œํ•œ์ด ์žˆ๊ณ , ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์œผ๋กœ Bitmap์„ ์ง์ ‘ ์ „๋‹ฌํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ Uri๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

Zygote

? pid 1 ์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์•ฑ์˜ ์‹คํ–‰์„ ๊ด€์žฅํ•˜๋Š” ๋…€์„

  • ์•ˆ๋“œ๋กœ์ด๋“œ ๋ชจ๋“  ์•ฑ ํ”„๋กœ์„ธ์Šค๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ๋ฐ ๋กœ๋“œ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Œ. ๋งค๋ฒˆ ์•ฑ ์‹œ์ž‘์‹œ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์„œ ํ•„์š”ํ•œ ์ดˆ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆผ. ์ด ๋ถ€๋ถ„์„ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ๋“œํ•ด๋‘” ๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ฌ - Zygote. ๋‹ค๋ฅธ ์•ฑ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ fork (clone)ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ƒ์„ฑํ•จ. ์•ˆ๋“œ๋กœ์ด๋“œ Q ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Zygote ๋Œ€์‹  common process pool์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋จ (fork์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์—ฌ์คŒ). ๋”ฐ๋ผ์„œ Q ์ดํ›„์—๋Š” Zygote๊ฐ€ ์—†์–ด์งˆ ์˜ˆ์ •.

  • art runtime ๊ตฌ๋™์— ์— ํ•„์š”ํ•œ framrwork์˜ class๋ฐ resource๋ฅผ preloadํ•˜๊ณ  ์žˆ๋Š” process

  • ActivityManagerService์˜ ์š”์ฒญ์— ๋”ฐ๋ผ, uid, ๊ฐ์ข… sandbox ์„ค์ •์„ ๊ตฌ์„ฑํ•œ ๋‹ค์Œ ActivityThread.main ์„ ์ˆ˜ํ–‰ํ•ด, ์•ฑ์ด ์žฌ๋น ๋ฅด๊ฒŒ ๊ตฌ๋™๋˜๊ฒŒ ๋„์™€์คŒ

by @suribada ์งˆ๋ฌธ ์˜๋„: fork๋กœ ์•ฑ์ด ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ๊ณผ, ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๋ถ€ํŒ… ์‹œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณด์•˜๋Š”๊ฐ€?

ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„

? ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ๋™์‹œ์„ฑ ๋™์ž‘์‹œ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์— ๋”ฐ๋ผ์„œ ์šฐ์„  ๋™์ž‘์—ฌ๋ถ€๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

by @suribada

  • ์งˆ๋ฌธ์˜๋„: https://developer.android.com/guide/components/processes-and-threads ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ดค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ฑ์˜ ๋ฌธ์ œ์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์ด ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•˜๋ฉด ํ•ด๊ฒฐ์ด ์‰ฌ์›Œ์ง€๊ธฐ๋„ ํ•œ๋‹ค.

    • ๋‹ต๋ณ€: ํฌ๊ทธ๋ผ์šด๋“œ/๊ฐ€์‹œ์ /์„œ๋น„์Šค/๋ฐฑ๊ทธ๋ผ์šด๋“œ/๋นˆ ํ”„๋กœ์„ธ์Šค ์ˆœ์„œ. ๋นˆ ํ”„๋กœ์„ธ์Šค๋Š” ์บ์‹œ ์šฉ๋„๋กœ ๋‚จ์•„์žˆ์ง€๋งŒ, ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋„ ์žˆ๋‹ค. Activity์˜ onDestroy๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋ถˆ๋ฆฐ๋‹ค๋Š” ๋ณด์žฅ์ด ์—†๋Š” ์ด์œ  ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋‹ค.
    • ์•ฑ ์œ„์ ฏ์—์„œ AsyncTask๋ฅผ ์จ๋„ ์•ˆ ๋˜๊ธฐ๋„ ํ•œ๋‹ค. ์•ฑ ์œ„์ ฏ์ด ์—…๋ฐ์ดํŠธ ์•ˆ ๋˜๋‹ค๊ฐ€ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ๋‚˜๋ฉด ์—…๋ฐ์ดํŠธ ๋œ๋‹ค๊ณ  ๋ฌธ์˜๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
    • ์•ฑ ์œ„์ ฏ๋„ BroadcastReceiver๋ผ์„œ onReceive()๊ฐ€ ๋๋‚˜์ž๋งˆ์ž ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งŽ๋‹ค.
    • ์ฆ‰ ์•ฑ ์œ„์ ฏ์—์„œ ๋น„๋™๊ธฐ ๋™์ž‘์„ ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ์„œ๋น„์Šค์— ๋„˜๊ฒจ์„œ ์„œ๋น„์Šค์—์„œ ์ง„ํ–‰ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
    • ์•„๋ž˜ ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ ๊ฐ€์šด๋ฐ BroadcastReceiver์—์„œ Toast๋ฅผ ๋„์›Œ๋„ ๋˜๋Š”๊ฐ€ ํ•˜๋Š” ๊ฒƒ๋„ ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

by @huewu

  • ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ์—์„œ ํ”„๋กœ์„ธ์Šค ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์—์„œ ๋™์ž‘ํ•˜๋Š” ์•ฑ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ž‘์—…๊ณผ ์–ผ๋งˆ๋‚˜ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์ด ์žˆ๋Š”๊ฐ€์—๋”ฐ๋ผ ๊ฒฐ์ •๋จ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’๊ณ , ์•„๋ฌด๋Ÿฐ ์•ฑ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ์„ธ์Šค(EMPTY_PROCESS)๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–์Œ.

  • ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์ˆœ์œ„๋Š” ํฌ ๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋จ. ์šฐ์„ , Low Memory Killer๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ Kill ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ์„ธ์Šค๋ถ€ํ„ฐ Killํ•จ. ๋‘ ๋ฒˆ์งธ๋กœ, ํ”Œ๋žซํผ ๋™์ž‘ ๊ตฌํ˜„ ์‹œ ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์ˆœ์œ„์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ. ์˜ˆ๋ฅผ ๋“ค์–ด, Doze ๋ชจ๋“œ ์ง„์ž… ์‹œ, ForegroundService๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋Š” Doze ์ œ์•ฝ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ๋ณด๋‹ค ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ํ”„๋กœ์„ธ์Šค๋Š” Doze ์ œ์•ฝ์„ ๋ฐ›๊ฒŒ๋จ.

Low Memory Killer์™€ OOM Killer์˜ ์ฐจ์ด

? Low Memory Killer ํ˜„์žฌ foreground ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ ๋‹ค๋ฅธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ Foreground ์•ฑ์„ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด OOM Killer ๋Š” ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๊ฐ€ ์ฑ„ ์ด๋ฃจ์–ด์ง€๊ธฐ ์ „์ด๊ฑฐ๋‚˜ ๋”์ด์ƒ ํ™•๋ณดํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํ• ๋‹นํ•˜๋Š” ์•ก์…˜์ด ๋ฐœ์ƒํ•  ๋•Œ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

by @huewu

  • Low Memory Killer๋Š” OOM์ด ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ํ”Œ๋žซํผ์—์„œ ์„ ์ œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ. ๋”ฐ๋ผ์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ํ”„๋กœ์„ธ์Šค๋ถ€ํ„ฐ ์ข…๋ฃŒํ•˜๊ฒŒ ๋จ. Out of Memory Killer๋Š” ์ •๋ง๋กœ allocataeํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์—†์„๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์ˆœ์œ„ ๊ด€๊ณ„์—†์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ, ์•ฑ runtime crash๋‚˜ kernal crash๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.

Ref

by @suribada ์งˆ๋ฌธ ์˜๋„: ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š”๊ฐ€? OOM Killer์™€ ์™œ ๊ตฌ๋ถ„๋˜๋Š”๊ฐ€?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) OOM Killer ๋™์ž‘ํ•˜๊ธฐ ์ด์ „์— Low Memory Killer๊ฐ€ ๋™์ž‘ํ•œ๋‹ค. OOM Killer๋Š” ์ฃผ ๋™์ž‘์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข…๋ฃŒ์‹œํ‚ค๋Š”๋ฐ, Low Memory Killer๊ฐ€ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ค„์ด๋Š” ๋…ธ๋ ฅ์„ ๋จผ์ € ํ•˜๊ณ  ๋„์ €ํžˆ ์•ˆ ๋  ๋•Œ OOM Killer๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค ๋ถ„๋ฆฌ ์ด์œ  ๋™์ž‘

? ์ฃผ๋กœ ์ƒ์ฃผ ์„œ๋น„์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ ์–ธํ•  ๋•Œ ๋งŽ์ด ์ด์šฉ๋œ๋‹ค. ์ƒ์ฃผ ์„œ๋น„์Šค๋Š” ๊ทธ ํŠน์„ฑ์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฅ๊ธฐ๊ฐ„ ์ ์œ ํ•˜๋Š”๋ฐ ๋ฉ”์ธ ์•ฑ์— ์ข…์†๋œ ํ”„๋กœ์„ธ์Šค๋กœ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ๋ฉ”์ธ ์•ฑ๊ณผ ์ปดํ“จํŒ… ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค๊ฐ€ ์˜๋„์ ์ด์ง€ ์•Š์€ ์ƒํ™ฉ์— ์ข…๋ฃŒํ•  ์ƒํ™ฉ์ด ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์„ ์–ธํ•˜์—ฌ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณ„๋„๋กœ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค. ๋‹ค๋งŒ ์ด๊ฒฝ์šฐ Preference ๋“ฑ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ž์›์„ ๊ณต์œ ํ•˜๋ ค ํ•  ๊ฒฝ์šฐ ์„œ๋กœ๊ฐ„์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜์†์„ฑ ๋ฐ์ดํ„ฐ๋Š” ContentProvider ๋ฅผ ํ†ตํ•ด์„œ ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

by @huewu

  • ๋Œ€ํ‘œ์ ์œผ๋กœ ์Œ์•… ์žฌ์ƒ์„ ์œ„ํ•œ ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋ฅผ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ (์ถ”์ฒœ๋จ). ๋งŒ์ผ ์Œ์•… ์•ฑ์ด ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ๋ฐœ์ƒํ•จ
    • UI ์ƒ์˜ ์˜ค๋ฅ˜ ํ˜น์€ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์•ฑ ์ข…๋ฃŒ ํ˜น์€ ์žฌ์‹œ์ž‘์‹œ ์žฌ์ƒ์ค‘์ธ ์Œ์•…์ด ๋Š๊ธธ ์ˆ˜ ์žˆ์Œ.
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Œ์•… ์žฌ์ƒ์„ ์œ„ํ•ด ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์•ฑ UI์— ๊ด€๋ จ๋œ ์ฝ”๋“œ๋“ค๋„ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ๋˜์–ด ์žˆ์–ด์•ผํ•จ. ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ.

by @suribada ์งˆ๋ฌธ ์˜๋„: ํ”„๋กœ์„ธ์Šค ๋ถ„๋ฆฌ๋ฅผ ํ•ด๋ณธ ์ ์ด ์žˆ๋Š”๊ฐ€? ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ•œ ๊ฑด ์•„๋‹Œ๊ฐ€?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) ์•ฑ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋‹ค.

Http Call ๋ฐฉ๋ฒ•(library?)

์ดˆ์ฐฝ๊ธฐ์—๋Š” Java ์˜ ๊ธฐ๋ณธ http api ์ธ HttpClient ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์˜€์œผ๋‚˜ ํ˜„์žฌ๋Š” OkHttp ๊ฐ€ ๋„๋ฆฌ ํ†ต์šฉ๋˜๊ณ  ์žˆ๋‹ค. OkHttp ๋Š” ์ €์ˆ˜์ค€์˜ ๊ตฌํ˜„์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ ˆ๋ฒจ์˜ ๊ตฌํ˜„์ฒด๋กœ Retrofit ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. Retrofit ์€ ๊ธฐ๋ณธ๋™์ž‘์ด ๋น„๋™๊ธฐ์„ฑ์ด๋ฉฐ ๊ฐ ๋‹จ๊ณ„๋ณ„๋กœ ๋‹ค์–‘ํ•œ Interface ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ Http ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: ์˜ˆ์ „ ๋ฐฉ์‹์œผ๋กœ ์—ฌ์ „ํžˆ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. Apache HttpClient๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์™œ ์•„์ง ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ์ง€(์™œ deprecated ๋˜์—ˆ๋Š”์ง€๋„.. Apache HttpClient๊ฐ€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๊ฑฐ์˜ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋งŒ๋“ค์–ด์ง), HttpUrlConnection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ ์ด ๋ฌด์—‡์ธ์ง€, Retrofit์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด RxJava๊นŒ์ง€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š”์ง€(๊ธฐ์™• Retrofit๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด RxJava๋ฅผ ์“ฐ๋Š”๊ฒŒ ๋‹จ์ˆœํ•ด์ง), ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€.

ActivityThread

by @suribada ์งˆ๋ฌธ ์˜๋„: Call Stack์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ์žˆ๋Š” ActivityThread๋ฅผ ์‚ดํŽด๋ดค๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค. ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋„ ์ž์ฃผ ๋ณด๊ฒŒ ๋œ๋‹ค.

๋‹ต๋ณ€: main ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘์ ์ด๋‹ค. ๋ฉ”์ธ ๋ฃจํผ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์ด๋ฒคํŠธ ํ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋™์ž‘ํ•˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  system_server ํ”„๋กœ์„ธ์Šค์˜ ActivityManagerService์™€์˜ ํ†ต์‹ ๋„ ๋‹ด๋‹นํ•œ๋‹ค.

by @huewu

  • ?Application Main Thread.

ActivityThread์™€ ActivityManagerService๊ฐ„์˜ ํ†ต์‹ 

??? ์•„๋งˆ๋„...RPC ํ†ต์‹ ? AOSP ์ฝ”๋“œ ๋œฏ์–ด๋ณธ ๊ธฐ์–ต์—๋Š” AIDL ์„ ์ด์šฉํ•œ RPC ํ†ต์‹ ์ด๋‹ค. ๊ณผ๊ฑฐ ์ด AIDL ์„ ์Šค๋‚ดํ•‘ ํ•ด์„œ ๊ธฐ๊ธฐ์˜ ์ „์ฒด ์•ฑ Lifecycle ์„ ๋ชจ๋‹ˆํ„ฐํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“  ์ ์ด ์žˆ๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค์ธ system_server์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด๋ณด์•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: aidl๋กœ ์ƒ์„ฑํ•œ ๊ฑด ์•„๋‹ˆ๊ณ  ApplicationThread๋ผ๋Š” Stub ๊ตฌํ˜„์ด ์žˆ์–ด์„œ sytem_server์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

ANR

UI Thread ์—์„œ Network IO, File IO, ๋ฐ˜๋ณต๋ฌธ ๋“ฑ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ Not Response ๋กœ ์ธํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. anr ์ด ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ /data/anr/trace.txt ๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์–ด๋Š ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ธ”๋Ÿญํ•˜๊ณ  ์–ด๋Š ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ์ค‘์ธ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ถ€ ๊ธฐ๊ธฐ๋Š” ๋ฐ”๋กœ ์ถ”์ถœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ผ๋ถ€ ๊ธฐ๊ธฐ๋Š” adb-shell ๋กœ ํ•ด๋‹น ํŒŒ์ผ์„ sdcard ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

by @huewu

  • Main Thread๋Š” ๋ฉ”์‹œ์ง€ Queue ํ˜•์‹์œผ๋กœ ๋™์ž‘. ํ•ด๋‹น Queue์—์„œ ์ผ์ • ์‹œ๊ฐ„๋‚ด์— ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด ANR์ด ๋ฐœ์ƒํ•จ. ANR์ด ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ค€์€ Main Thread์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” Application Component์— ๋”ฐ๋ผ ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์ง. ์˜ˆ๋ฅผ๋“ค์–ด Activity์˜ ๊ฒฝ์šฐ 5์ดˆ. Broadcast Receiver์˜ ๊ฒฝ์šฐ ์กฐ๊ธˆ ๋” ๊ธด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ (10์ดˆ)

by @ted

  • Application Not Responding์˜ ์ค„์ž„๋ง
  • ํ™”๋ฉด์„ ํ„ฐ์น˜ํ•˜๊ณ ๋‚˜์„œ 5์ดˆ์•ˆ์— ์‘๋‹ต์ด ์—†๋Š”๊ฒฝ์šฐ ๋ฐœ์ƒํ•จ : BroadcastReceiver์˜ ์ด์Šˆ๋„ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š” ์œ„์˜ ์ด์œ ๋•Œ๋ฌธ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆด๋ฒ•ํ•œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ UI์“ฐ๋ ˆ๋“œ์—์„œ ๋Œ๋ฆฌ๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•จ
  • ์˜ˆ์ „์— ์„œ๋ฒ„ํ†ต์‹ ์„ ํ• ๋•Œ UI์“ฐ๋ ˆ๋“œ์—์„œ ๋Œ๋ฆฌ๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๊ณ  AsyncTask๋ฅผ ์“ฐ๋”๋ผ๋„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ์Œ : ์š”์ฆ˜์—๋Š” ์นœ์ ˆํ•˜๊ฒŒ UI์“ฐ๋ ˆ๋“œ์—์„œ ํ•˜์ง€ ๋ง๋ผ๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์คŒ
  • RxJava, Coroutine์—์„œ ์“ฐ๋ ˆ๋“œ ์Šค์ผ€์ค„๋Ÿฌ ๊ด€๋ฆฌ๋ฅผ ์ž‘์—…์— ๋งž๊ฒŒ ์ž˜ ์ „ํ™˜ ์‹œ์ผœ์ค˜์•ผ ํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•จ

by @suribada ์งˆ๋ฌธ ์˜๋„: ANR์„ ๋ชจํ˜ธํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) ๋ช…์‹œ์ ์œผ๋กœ(AsyncTask, IntentService ๋“ฑ์„ ํฌํ•จํ•ด์„œ) ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ์€ ๋ชจ๋‘ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ•˜๋Š” ๋™์ž‘์ด๋‹ค. Service๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ด์„œ(UI๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ์ผ ๋ฟ์ธ๋ฐ..) ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ๋กœ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด onStartCommand()๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ์ด๋•Œ๋ฌธ์— Activity์˜ ๋™์ž‘์ด ๋ฉˆ์ถœ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋•Œ๋ฌธ์— ANR์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

Looper/Handler/MessageQueue

ํŠน์ • ์“ฐ๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ Handler ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด Handler ๋Š” ์„ ์–ธํ•˜๋Š” ์‹œ์ ์— Thread ์— ์ข…์†๋œ๋‹ค. Handler ๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•˜๋Š” Runnable ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ด๋Š” Message Queue ์— ๋‹ด๊ฒจ์ ธ์žˆ๋‹ค๊ฐ€ Looper ๊ฐ€ Queue ์—์„œ ํ•˜๋‚˜์”ฉ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: Handler์—์„œ ๋ณด๋‚ด๋Š” ๋ชจ๋“  Message๋Š” MessageQueue๋ฅผ ๊ฑฐ์ณ์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) Looper๊ฐ€ MessageQueue๋ฅผ ์œ ์ง€ํ•œ๋‹ค. Handler๋Š” MessageQueue์— Message๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Looper๋Š” ๋ช‡ ๊ฐœ?

Thread ๋‹น 1๊ฐœ

by @suribada ์งˆ๋ฌธ ์˜๋„: Thread Local Storage์— Looper๊ฐ€ ์ €์žฅ๋˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: Thread Local Strorage์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋‹น 1๊ฐœ์ด๋‹ค. ๋ฉ”์ธ Looper๋Š” ์•ฑ์ด ์ฒ˜์Œ ๊ตฌ๋™๋˜๋ฉด์„œ ActivityThread์—์„œ ์ƒ์„ฑํ•ด๋‘๊ณ  ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ์ด๋ฒคํŠธ ํ ์—ญํ• ์„ ํ•œ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ๋Š” Looper.prepare()๋กœ Thread Local Storage์— ์ƒˆ๋กœ ์ƒ์„ฑ๋œ๋‹ค. ์ด๋ฏธ ํ•˜๋‚˜ ์ƒ์„ฑ๋˜์—ˆ๋Š”๋ฐ ๋˜ ๋‹ค์‹œ prepare()๋กœ ์ƒ์„ฑ ์‹œ๋„ํ•˜๋ฉด ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

Message object pool, Message.obtain ์“ฐ๋Š” ์ด์œ .

? Message ๊ฐ€ Handler ์— ์ข…์†๋˜์—ˆ์Œ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•จ

by @huewu

  • ๋ชจ๋“  UI Event ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ System ์ƒํ˜ธ์ž‘์šฉ์€ Message ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌ๋จ. ๋”ฐ๋ผ์„œ, Message Ojbect๋Š” ๋งค์šฐ ๋งŽ์ด ๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ์‚ฌ์šฉ๋จ. ์ด ๋•Œ ๋งค๋ฒˆ ์ž‘์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๋ฉด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•œ Message object ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, Object Pool ํ˜•ํƒœ๋ฅผ ์œ ์ง€ํ•ด Message object๋ฅผ ์žฌํ™œ์šฉ.

by @suribada ์งˆ๋ฌธ ์˜๋„: new Message()๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  Message.obtain()์„ ์™œ ๊ถŒ์žฅํ• ๊นŒ?

๋‹ต๋ณ€: (์œ„ ๋‹ต๋ณ€์— ๋”ํ•ด์„œ) new Message()๋กœ ์ƒ์„ฑํ•ด๋„ ๊ฒฐ๊ตญ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ recycle() ๋ฉ”์„œ๋“œ๋Š” ํ˜ธ์ถœํ•ด์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋งŒ ์ฆ๊ฐ€ํ•˜๋Š” ์…ˆ์ด๋‹ค.

message object pool ๊ฐœ์ˆ˜

???

by @huewu

  • Application Process๋‹น 1๊ฐœ?

by @suribada ๋‹ต๋ณ€: Message์— static ๋ณ€์ˆ˜๋กœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 1๊ฐœ๊ฐ€ ๋งž๋‹ค. ๊ฐœ์ˆ˜๊ฐ€ ์ค‘์š”ํ•˜์ง„ ์•Š์ง€๋งŒ pool์— ์ตœ๋Œ€ Message ๊ฐœ์ˆ˜๋Š” 50๊ฐœ๋‹ค.

message object pool์€ ์–ด๋””์— ์–ด๋–ค ํ˜•ํƒœ๋กœ?

???

by @suribada ๋‹ต๋ณ€: Message์— next ๋ณ€์ˆ˜๊ฐ€ ์žˆ์–ด์„œ ๋งํฌ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค.

Handler ์šฉ๋„

์ผ๋ฐ˜์ ์ธ ์šฉ๋„๋Š” Background Thread ์—์„œ UI Thread ๋กœ ๋™์ž‘์„ ์ „ํ™˜ํ•˜๊ณ ์ž ํ• ๋•Œ Handler ๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

by @huewu

  • LooperThread์— ์—ฐ๊ฒฐ๋œ Looper๋กœ Message๋ฅผ ์ „๋‹ฌํ•˜๊ณ  (sendMessage), ์ „๋‹ฌ๋œ Message๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• (handleMessage). ๋˜ํ•œ Messenger ํ˜•ํƒœ๋กœ ๊ฐ์‹ผ ํ›„ ๋‹ค๋ฅธ Process๋กœ ์ „๋‹ฌ๋˜์–ด IPC ์ฑ„๋„์„ ๋งŒ๋“œ๋Š”๋ฐ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: Handler๋ฅผ ์–ด๋–ค ์šฉ๋„์— ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: ๋ฐฑ๊ทธ๋ผ์šด์—์„œ UI ์—…๋ฐ์ดํŠธ, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์Œ ์ž‘์—… ์˜ˆ์•ฝ, ๋ฐ˜๋ณต UI ๊ฐฑ์‹ , ์‹œ๊ฐ„ ์ œํ•œ ๋“ฑ

View์—์„œ getParent() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ViewParent๋Š”?

??? by @suribada ์งˆ๋ฌธ ์˜๋„: View์˜ getParent() ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ViewGroup์ด ์•„๋‹Œ ViewParent์ธ๋ฐ ์˜๋ฌธ์„ ๊ฐ€์ ธ๋ณด์•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” getParent() ๋ฉ”์„œ๋“œ ๊ฒฐ๊ณผ๋ฅผ ViewGroup์œผ๋กœ ์บ์ŠคํŒ…ํ•œ๋‹ค. ViewParent๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ViewRootImpl๊ณผ ViewGroup์ด ์žˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ์ด๋Š” ๊ฒŒ ViewRootImpl์ด๋‹ค.

ViewRootImpl์˜ ์šฉ๋„๋Š”?

???

by @suribada ์งˆ๋ฌธ ์˜๋„: ViewRootImpl๋„ Call Stack์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ํ™•์ธํ•ด๋ณด์•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: getParent()๋ฅผ ๊ณ„์† ์˜ฌ๋ผ๊ฐ€๋‹ค ๋ณด๋ฉด ๊ฐ€์žฅ ์ƒ์œ„ ViewGroup์ด ์žˆ๋‹ค(๊ตฌ์ฒด์ ์œผ๋กœ๋Š” PhoneWindow$Decorview). View์—์„œ invalidate()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ ์ „์ฒด View ํŠธ๋ฆฌ ์ƒ์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ViewGroup์„ ์ž๊พธ ํ˜ธ์ถœํ•˜๊ณ  ๊ฐ€์žฅ ์ƒ์œ„ ViewGroup์—์„œ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์—ˆ๊ฒ ์ง€๋งŒ, ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ViewGroup์—์„œ ํ•˜์ง€ ์•Š๊ณ  ๋กœ์ง์„ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด ViewRootImpl์ด๋‹ค. getParent()๋กœ ๊ณ„์† ์˜ฌ๋ผ๊ฐ€์„œ ์ตœ์ข…์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ViewRootImpl์ด ๊ฒฐ๊ตญ ์ตœ์ƒ์œ„ ๊ณ„์ธต ์—ญํ• ์„ ํ•˜๊ณ  ์—ฌ๊ธฐ์„œ View ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ฒŒ ํ•œ๋‹ค.

AsyncTask ์‚ฌ์šฉ ์‹œ ๋ฌธ์ œ์ 

ICS ์ด์ „์˜ ๊ฒฝ์šฐ AsyncTask ๊ฐ€ ๋ฒ„์ „๋ณ„๋กœ ThreadPool ๊ด€๋ฆฌ, ๋™์‹œ์„ฑ ๋‹ค์ค‘์ฒ˜๋ฆฌ ๋“ฑ์ด ๊ท ์ผํ•˜์ง€ ์•Š์•„ OS ๋ฒ„์ „๋ณ„๋กœ ์˜๋„๋œ ๋™์ž‘์ด ๋‹ฌ๋ž์œผ๋‚˜ ํ˜„์žฌ๋Š” Min-SDK ๊ฐ€ ICS ์ดํ›„๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ๊ฐ€๋Šฅ์„ฑ์€ ์—†์–ด์กŒ๋‹ค.

๊ณ ์ „์ ์ธ ์ด์Šˆ๋Š” inner class ๋กœ ์„ ์–ธํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ๊ณผ Lifecycle ์— ์˜ํ•œ ์ œ์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋ฏธํก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. anonymous inner class ๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๊ฐ€ View ๊ฐ์ฒด์— ๋ฐ”๋กœ ์ ‘๊ทผํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•ด๋‹น Activity/Fragment ๊ฐ€ ์ข…๋ฃŒ ๋˜์–ด๋„ ์ˆœํ™˜ ์ฐธ์กฐ๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ํ™”๋ฉด์ด ์ข…๋ฃŒ๋˜์–ด๋„ AsyncTask ๋ฅผ ๋ณ„๋„๋กœ ์ข…๋ฃŒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์˜๋„์น˜ ์•Š๊ฒŒ ์ปดํ“จํŒ… ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: AsyncTask๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€?

AsyncTask ์ทจ์†Œ

? AsyncTask.cancel()?? ํ•˜์ง€๋งŒ ์ด๊ฒฝ์šฐ Thread-Interrupt ๊ฐ€ ๋ฐœ์ƒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ doInBackground ์—์„œ for-loop ์™€ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์ด ์žˆ๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ ๋‚ด๋ถ€์— Thread ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ถ”๊ฐ€์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

by @suribada ์งˆ๋ฌธ ์˜๋„: cancel() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ์žˆ๋Š”๊ฐ€?

๋‹ต๋ณ€: cancel() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด isCancelled() ๋ฉ”์„œ๋“œ๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, doInBackGround() ์—์„œ๋Š” isCancelled() ๋ฉ”์„œ๋“œ๋กœ ์ž์ฃผ ์ฒดํฌํ•˜๋Š” ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

mayInterruptIfRunning์˜ ์˜๋ฏธ

???

by @suribada ์งˆ๋ฌธ ์˜๋„: cancel(true ๋˜๋Š” false) ๊ตฌ๋ถ„์„ ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?

๋‹ต๋ณ€: doInBackground() ์Šค๋ ˆ๋“œ์— ์ธํ„ฐ๋ŸฝํŠธํ•  ๊ฒƒ์ธ์ง€์ด๋‹ค. true๋ฅผ ์ „๋‹ฌํ•ด๋„ ์‹ค์ œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒํ•˜๋Š”์ง€๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. Tread์˜ sleep(), join() ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰์ค‘์ด๊ฑฐ๋‚˜ Object์˜ wait()๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด InterruptedException์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๊ณ , doInBackground()์—์„œ Thread.interrupted()๋กœ ์ฒดํฌํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ข…๋ฃŒ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ๋‹ค.

HandlerThread๋ž€?

???

by @huewu

  • Message๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Looper๊ฐ€ ์žˆ๋Š” Thread?

by @suribada ์งˆ๋ฌธ ์˜๋„: IntentService๋ฅผ ๋ถ„์„ ํ•ด๋ณด์•˜๋Š”๊ฐ€? ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ดค๋Š”๊ฐ€?

๋‹ต๋ณ€: Looper.prepare()์™€ Looper.loop()๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ์Šค๋ ˆ๋“œ์—์„œ ๋ฉ”์‹œ์ง€ ํ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ์Šค๋ ˆ๋“œ์—์„œ ์ˆœ์ฐจ ์ž‘์—…์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

deep sleep ํ˜„์ƒ์€ ๋ฌด์—‡์ด๊ณ  ์ด์— ๋Œ€ํ•œ ๋Œ€์ฑ…์€?

? Doze ๋ชจ๋“œ???

by @suribada ์งˆ๋ฌธ ์˜๋„: deep sleep ํ˜„์ƒ์„ ์ดํ•ดํ•˜๊ณ  ๋Œ€์ฑ…์ด ์žˆ๋Š”๊ฐ€?

๋‹ต๋ณ€: wakelock๊ณผ ๋Œ€๋น„๋œ๋‹ค. ์ƒ์‹œ ์ „์›์ด ์—ฐ๊ฒฐ๋œ ๋ฐ์Šคํฌํƒ‘๊ณผ ๋‹ฌ๋ฆฌ ๋ชจ๋ฐ”์ผ ๋‹จ๋ง์€ ๊บผ์ ธ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๊ธฐ๋ณธ์ด๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ ON์‹œ์ผœ์„œ ์‚ฌ์šฉํ•œ๋‹ค. ํ™”๋ฉด์ด ๊บผ์ง€๋ฉด ๋ช‡ ์‹ญ์ดˆ ๋‚ด๋กœ sleep ์ƒํƒœ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ deep sleep ์ƒํƒœ๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ํ˜„์ƒ์€ UI์— ์‹œ๊ฐ„์„ ์˜ˆ๋ฅผ ๋“ค์–ด 1์ดˆ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋ฉด, ํ™”๋ฉด ๊บผ๋‘๊ณ  ํ•œ์ฐธ ์žˆ๋‹ค๊ฐ€ ์‹œ๊ฐ„์„ ๋ณด๋ฉด ์˜ค๋ž˜ ์ „ ์‹œ๊ฐ„์„ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€ ํ˜„์žฌ ์‹œ๊ฐ„์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. 1์ดˆ๊ฐ€ ์•„๋‹ˆ๋ผ 1๋ถ„ ๊ฐ„๊ฒฉ์ด๋ผ๋ฉด ํ•œ์ฐธ๋™์•ˆ์„ ์ด์ „ ์‹œ๊ฐ„ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€ ๊ฐฑ์‹ ํ•˜๋Š” ์…ˆ์ด๋‹ค. ์ค‘๊ฐ„์— ๊ฐฑ์‹ ์„ ํ•˜์ง€ ์•Š๋Š” ์‹œ๊ฐ„์ด ๋ฐ”๋กœ deep sleep์— ๋“ค์–ด๊ฐ„ ๊ฒƒ์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋Œ€์ฑ…์€ ๊ฒฐ๊ตญ wakelock์„ ์žก๋Š” ๊ฒƒ์ธ๋ฐ, AlarmManager๋‚˜ JobScheduler ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

Context๋Š” ์–ด๋–ค ๋ฐ ์“ฐ์ด๊ณ  ์ž์‹ ํด๋ž˜์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜?

? ์ฃผ๋กœ ์•ฑ ์ „์ฒด ๋ฆฌ์†Œ์Šค๋‚˜ ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ, ํ™”๋ฉด์ด๋‚˜ ํŠน์ • ์ƒํ™ฉ์— ์ •๋ณด์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ActivityContext, ServiceContext, BroadcastContext, ApplicationContext

by @suribada ์งˆ๋ฌธ ์˜๋„: Context๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?ํด๋ž˜์Šค hierarchy๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜?

๋‹ต๋ณ€: Context๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. Context๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๋‹ค. ContextWapper๊ฐ€ Context๋ฅผ ์ƒ์†ํ•˜๊ณ  Activity, Service, Application์ด ContextWrapper๋ฅผ ์ƒ์†ํ•œ๋‹ค. ContextImpl๋„ Context๋ฅผ ์ƒ์†ํ•˜๋Š”๋ฐ, ContextWrapper๋Š” Wrappingํ•œ ๊ฒƒ์ด ContextImpl์ด๋‹ค. ContextImpl์ด ์—ฌ๋Ÿฌ ์›๊ฒฉ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๋งคํ•‘์„ ์œ ์ง€ํ•˜๊ธฐ๋„ ํ•˜๊ณ (์˜ˆ์ „์—๋Š” ๋‚ด๋ถ€์— ์œ ์ง€ํ–ˆ๊ณ  ์š”์ฆ˜์€ ๋ณ„๋„ ํด๋ž˜์Šค๋กœ), ์‹ค์ œ ๋™์ž‘์„ ์—ฌ๊ธฐ์„œ ์‹คํ–‰ํ•œ๋‹ค.

Activity์—์„œ this, getBaseContext(), getApplicationContext() ์ฐจ์ด

? Activity ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ContextWrapper ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ด๋Š” ActivityContext ์ด๋‹ค. ActivityContext ๋Š” Activity ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋”์ด์ƒ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์ด๋‚˜ View ์ƒ์„ฑ๋“ฑ์— ์ œ์•ฝ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ์œ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ApplicationContext ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ActivityA์—์„œ ActivityB ํ˜ธ์ถœํ•œ ๊ฒฝ์šฐ ์ƒ๋ช…์ฃผ๊ธฐ/ActivityA๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ ์ƒ๋ช…์ฃผ๊ธฐ

A Pause -> A Stop -> B Create -> B Start -> B Resume -> B Pause -> B Stop -> B Destroy -> A Start -> A Resume

๋‹จ B ๋™์ž‘ ์ค‘ A ๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด re-create ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด B Stop ํ›„ A Create -> B Destroy ๊ฐ€ ๋œ๋‹ค. (์™œ๋ƒ๊ณ  ๋ฌป๋Š”๋‹ค๋ฉด ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋กœ๊ทธ ๋ณด๋ฉด ๊ทธ๋ ‡๋”๊ตฐ์š”...)


(ted)

  • ์ œ๊ฐ€ ๋ฉด์ ‘์—์„œ ๊ผญ ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ(๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ƒ๊ฐํ•œ๊ฒƒ๊ณผ๋Š” ๋งŽ์ด ๋‹ค๋ฅด๊ฒŒ ์›€์ง์ด๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด)
  • startActivity()๋ฐœ์ƒ์‹œ
[A]onPause
[B]onCreate
[B]onStart
[B]onResume
[A]onStop
  • ๋’ค๋กœ๊ฐ€๊ธฐ ๋“ฑ์œผ๋กœ B๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ
[B]onPause
[A]onRestart
[A]onStart
[A]onResume
[B]onStop
[B]onDestroy

onSaveInstanceState() ์‹คํ–‰ ์‹œ์ 

onStop ํ›„ ํ˜ธ์ถœ

  • Activity๊ฐ€ ์—ฌ๋Ÿฌ ์ด์œ (Orientation์ด ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋‹ค๊ฐ€ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ)๋กœ ์ƒํƒœ๊ฐ’์„ ์ €์žฅํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ํ˜ธ์ถœ๋จ
  • ์ €์žฅ๋ ๋•Œ๋Š” onSaveInstanceState(), ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ๋Š” onRestoreInstanceState()๊ฐ€ ํ˜ธ์ถœ๋จ
  • ํ†ต์ƒ์ ์œผ๋กœ onCreate()์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ•จ
- savedInstanceState != null: ์ด์ „์— ์–ด๋– ํ•œ ์ด์œ ๋กœ ์ƒํƒœ๊ฐ€ ์ €์žฅ๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ savedInstanceState๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
- Intent.ACTION_VIEW == intent.action: ๋”ฅ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ์‹œ์ž‘๋˜์—ˆ์œผ๋ฏ€๋กœ getQueryParameter()๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
- ๊ทธ์™ธ: startActivity()๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ์‹คํ–‰๋˜์—ˆ์œผ๋ฏ€๋กœ intent๋กœ ๋ถ€ํ„ฐ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด
  • savedInstanceState์ฒ˜๋ฆฌ๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•
- ๊ฐ€๋กœ/์„ธ๋กœ orientation์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ
- [๊ฐœ๋ฐœ์ž ์˜ต์…˜]-[๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ์ˆ˜ ์ œํ•œ]-[๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ์—†์Œ]์„ค์ •

taskAffinity ๋™์ž‘

  • ์ŠคํŒŒ์ด๋”๋งจ์— ๋‚˜์˜ค๋Š” MCU์„ธ๊ณ„๊ด€ ๋ฉ€ํ‹ฐ๋ฒ„์Šค์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•จ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ฑ์•ˆ์˜ ๋ชจ๋“  Activity๋“ค์€ ๊ฐ™์€ taskAffinity๋ฅผ ๊ฐ€์ง
  • Manifest์—์„œ activity์˜ taskAffinity๋ฅผ ๊ฐœ๋ณ„๋กœ ์ง€์ •ํ•ด์ค„์ˆ˜ ์žˆ์Œ
  • ์˜ˆ๋ฅผ๋“ค์–ด A,B Activity๊ฐ€ ๊ฐ™์€ taskAffinity๋ฅผ ๊ฐ€์ง€๋ฉด A๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋‹ค๊ฐ€ B๊ฐ€ ์‹คํ–‰๋˜๋ฉด A๋„ ๊ฐ™์ด ์‹คํ–‰๋˜์ง€๋งŒ, ๋‹ค๋ฅธ taskAffinity๋ฅผ ๊ฐ–๋Š”๋‹ค๋ฉด A๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์ธ ์ƒํƒœ์—์„œ B๊ฐ€ ์‹คํ–‰๋˜๋„ A๋Š” ์—ฌ์ „ํžˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์กด์žฌํ•จ : ์‚ผ์„ฑ '์Šค๋งˆํŠธ๋งค๋‹ˆ์ €' ํ‘ธ์‹œ์•Œ๋ฆผ ์ฐจ๋‹จ์ด์Šˆ ๋Œ€์‘ํ•˜๊ธฐ์—์„œ ์‚ฌ์šฉ๋œ taskAffinity ์ฐธ๊ณ 

singleTask, singleInstance ์ฐจ์ด

? SingleTask : 1๊ฐœ ์•กํ‹ฐ๋น„ํ‹ฐ๋งŒ ์žˆ๋„๋ก ํ•œ๋‹ค. CLEAR_TASK + NEW_TASK ์™€ ์œ ์‚ฌ

? SingleInstance : ๋™์ผํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” 1๊ฐœ๋งŒ ์žˆ๋„๋ก ํ•œ๋‹ค. BRING_TO_FRONT ์™€ ์œ ์‚ฌ

Fragment ์“ฐ๋ฉด ์žฅ์ , ๋ถˆํŽธํ•œ ์ 

Activity ๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค๊ฐ€ re-create ๋™์ž‘์ด ๋  ๋•Œ Fragment ๋„ ํ•จ๊ป˜ ๋ณต๊ตฌ ๋˜๋Š”๋ฐ ์ด๋•Œ ๊ฐ„ํ˜ผ Fragment ๊ฐ€ onSavedInstance ๊ด€๋ จ ๋™์ž‘ ์ด์ „์— ๋‹ค๋ฅธ ๋™์ž‘์€ ํ•œ๋‹ค๊ณ  Crash ๋ฅผ ๋‚ธ๋‹ค. FragmentTransaction ์—์„œ commit ํ•  ์‹œ ๊ฐ„ํ˜น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด state loss ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” API ๊ฐ€ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

Fragment ์ •์  ์ƒ์„ฑ ๋ฉ”์„œ๋“œ๋ฅผ ์“ฐ๋Š” ์ด์œ 

์ƒ์„ฑ์ž๋ฅผ override ํ•ด์„œ ํ•  ๊ฒฝ์šฐ restore ๋™์ž‘์‹œ ํŠน์ • ๊ฐ’์ด ์œ ์‹ค๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ์„ฑ์ž๋Š” override ํ•ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ Extra ํ˜•ํƒœ๋กœ ๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์„œ restore ์‹œ์—์„œ ํ•ด๋‹น ๊ฐ’์ด ๋ณต์›๋œ ์ƒํƒœ์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

  • Fragment๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ์—์„œ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋จ : XXXFragment์˜ ์ƒ์„ฑ์ž์— userId๋ฅผ ๋„˜๊ธฐ๋„๋ก ๋งŒ๋“ค์—ˆ์–ด๋„ XXXFragment์˜ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ๋ถˆ๋ฆผ
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ •์  ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ  bundle์— argument๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ
  • ํ†ต์ƒ์ ์œผ๋กœ ์ •์  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ newInstance()๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•จ

์„œ๋น„์Šค๋Š” ์–ธ์ œ ์‚ฌ์šฉ?

๊ธฐ๋ณธ ์šฉ๋„๋Š” ๋ฐฑ๊ทธ์šด๋“œ ๋™์ž‘์„ ์œ„ํ•ด ์“ฐ์—ฌ์ง€๋ฉฐ ๋‹จ๋ฐœ์„ฑ์ธ ๊ฒฝ์šฐ IntentService ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚ด๋ถ€์—์„œ Queue ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Download ์ฒ˜๋ฆฌ๋‚˜ ํŠน์ • ํ”„๋กœ์„ธ์‹ฑ ๋“ฑ์„ ์œ„ํ•œ ์ฒ˜๋ฆฌ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์žฅ์‹œ๊ฐ„ ๋จธ๋ฌด๋ฅด๋ฉฐ ๋™์ž‘ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ Service ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ฃผ๋กœ TCP ์—ฐ๊ฒฐ ํ›„ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์‹œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์‹œ์Šคํ…œ ์„œ๋น„์Šค์™€ ์„œ๋น„์Šค ์ปดํฌ๋„ŒํŠธ ์ฐจ์ด์ 

???

Service onStartCommand ๋ฆฌํ„ด ๊ฐ’ ๊ตฌ๋ถ„

? ๋ฐ˜ํ™˜์‹œ ์ž๋™์žฌ์‹คํ–‰, ๋ฐ˜ํ™˜์‹œ ๋ ์ด ์žˆ๋‹ค.

  • ์–ด๋–ค ๊ฐ’์„ returnํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ์„œ ์„œ๋น„์Šค๊ฐ€ ๋‚˜์ค‘์— ์žฌ์‹œ์ž‘๋ ๋•Œ intent๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ •ํ•  ์ˆ˜ ์žˆ์Œ

START_STICKY

  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์“ฐ์ž„
  • ์„œ๋น„์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜์„œ ์‹œ์ž‘๋ ๋•Œ intent๋Š” null๋กœ ๋‚ด๋ ค์˜ด : ๋Œ€๋ถ€๋ถ„ ์—ฌ๊ธฐ์„œ intent null์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„์„œ ์ฃฝ๋Š”๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•จ

START_NOT_STICKY

  • ์„œ๋น„์Šค๊ฐ€ ์ฃฝ์–ด๋„ ๋‹ค์‹œ ์‹œ์ž‘๋˜์ง€ ์•Š์Œ
  • ์ฃผ๋กœ batch์ž‘์—…๊ฐ™์€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์ด ๋„๋Š”๋ฐ ์„œ๋น„์Šค๊ฐ€ ์ฃฝ์–ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

START_REDELIVER_INTENT

  • ์„œ๋น„์Šค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋ ๋•Œ ์ด์ „์— ์ „๋‹ฌ๋ฐ›์•˜๋˜ intent๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ด
  • ์„œ๋น„์Šค๊ฐ€ ์ค‘๊ฐ„์— ๋ฉˆ์ถ”๋”๋ผ๋„ ์ฒ˜์Œ์— ์‹คํ–‰ํ–ˆ๋˜ ์ž‘์—…์„ ๋ฌด์กฐ๊ฑด ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์„œ ์™„๋ฃŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

Started & Bound Service ์–ธ์ œ ์“ฐ์ด๋‚˜?

? Bound Service ํŠน์ • ServiceBinder ๊ฐ€ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ๋˜๋ฉฐ Binder ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด Service ๋„ ํ•จ๊ป˜ ์ข…๋ฃŒ๋œ๋‹ค. ์„œ๋น„์Šค์—์„œ ํŠน์ • ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒฝ์šฐ ์ง์ ‘ ํ†ต์‹ ์„ ํ•˜๊ณ  ์‹ถ์„๋•Œ ์“ด๋‹ค.

BIND_AUTO_CREATE ์˜ต์…˜์€ ์™œ ์“ฐ๋‚˜?

? Binder ์š”์ฒญ์‹œ ์„œ๋น„์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด??

IntentService

1๋ฒˆ์— 1๊ฐœ์˜ ๋™์ž‘์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋ฉฐ ๋‚ด๋ถ€์—์„œ Service ๊ฐ€ Queue ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋„์ž‘ํ•œ๋‹ค.

aidl ์Šคํ…๊ณผ ํ”„๋ฝ์‹œ

? ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ์„ ์–ธ๋œ ์„œ๋น„์Šค์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ

์„œ๋น„์Šค์™€ Activity ํ†ต์‹  ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๊ฒƒ๋“ค์ด?

? Binder, ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ผ๋ฉด Application level Singleton, ContentProvider, Sqlite ๋ฅผ ํ™œ์šฉํ•œ MessageQueue ๊ตฌํ˜„ ํ›„ polling ์ฒ˜๋ฆฌ

cp์™€ ์ง์ ‘ db ์ ‘๊ทผ ์ฝ”๋“œ ์„ ํƒ ๊ธฐ์ค€

ContentProvider : ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•ด์•ผํ•  ๋•Œ

DB : ๊ฐ™์€ ์•ฑ - ํ•ด๋‹น DB ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“ˆ/ํ”„๋กœ์„ธ์Šค๊ฐ„, ๋‹ค๋ฅธ ์•ฑ - DB ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

db lock์ด๋ž€?

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ DB/ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด 1๋ฒˆ์— 1๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

db transaction์˜ ์žฅ์ ๊ณผ ๋ฌธ์ œ

? db ์ฒ˜๋ฆฌ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ์ž์ฒด rollback ๊ฐ€๋Šฅํ•˜๋‚˜ commit ๋ช…๋ น์ด ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ๋‹ค๋ฅธ ์ ‘๊ทผ์ž๋Š” ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ commit ์ด์ „์—๋Š” ๋ณ€๊ฒฝ์ด์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

BroadcastReceiver์—์„œ Toast๋ฅผ ๋„์šฐ๋ฉด?

Crash. BroadcastReceiver ๋Š” UI Thread ์—์„œ ๋™์ž‘ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ Handler ๋ฅผ ํ†ตํ•ด Toast ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.

์งˆ๋ฌธ ์˜๋„: ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”๊ฐ€์ด๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ง€ ์•Š์œผ๋ฉด ์•Œ๊ธฐ ์–ด๋ ต๋‹ค. Yes๋ผ๊ณ  ํ•ด๋„ ์•ˆ ๋˜๊ณ  No๋ผ๊ณ  ํ•ด๋„ ์•ˆ ๋œ๋‹ค.

๋‹ต๋ณ€: Toast๋Š” ๋œฐ ๋•Œ๋„ ์žˆ๊ณ  ์•ˆ ๋œฐ ๋•Œ๋„ ์žˆ๋‹ค. BroadcastReceiver์˜ onReceive() ๋ฉ”์„œ๋“œ ์ž์ฒด๋Š” UI ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Toast๊ฐ€ ์ž˜ ๋œฐ ๊ฑฐ ๊ฐ™์€๋ฐ, ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์•ฑ์— ์‹คํ–‰์ค‘์ธ ์ปดํฌ๋„ŒํŠธ ์˜ˆ๋ฅผ ๋“ค์–ด Activity๊ฐ€ ํฌ๊ทธ๋ผ์šด๋“œ์— ๋– ์žˆ๊ฑฐ๋‚˜ ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— BroadcastReceiver์—์„œ Toast๋„ ์ž˜ ๋œฌ๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰์ค‘์ธ๊ฒŒ ์—†์ด ์–ด๋””์„ ๊ฐ€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฅผ ํ•ด์„œ BroacastReceiver๋งŒ ๋‹ฌ๋ž‘ ์‹คํ–‰๋  ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. Toast ์ž์ฒด๋Š” ๋น„๋™๊ธฐ ๋™์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์— BroadcastReceiver์˜ onReceive() ์‹คํ–‰์ค‘์—๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์ง€๋งŒ ๋๋‚˜์ž๋งˆ์ž ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋–จ์–ด์ ธ์„œ ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ๋Š” Toast๊ฐ€ ๋œจ์ง€ ๋ชปํ•œ๋‹ค.

LocalBroadcastManager ์—ญํ• 

? AndroidManifest ์— ์„ ์–ธํ•˜์ง€ ์•Š์€ ์•ฑ๋‚ด์—์„œ registerReceiver ๋กœ ๋“ฑ๋ก๋œ ๋ฆฌ์‹œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

Application์˜ ์šฉ๋„

์•ฑ ์ตœ์ดˆ ์‹คํ–‰์‹œ ํ•„์š”ํ•œ ์ฒ˜๋ฆฌ ์ดˆ๊ธฐํ™”. MultiDex ์ดˆ๊ธฐํ™”.

  • ์•ฑ์ด ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”ํ•œ ๋ฌด์กฐ๊ฑด ์กด์žฌํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค
  • ๋Œ€๋ถ€๋ถ„ singletonํ˜•ํƒœ๋กœ Applicationํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•จ
  • context๊ฐ€ ํ•„์š”ํ•œ๊ฒฝ์šฐ Application์˜ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ์‚ฌ์šฉํ•จ : UI๊ฐ€ ํ•„์š”ํ•œ context์ธ ๊ฒฝ์šฐ๋Š” Application์˜ context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ
  • ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋‚˜ ๊ฐ’์„ static๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Application์˜ ํ•„๋“œ๋กœ ์„ ์–ธํ•ด์„œ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ํŒจํ„ด๋„ ์žˆ์Œ : ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋‚จ์šฉํ•˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ ์ถ”์ฒœํ•˜์ง€๋Š” ์•Š์Œ. repositoryํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ intent๋“ฑ์˜ ๋‹ค๋ฅธ ์šฐํšŒ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ํ•ด์•ผํ•จ

SharedPreferences commit()๊ณผ apply() ์ฐจ์ด

Commit : ๋™๊ธฐ์‹, Apply : ๋น„๋™๊ธฐ์‹.

? SharedPreference ๋Š” ํŒŒ์ผ์„ ํ•œ๋ฒˆ ์ฝ์€ ํ›„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ด€๋ฆฌํ•˜์˜€๋‹ค๊ฐ€ ํŒŒ์ผ์— ๋‹ค์‹œ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. Commit ์€ ํŒŒ์ผ์— ๊นŒ์ง€ ๊ธฐ๋ก์„.. Apply ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๊ฐฑ์‹ ํ•˜๊ณ  ํŒŒ์ผ์—๋Š” ์–ด๋Š ์‹œ์ ์— bulk ๋กœ...

google play service ์—ฐ๊ฒฐ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฐ€? ๋‚ด๋ถ€ ๊ตฌ์กฐ

???

Parcelable/Serializable ์ฐจ์ด

??? Parcel ์€ Android ์— ํ•„์š”ํ•œ ๋ช‡๊ฐ€์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ Intent ์— ๋‹ด์•„์„œ ์ „๋‹ฌํ•  ๋•Œ Serializable ๋ณด๋‹ค ๋” ๊ฐ€๋ณ๋‹ค๊ณ  ํ•œ๋‹ค.

  • Serializable์€ Java์—์„œ, Parcelable์€ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ถ”๊ฐ€๋œ ๊ฐœ๋…
  • Serializable๋กœ ๋งŒ๋“œ๋Š”๊ฑด Serializable์„ implements๋งŒ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋˜์„œ ์—„์ฒญ ๊ฐ„๋‹จํ•˜์ง€๋งŒ refelection์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๊ฑฐ์›€
  • Parcelable๋กœ ๋งŒ๋“œ๋ ค๋ฉด ๊ท€์ฐฎ์€ ์ž‘์—…์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ฝ”๋“œ๋ฅผ ์•Œ์•„์„œ ๋งŒ๋“ค์–ด ์ฃผ๋Š”๊ฒŒ ์žˆ์–ด์„œ ํŽธํ•จ : kotlin์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด @Parcelize ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด์„œ ์—„์ฒญ ๊ฐ„๋‹จํ•˜๊ฒŒ Parcelable์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์•ˆ๋“œ๋กœ์ด๋“œ ๋ชจ๋‘ Parcelable, Serializable๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Parcelable์˜ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฆ„ benchmark of parcel and serial
  • ๊ฐœ์ธ์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ Parcelable์•ˆ์“ฐ๊ณ  Serializable์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ทนํ˜

๋ฉ”๋ชจ๋ฆฌ๋ฆญ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

Leak Canary, Profiler, dumpsys

targetSdkVersion ์šฉ๋„

์•ฑ์„ ํŠน์ • sdk api ์— ๋งž์ถฐ์„œ ๋นŒ๋“œํ•œ๋‹ค.

์งˆ๋ฌธ ์˜๋„: compileSdkVersion, minSdkVersion๊ณผ ๊ตฌ๋ถ„์„ ํ•˜๋Š”๊ฐ€?

๋‹ต๋ณ€: ๊ทธ ๋ฒ„์ „๊นŒ์ง€๋Š” ํ˜ธํ™˜์„ฑ ๋ชจ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ํ˜ธํ™˜์„ฑ ๋ชจ๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋”๋ผ๋„ ์•ฑ์˜ ๊ธฐ์กด ๋™์ž‘์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด AsyncTask ๋ณ‘๋ ฌ ์‹คํ–‰์ด์—ˆ๋‹ค๊ฐ€ ์ˆœ์ฐจ ์‹คํ–‰์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ, targetSdkVersion๋ฅผ ์˜ฌ๋ฆฌ์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด๊ณผ ๋™์ผํ•˜๋‹ค.

์‹ฑ๊ธ€ํ†ค์— Context๊ฐ€ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”๊ฐ€? (์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ธฐ)

??? ApplicationContext ๋ฉด ok. ๊ทธ์™ธ์˜ Context ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฆญ.

Singleton.context = context.getApplicationContext() ๋กœ ํ•ด์ค˜์•ผ ํ•จ.

์•„๋ž˜ ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š”?

for (int i = 0; i < 4; i++) {
  title.setText("current=" + i);
  SystemClock.sleep(1000);
}

??? ์•„๋งˆ๋„ ํ™”๋ฉด์ด 1์ดˆ์”ฉ ๋Š๊ธฐ๋ฉฐ ์—…๋ฐ์ดํŠธ?

์งˆ๋ฌธ ์˜๋„: ๋ฌธ์ œ ์žˆ๋Š” ์ฝ”๋“œ๋ผ๋Š” ๊ฑธ ์•Œ๊ณ  ์žˆ๋Š”๊ฐ€? UI์—์„œ ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ UI๋ฅผ ์—…๋ฐ์ดํŠธ๋Š” ํŒจํ„ด์„ ์•Œ๊ณ  ์žˆ๋Š”๊ฐ€?

Runnable updateRunnable = () -> {
    current++;
	title.setText("current=" + current);
	if (current < 4) {
		handler.postDelayed(this, 1000);	
	}
}


public void onClick(View v) {
	handler.post(updateRunnable);
}

๋‹ต๋ณ€: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚น ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1์ดˆ๋งˆ๋‹ค ์ถœ๋ ฅ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. 5์ดˆํ›„์— current=4๋งŒ ์ถœ๋ ฅ๋œ๋‹ค. setText()๋Š” ๊ฒฐ๊ตญ invalidate() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ MessageQueue์— ๋‹ค์‹œ ๊ทธ๋ฆฌ๋„๋ก ๋ช…๋ นํ•˜๋Š”๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด MessageQueue์— 5๋ฒˆ์˜ invalidate() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ, ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ์ˆœ์‹๊ฐ„์— current=0, current=1, ..., current=3๊นŒ์ง€ ํ•˜๊ณ ์„œ ์ตœ์ข… current=4๊นŒ์ง€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹๊นŒ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, invalidate() ๋‚ด์—์„œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์–ด์„œ ํ•œ๋ฒˆ๋งŒ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ•œ๋‹ค.

======= ์ผ๋ฐ˜ =====

State ํŒจํ„ด๊ณผ Strategy ํŒจํ„ด ์ฐจ์ด

๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค

? IntRes, Nullable, VisibleForTesting ์ด๋Ÿฐ๊ฑฐ?

์• ๋„ˆํ…Œ์ด์…˜ ํ™œ์šฉ์€?

ํŠน์ • ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€์ •๋ณด ์ž…๋ ฅ. APT (Dagger), Proxy (Retrofit), Lint (SupressWarning, VisibleForTesting) ๋“ฑ๋“ฑ

AOP ์žฅ๋‹จ์ ?

์žฅ์  : ๊ณตํ†ต์ ์ธ ์ „์ฒ˜๋ฆฌ, ํ›„์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํŽธํ•˜๋‹ค.

๋‹จ์  : ์„ค์ •์ด ๋นก์„ธ๋‹ค. ๋ชจ๋“  ์ฒ˜๋ฆฌ์— ๊ณตํ†ต ๋™์ž‘์ด ์ถ”๊ฐ€ ๋˜๊ธฐ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

์Šค๋ ˆ๋“œํ’€ AbortPolicy

???

CountDownLatch ์‚ฌ์šฉ. ์ฃผ์˜ํ•  ์ 

? ์นด์šดํŠธ๊ฐ€ 0 ์ด ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ํ•œ๋‹ค. ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์นด์šดํŠธ ๋‹ค์šด์„ ์‹คํ–‰ํ•˜๊ณ  wait ํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋Š” 0 ์ด ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. 0 ์ด ๋˜๋ฉด ์žฌ์‚ฌ์šฉ ์•ˆ๋˜๋‹ˆ ์ฃผ์˜.

enum์€ ์–ด๋–ค ๋•Œ ์“ฐ๋Š”๊ฐ€?

? ํŠน์ • ์ƒํƒœ๋ฅผ Primitive ํƒ€์ž…์ด ์•„๋‹Œ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•˜๊ณ ์ž ํ• ๋•Œ

for each ๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š”?

Array/Collection -> iterator ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ for-each ๋„์ค‘ ๋ฐ์ดํ„ฐ์˜ size ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋ก์‹œ๋Š”?

ํŠน์ • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ  Proxy ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Method Invoker ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์ „ ์ •์˜๋œ ๋™์ž‘์„ ํ•˜๋„๋ก ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ : Retrofit

======== RxJava ===

Subject ๋ฌธ์ œ์ ๊ณผ ์–ด๋Š ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฐ€?

์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•  ๊ฒฝ์šฐ Subject ๋Š” HotObservable ์ด๊ธฐ ๋•Œ๋ฌธ์— downstream ์˜ ์ฒ˜๋ฆฌ ์šฉ๋Ÿ‰์— ๋Œ€ํ•ด์„œ ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋ฐ€์–ด์ค€๋‹ค. ๋”ฐ๋ผ์„œ BackPressure ์ด์Šˆ๊ฐ€ ๋™๋ฐ˜๋œ๋‹ค.

Scheduler์™€ Worker์˜ ๊ด€๊ณ„

??? Scheduler ๋Š” ํŠน์ • ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ Worker ๋Š” ์“ฐ๋ ˆ๋“œ์—์„œ ์‹ค์ œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ์ฒ˜๋ฆฌ, ๋”œ๋ ˆ์ด, dispose ๋“ฑ ์ง์ ‘์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

subscribeOn/observerOn ์ฐจ์ด

subscribeOn ๋Š” ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์˜ ์ƒ์œ„ ์ŠคํŠธ๋ฆผ์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค. observeOn ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด๋‚ด์ง„ ๋‹ค์Œ downstream ์ด ๋™์ž‘ํ•  ์“ฐ๋ ˆ๋“œ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

  • ํ†ต์ƒ์ ์œผ๋กœ subscribeOn(), observerOn()๋ฅผ ํ•œ์Œ์œผ๋กœ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ subscribeOn()๋Š” ๊ทธ ์ง“์„ ํ•  ๋†ˆ์˜ ์“ฐ๋ ˆ๋“œ, observerOn()๋Š” ๊ทธ ์ง“์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ๋†ˆ์˜ ์“ฐ๋ ˆ๋“œ์ •๋„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Rx์—์„œ flatMap(), filter()๋“ฑ์˜ ์—ฌ๋Ÿฌ operator๋ฅผ ํ™œ์šฉํ•ด์„œ chaining์„ ํ• ๋•Œ observerOn()์„ ์ž˜ ํ™œ์šฉํ•ด์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ „ํ™˜์‹œ์ผœ์„œ ํ•ด๋‹น ์ž‘์—…์— ๋งž๋Š” ์ ์ ˆํ•œ ์“ฐ๋ ˆ๋“œ ์ž‘์—…์„ ์‹œ์ผœ์ฃผ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published