[222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … ·...

45
이성원 Whale 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 최적화 사례

Upload: others

Post on 15-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

이성원

Whale

안드로이드앱의다중웹뷰환경에서성능병목진단및최적화사례

Page 2: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

CONTENTS

1.�웹브라우저엔진을탑재한앱의웹뷰사용

2.�다중웹뷰를활용한사용자반응성개선

3.�앱 시동시성능분석

4.�성능개선방안개발및결과

Page 3: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

1.웹브라우저엔진을탑재한앱의웹뷰사용

Page 4: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

1.1 안드로이드앱안의웹뷰

앱안에서웹페이지를 rendering하여출력

Page 5: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

1.2�웹브라우저엔진 Vs.�시스템웹뷰

엔진유지보수비용 Vs.�API�파편화이슈대응

엔진내장한앱크기증가 Vs.�버전에따른성능및기능의제약

Page 6: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

Intel의 Crosswalk�프로젝트를계승

안드로이드앱에브라우저엔진으로탑재

시스템웹뷰를대체하고추가기능을제공하는 API�제공

네이버앱과네이버카페등적용

1.3�XWhale

Page 7: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

2.사용성개선을위한다중웹뷰활용

Page 8: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

앱초기화단계시복수의웹뷰사전생성

사후 render�process에 등록

2.1�웹브라우저엔진의다중웹뷰생성

Application�Initialization

WebView0

WebView1

WebView2

Create�WebView

Launch�Render�Process

Render�Process

Page 9: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

백그라운드에서로딩및 rendering 수행하여반응성개선

2.2�다중웹뷰의효과

Foreground�WebView

scroll

Video

Background�WebView

Rendering

Event

Loading

Page 10: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

2.3�다중웹뷰에의한 Background 로딩

WebView

WebView+1WebView-1

Swipe

Page 11: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.앱 구동성능분석

Page 12: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

브라우저엔진초기화

Renderer�프로세스생성

웹뷰생성

웹페이지로딩

3.1�다중웹뷰생성에따른부담

Page 13: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.1.1�Profiling�환경

앱 launch�부터웹페이지로딩완료까지

1. Synchronous�initialization�=>�1st�webview creation�=>�Navigation�start�=>�

onload event�end

2. Cold�/�Warm�launch

네이버메인및주제판 (뉴스,�연예,�스포츠,�검색)

단말기 (H:�high�end,�M:�middle�tier�,�L:�low�end)

Page 14: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.1.2�웹뷰생성지연

Synchronous�초기화부터첫번째웹뷰생성까지 (L,�M)

initSync

loadLibrary startBrowserProcess initWebViewSettingsCreateWebiew

1s

Launch�RenderProcess

Timeline

Page 15: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.1.3�웹페이지로딩지연

브라우저프로세스의 provisional�load가 생성한 IPC에의해

Renderer�프로세스의 navigation이 시작되기까지지연 (M)

CreateWebView

Timeline

loadURL Unknown CreateWebView

NavigationStart

400ms

Loading

Page 16: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

앱의비동기초기화적용 :�400ms�/�10%�개선기대 (L)

Background�WebView의생성연기 :�400ms�/�13%�개선기대 (M)

3.1.4�비동기초기화및예비웹뷰생성지연

Application�Initialization

WebView0 WebView1 WebView2

Create�WebView

Launch�Render�Process

Render�Process

Page 17: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

CSS�parsing

JavaScript�실행

Layout�변동

Resource�request에 대한 response 지연

3.2�웹페이지로딩의병목구간

Page 18: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.2.1�웹페이지로딩성능

Navigation�start에서 onload event�end까지

0

500

1,000

1,500

2,000

2,500

3,000

3,500

News1 News2 Enter Sports Search

로딩시간 (ms)

L�Cold L�Warm M�Cold M�Warm H�Cold H�Warm

Page 19: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.2.2�중복된 CSS�Parsing

각주제판에서같은 CSS를매번 parsing�하면서긴시간소모

loading은 caching이 되는데, parsing은?

Page 20: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.2.3�높은비용의 JavaScript�

Layout의 큰변화를야기하는 JavaScript

DOM�node에 대한전면적인변경

Load�event�이후로지연?

부분적인 layout�조정?

Page 21: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

W3C�navigation�timing�APIs

RAIL�성능모델

First�meaningful�paint

Time�to�interactive

User�metrics�histogram

3.3�사용자중심의성능지표

Page 22: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.1�Navigation�Timing

https://www.w3.org/TR/navigation-timing/

Page 23: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.2�RAIL�성능모델

Response:�사용자입력으로부터 paint��까지 100ms�이내

Animation:�각 frame의갱신은 16ms�이내

Idle:�유휴시간에처리할 background�task는 50ms�이내

Load:�first�meaningful�paint까지 1000ms�이내

https://developers.google.com/web/fundamentals/performance/rail

Page 24: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.3�Paint�성능지표의의미

Page 25: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.4 First�Meaningful�Paint

페이지의 layout이 가장급격히

변하는순간

Page 26: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.5�Time�to�Interactive (1st�CPU�Idle)

Page 27: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.3.6�Histogram

Chromium�브라우저의실행정보가누적된 in-memory�DB

Page 28: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

URL�query�to�disk�cache

가변적인캐시용량 (20~200MB)

Eviction�heuristics의 맹점

• sort(LRU�time�x�entry�sizes)

3.4�HTTP�Cache의 활용도및영향력

Page 29: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.4.1�HTTP�Cache�Profiling

Chromium�브라우저에서네이버메인의각주제판방문• warm-up�=>�1차 =>�~3�hours�=>�2차 =>�3차

Histogram에서 cache�hit�ratio�(OpenIndexState)�확인• 1차 iteration�:�0.64

• 2차 iteration�:�0.45

• 3차 iteration�:�0.63

• max�cache�size�:�200MB

• 3차 iteration�후 cache�size�:�92MB

Page 30: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.4.2�HTTP�Cache�로딩성능

Telemetry로 record한 웹페이지를 replay

0

200

400

600

800

1,000

1,200

1,400

1,600

로딩시간 (ms)

timeToOnload timeToFirstContentfulPaint timeToFirstPaint

timeToFirstMeaningfulPaint cpuTimeToFirstMeaningfulPaint

Page 31: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

3.4.3�HTTP�Cache�성능분석

네트워크지연감소확인

0 200 400 600 800 1000 1200

main_cold

main_warm

news1_cold

news1_warm

news2_cold

news2_warm

enter_cold

enter_warm

search_cold

search_warm

sports_cold

sports_warm

timeToContentfulPaint�성능분석 (ms)

resource_loading parseHTML layout idle blocked_on_network record style other

Page 32: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

저사양단말에서의불필요한고해상도이미지로딩

네트워크전송및이미지 decoding에 따른부담

단말최적화이미지전송 (proxy�vs. client�hint)

3.5�이미지로딩의부하

Page 33: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.성능개선방안개발및결과

Page 34: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

Renderer�프로세스에서로딩을더일찍시작하도록초기화순서조정

Background�웹뷰의생성을늦췄지만,

로딩에필요한리소스의초기화가늦어종료시점은동일

4.1.1�Background�웹뷰의지연생성

CreateWebView

Timeline

loadURL Unknown CreateWebView

NavigationStart

400ms

Loading

Page 35: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.1.2 브라우저엔진비동기초기화

비동기초기화 task의 시작지연

별도 thread�생성부담

callback�의존성

InitAsync

loadLibrary

startBrowserProcess

initWebViewSettings

CreateWebiew

Launch�RenderProcess

Timeline

ActivitiCreate

Page 36: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

지정된 URL�패턴의 resource에 대하여일정보존기간보장

• https://privileged.http.cache/�*

지정된 referer로 요청된이미지에대하여일정보존기간보장

• third�party로 부터 API를 통해유입되는 image

• Resource�URL의 확장자로만 image 여부를판별할수있을까?

지정된 resource�type(js/css)에 대하여추가보존기간보장

4.2.1�Privileged HTTP�Cache의 구현

Page 37: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.2.2�Privileged HTTP�Cache 실험결과

이미지캐시 hit�ratio�14%�향상 (L)

Paint�성능 30~40ms�향상 (L)

0

0.2

0.4

0.6

0.8

1

Total Privileged�

URL/Referer

Privileged�Resource

Hit�Ratio

Before After

1,250

1,300

1,350

1,400

1,450

1,500

1,550

FirstPaint FirstContentfulPaint FirstMeaningfulPaint

Performance (ms)

Before After

Page 38: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.2.3. Privileged HTTP�Cache�적용

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

Total URL JS/CSS

HTTP�Cache�Hit�Ratio

before after

0

500

1,000

1,500

2,000

2,500

3,000

FirstPaint� MeaningfulPaint� LoadEnd� FirstCPUIdle�

High�Tier�Device�Performance�(ms)

before after

0

500

1,000

1,500

2,000

2,500

3,000

3,500

4,000

FirstPaint� MeaningfulPaint� LoadEnd� FirstCPUIdle�

Low�Tier�Device�Performance�(ms)

before after

Low�tier�device의 성능지표

80~120ms�개선

Page 39: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

Render�프로세스안에서모든WebView가접근가능하도록

- Cross�thread�map으로 global�cache�구현

CSS�rule�set은 document와 life�cycle을 함께하므로

- Parsing된 rule�set을 cache로 복사하여 garbage�collection�대상에서제외

- 메모리최적화를위하여memory�pressure와 연동및지정된 URL로제한

4.3.1�Cross�WebView CSS�cache 구현

Page 40: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.3.2�Cross�WebView CSS�cache 효과

467ms의 CSS�parsing이 최초한번만발생 (L)

네이버주제판당로딩시간감소 (L:�22%,�M:�17%,�H:�18%)

Page 41: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.4.1 Proxy�기반이미지최적화

Service Image�Server Image�Proxy Browser

html

Image�Proxy�APIImage�Request

Large�

Image

ResizeSmall�

Image

Navigation�Start

이미지크기를특정하여요청하는API 제공필요

Data�saver의용도로활용가능

Page 42: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

단말의화면해상도정보를 header에 실어서버에요청

적합한크기및품질의이미지를담은응답을처리

4.4.2�Client�hint�기반이미지최적화

https://httpwg.org/http-extensions/client-hints.html

Page 43: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

4.4.3 이미지품질과성능의접점

단말에서원본보다큰이미지로조정

Layout�image�size�x�Device�Pixel�Ratio�(DPR)

320�x�3�=�960

실제 pixel 수 보다큰이미지의유효성?

Page 44: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

Q &�A

Page 45: [222] 안드로이드 앱의 다중 웹뷰 환경에서 성능 병목 진단 및 … · 4.1.2브라우저엔진비동기초기화 비동기초기화task의시작지연 별도thread생성부담

Thank�You