본문 바로가기

안드로이드

[펌]Android Image Loader

출처 | http://dev2.prompt.co.kr/31

참고 | http://d2.naver.com/helloworld/429368


Android 에서 Image 처리는 Android 개발자의 계속된 숙제였습니다.
한정된 메모리, 네트워크를 사용할 때의 데이터 사용량, 로딩속도 등 많은 부분에 이슈가 있었죠.

 

Android 개발자들은 이러한 문제점을 해결하기 위해 다양한 노력을 해 왔고,
그 결과 다양한 Image Loader Library 가 세상에 공개되어 왔습니다.
Volley, Picasso, Android Universal Image Loader(AUIL) 등이 그 예입니다.

 

살짝 주제를 바꾸어 Google I/O 에 대해서 알아봅시다.
Google I/O는 미국 캘리포니아 주 샌프란시스코에서 한 해에 한 번 개최하는 구글의 개발자 지향 콘퍼런스입니다.
구글의 새로운 제품/기술에 대한 키노트와 함께 각종 기술에 대한 심도 있는 세션도 진행되는 개발자들의 축제입니다.

 

이때마다 Google I/O 관련 앱이 배포되고, 소스코드가 공개됩니다.
행사 전 Google Play 를 통해 앱이 공개되어 행사 참여자들이 Google I/O의 다양한 소식을 접할 수 있도록 해주며
다양한 방법으로 행사 참여에 도움을 줍니다.

 

Google I/O의 목적은 행사 참석자에게 유용한 앱을 제공하는 것이고
또 다른 목적은, Android 개발자들이 앱을 설계, 개발할 때 다양한 부분에서 활용할 수 있도록 소스코드를 공개하고 있습니다.

 

Google I/O의 앱은 Android 앱을 개발할 때 알아야 하는 거의 모든 내용을 포함하고 있습니다.
Fragment, Loader, Service, BroadcastReceiver, Alarm, Notification,
SQLiteDatabase, ContentProvider, ActionBar, NavigationDrawer, Google Drive API, GCM...
해당 앱을 분석하여 자기의 것으로 만들 수 있다면 많은 도움이 되리라 확신합니다.

Google I/O 2014 앱 다운받기
Google I/O 2014 소스 다운받기
 

Google I/O 2014 에 적용된 Library 중 Glide 라는 Library 가 공개되었습니다.

Glide

Glide is a fast and efficient open source media management and image loading framework for Android that wraps media decoding, memory and disk caching, and resource pooling into a simple and easy to use interface.

 

Glide supports fetching, decoding, and displaying video stills, images, and animated GIFs. Glide includes a flexible api that allows developers to plug in to almost any network stack. By default Glide uses a custom HttpUrlConnection based stack, but also includes utility libraries plug in to Google's Volley project or Square's OkHttp library instead.

 

Glide's primary focus is on making scrolling any kind of a list of images as smooth and fast as possible, but Glide is also effective for almost any case where you need to fetch, resize, and display a remote image.

 

Bump 앱을 만든 Bumptech가 구글에 인수되었고, Bump 앱에서 사용되던 Image Loader Library 가 공개되었죠.
Picasso library처럼 메소드 체이닝을 활용하여 사용하기 쉽습니다. 또한 편리하고 다양한 기능이 제공됩니다.
Animation, Transfomation, Animation GIF, Memory, Cache, 객체 재활용, 네트워크, ContentProvider 로딩 등등...

 

Android Studio 에서 사용할 경우 Glide 프로젝트로 테스트 해 보시면 되고,
Eclipse 에서 테스트 하시려면 https://github.com/bumptech/glide/releases 페이지 하단에서
jar파일이나 소스코드 받으시면 됩니다.

 

Gradle 사용시

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.github.bumptech.glide:glide:3.5.1'
    compile 'com.android.support:support-v4:19.1.0'
}

 

Maven 사용시

<dependency>
    <groupId>com.github.bumptech.glide</groupId>
    <artifactId>glide</artifactId>
    <version>3.5.1</version>
    <type>aar</type>
</dependency>
<dependency>
    <groupId>com.google.android</groupId>
    <artifactId>support-v4</artifactId>
    <version>r7</version>
</dependency>

 

다음은 성능비교 내용입니다.
    메모리, 속도 값은 총 6장의 이미지를 리스트뷰에 띄우는 방식으로 3회 진행하여 평균값으로 계산했습니다.
    반복 스크롤 부분은 50장 정도의 이미지를 리스트뷰에 띄웠고 메모리를 정리하기 직전 최대 사용량을 구했습니다.

Library 종류

이미지
용량(KB)

최초

디스크 캐시

메모리 캐시

스크롤 반복

메모리(MB)

속도(ms)

메모리(MB)

속도(ms)

메모리(MB)

속도(ms)

최대 할당 메모리(MB)

Glide

301

4.6

2603

2.2

159

0.1

1

115

563

2.9

526

1.4

45

0.1

1

219

1.8

575

1.1

36

0

2

456

0.9

715

1.3

54

0.1

1

238

2.3

407

1.2

37

0.1

1

556

1.9

507

1.3

48

0.1

1

Picasso

301

9.3

706

9.5

542

0.2

0

65

563

9.4

1021

9.4

355

0.1

1

219

9.5

496

9.5

333

0.1

0

456

9.4

566

9.4

344

0.1

1

238

9.6

1117

9.4

339

0.1

0

556

9.5

970

9.4

361

0.1

0

AUIL
(Android-Universal-Image-Loader)

301

7.6

1924

7.4

169

7.4

113

65

563

7.2

2361

7.5

142

0

130

219

7.3

1084

7.5

99

7.5

134

456

7.4

2089

7.5

140

7.6

159

238

7.3

1030

7.4

136

7.4

122

556

7.4

1968

7.5

149

7.5

1

Volley

301

2.4

964

2.2

267

0.1

188

100

563

3

795

2.4

227

0.1

382

219

2.4

481

2.2

178

0

1

456

2.8

1346

2.3

333

0.1

1

238

2.4

1436

2.1

333

0.1

0

556

3

1817

2.5

347

0.1

1

 

Library 종류

비고

Glide

반복 스크롤 시 메모리를 많이 쓰는 만큼 빠른 속도와 안정성을 보장. 
디스크 캐시에서 읽어오는 속도가 빨라 스크롤 시에도 이미지가 빠르게 뜸.

AUIL
(Android-Universal-Image-Loader)

메모리 캐시 히팅률이 낮음.
스크롤 시 이전 이미지가 보여지는 현상 발생.

Volley

가끔 OOM으로 죽는 현상 발생.
빠르게 상하 스크롤시 이미지 거의 안 뜸.


최초 이미지를 로딩할 때는 전체적으로 큰 차이가 없었으나 디스크 캐시를 사용할 때 Glide의 성능이 가장 돋보였습니다.
메모리 캐시를 끄고 테스트해도 다른 라이브러리들보다 더 자연스럽게 이미지를 불러옵니다.

 

Android Image 처리에 고민하고 계시는 개발자분이 계시다면 Glide 를 한번 사용해 보시는걸 권해 드립니다.