๊ฐœ๋ฐœ/Android

[Android] ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ์„ฑ๋Šฅ ์ตœ์ ํ™”(Optimizing Layout Hierarchies)

๋„๋ฆฌ ๐ŸŸ 2021. 4. 8. 23:02

์ž‘์„ฑ์ผ: 2018.03.07


์›๋ฌธ: Optimizing Layout Hierarchies์„ ๋ฒˆ์—ญํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. 

 

๋ฒ ์ด์ง ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ ˆ์ด์•„์›ƒ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์€ ํ”ํ•œ ์˜คํ•ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋‹น์‹ ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ํ•œ ๊ฐ ์œ„์ ฏ๊ณผ ๋ ˆ์ด์•„์›ƒ์€ ์ดˆ๊ธฐํ™”, ๋ฐฐ์น˜, ๊ทธ๋ ค์ง€๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ค‘์ฒฉ๋œ LinearLayout์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€๋‚˜์น˜๊ฒŒ ๊นŠ์€ ๋ทฐ ๊ณ„์ธต์„ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, layout_weight๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ช‡ ๊ฐœ์˜ LinearLayout์„ ์ค‘์ฒฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ child๊ฐ€ ํ•œ๋ฒˆ ๋” ์ธก์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ๋น„์šฉ์ด ๋†’์Šต๋‹ˆ๋‹ค. ListView๋‚˜ GridView๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์ฒ˜๋Ÿผ inflate๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. 

์ด ๊ธ€์„ ํ†ตํ•ด ๋ ˆ์ด์•„์›ƒ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ Hierarchy Viewer์™€ Lint ์‚ฌ์šฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ ˆ์ด์•„์›ƒ ๊ฒ€ํ† ํ•˜๊ธฐ

Android SDK tools์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๋™์•ˆ ๋ ˆ์ด์•„์›ƒ์„ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hierarchy Viewer๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํˆด์„ ์ด์šฉํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ์„ฑ๋Šฅ์ธก๋ฉด์—์„œ์˜ ๋ณ‘๋ชฉํ˜„์ƒ(bottleneck)์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

Hierarchy Viewer๋Š” ์‹คํ–‰์ค‘์ธ ์—ฐ๊ฒฐ๋œ ๊ธฐ๊ธฐ๋‚˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ ์„ ํƒํ•จ์œผ๋กœ์จ ๋™์ž‘ํ•˜๊ณ , ๋ ˆ์ด์•„์›ƒ ํŠธ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ๋ธ”๋ก์€ Measure / Layout / Draw ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์ด์Šˆ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, figure 1์€ ListView์˜ item์œผ๋กœ ์“ฐ์ธ ๋ ˆ์ด์•„์›ƒ ํ•˜๋‚˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด์•„์›ƒ์€ ์™ผ์ชฝ์— ์ž‘์€ ๋น„ํŠธ๋งต ํ•˜๋‚˜์™€ ์˜ค๋ฅธ์ชฝ์— ๋‘ ๊ฐœ๋กœ ์Œ“์ธ ํ…์ŠคํŠธ ์•„์ดํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ ˆ์ด์•„์›ƒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๋ฒˆ inflate๋  ๋ ˆ์ด์•„์›ƒ์ด ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ์ด๋“์„ ๋ฐฐ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

Figure 1. ListView์˜ ์•„์ดํ…œ์— ๋Œ€ํ•œ ๊ฐœ๋…์ ์ธ ๋ ˆ์ด์•„์›ƒ ์˜ˆ์‹œ

Hierarchy Viewer๋Š” ๊ฐ€๋Šฅํ•œ ๋””๋ฐ”์ด์Šค์™€ ๊ทธ๋“ค์˜ ์‹คํ–‰์ค‘์ธ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Windows ํƒญ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  Hierarchy View๋ฅผ ํด๋ฆญํ•˜๋ฉด ์„ ํƒํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, figure 2๋Š” figure 1์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Figure 2. ์ค‘์ฒฉ๋œ LinearLayout์„ ์‚ฌ์šฉํ•œ figure 1์˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ๊ตฌ์กฐ

๋ ˆ์ด์•„์›ƒ ๊ฐœ์„ ํ•˜๊ธฐ

์œ„ ์˜ˆ์‹œ์˜ ๋ ˆ์ด์•„์›ƒ ์„ฑ๋Šฅ์€ ์ค‘์ฒฉ๋œ LinearLayout์œผ๋กœ ์ธํ•ด ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ์ด์•„์›ƒ์˜ ์ค‘์ฒฉ์„ ์ค„์—ฌ(flattening;ํ‰ํ‰ํ•˜๊ฒŒ ํ•˜๋‹ค) ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คใ…ก๋ ˆ์ด์•„์›ƒ์„ ์ข๊ณ  ๊นŠ๊ฒŒ ๋งŒ๋“ค๊ธฐ๋ณด๋‹ค, ์–•๊ณ  ๋„“๊ฒŒ ๋งŒ๋“œ์„ธ์š”. Root ๋…ธ๋“œ๋กœ์„œ RelativeLayout์€ ๊ทธ๋Ÿฐ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด ๋””์ž์ธ์„ RelativeLayout์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ „ํ™˜ํ–ˆ์„ ๋•Œ, ๋ ˆ์ด์•„์›ƒ์ด 2-level ๊ณ„์ธต์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ์˜ ๊ฒฐ๊ณผ๋Š” ์ด๋ ‡๊ฒŒ:

Figure 3. RelativeLayout์„ ์ด์šฉํ•œ figure 1์˜ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ๊ตฌ์กฐ  

์ด ๋ ˆ์ด์•„์›ƒ์€ ๋ชฉ๋ก์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์— ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž‘์€ ์ด์ ์ด ๋ช‡ ๋ฐฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ LinearLayout ์„ค๊ณ„์—์„œ layout_weight ์‚ฌ์šฉ์€ ์ธก์ • ์†๋„๋ฅผ ๋Š๋ฆฌ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฑด ๊ฐ ๋ ˆ์ด์•„์›ƒ์„ ์–ผ๋งˆ๋‚˜ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์˜ˆ์‹œ์ด๊ณ , ์šฐ๋ฆฌ๋Š” layout weight๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ํ•„์ˆ˜์ ์ธ์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ช‡๋ช‡ ๋ณต์žกํ•œ ๋ ˆ์ด์•„์›ƒ์˜ ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ์ด ๊ฐ™์€ UI ์š”์†Œ๋ฅผ ์ค‘๋ณต์œผ๋กœ ์ธก์ •ํ•˜๋Š๋ผ ์„ฑ๋Šฅ์„ ๋‚ญ๋น„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜„์ƒ์„ double taxation์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. double taxation์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด์™€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๋Š”์ง€๋Š” Performance and View Hierarchies๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Lint ์‚ฌ์šฉ

๊ฐ€๋Šฅํ•œ ๋ทฐ ๊ณ„์ธต ์ตœ์ ํ™”๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์— ๋Œ€ํ•ด lint tool์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์ข‹์€ ์Šต๊ด€์ž…๋‹ˆ๋‹ค. Lint๋Š” Layoutopt tool์„ ๋Œ€์ฒดํ–ˆ๊ณ , ๋” ์ข‹์€ ๊ธฐ๋Šฅ์„ฑ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. lint ๋ฃฐ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐœ์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค: Compound Drawable์„ ์‚ฌ์šฉํ•˜์„ธ์š” - ํ•˜๋‚˜์˜ ImageView์™€ ํ•˜๋‚˜์˜ TextView๋ฅผ ๊ฐ–๋Š” LinearLayout์€ ํ•œ compound drawable๋กœ ๋‹ค๋ฃจ๋ฉด ๋”์šฑ ํšจ์œจ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • root ํ”„๋ ˆ์ž„์„ ํ•ฉ์น˜์„ธ์š” - ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์˜ root๊ฐ€ FrameLayout์ด๊ณ  background๋‚˜ padding ๋“ฑ์„ ์ฃผ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์กฐ๊ธˆ ๋” ํšจ์œจ์ ์ธ merge ํƒœ๊ทธ๋กœ ๋Œ€์ฒด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” leaf - ์ž์‹์ด ์—†๊ฑฐ๋‚˜ background๊ฐ€ ์—†๋Š” ๋ ˆ์ด์•„์›ƒ์€ ์ค‘์ฒฉ์„ ์—†์• ๊ณ  ๋” ํšจ์œจ์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด์„œ ๊ฑฐ์˜ ์‚ญ์ œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.(์•ˆ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—)
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ชจ - background๊ฐ€ ๋”ฐ๋กœ ์—†๊ณ , ScrollView๋‚˜ ๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์ด ์•„๋‹Œ๋ฐ๋„ ์ž์‹ ๋ทฐ ํ•˜๋‚˜๋ฅผ ๊ฐ–๋Š” ๋ ˆ์ด์•„์›ƒ์€ ์ค‘์ฒฉ ์ œ๊ฑฐ์™€ ํšจ์œจ์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ณ„์ธต์„ ์œ„ํ•ด ์‚ญ์ œ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ทธ ์ž์‹ ๋ทฐ๋ฅผ ๋ถ€๋ชจ ๋ทฐ๋กœ ๋ฐ”๋กœ ์˜ฎ๊ฒจ๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ๊นŠ์€ ๋ ˆ์ด์•„์›ƒ๋“ค - ๋„ˆ๋ฌด ๋งŽ์ด ์ค‘์ฒฉ๋œ ๋ ˆ์ด์•„์›ƒ์€ ์„ฑ๋Šฅ์ƒ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด RelativeLayout์ด๋‚˜ GridLayout๊ฐ™์€ ์ค‘์ฒฉ์ด ๋งŽ์ด ํ•„์š”์—†๋Š” ๋ ˆ์ด์•„์›ƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”. depth์˜ ๊ธฐ๋ณธ ์ตœ๋Œ€์น˜๋Š” 10์ž…๋‹ˆ๋‹ค.


Lint์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€ Android Studio์— ํ†ตํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. Lint๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. Android Studio๋ฅผ ์“ด๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋˜ํ•œ ํŠน์ • ๋นŒ๋“œ ํƒ€์ž… ๋˜๋Š” ๋ชจ๋“  ๋นŒ๋“œ ํƒ€์ž…์— ๋Œ€ํ•ด lint ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Android Studio์˜ File>Settings>Project Settings ์˜ต์…˜์—์„œ ๊ฒ€์‚ฌ์˜ profile๊ณผ ์†์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ๊ฒ€์‚ฌ์™€ ํ•จ๊ป˜ inspection configuration ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Figure 4. Inspection Configuration