AW204: JRebel과 인스턴트-런 비교, 핫/웜/콜드 스왑 요약정리

Android Weekly는 매주 발행되는 안드로이드 뉴스레터입니다. 영어 기사를 정독할 시간이 없는 분을 위해 핵심 꼭지를 요약했습니다.

주간 안드로이드 뉴스를 요약해 드립니다. Android Weekly 204 원문도 읽어보세요.


인스턴트 런(Instant Run)은 안드로이드 스튜디오 2.0에 추가된 피처입니다. 이번주 안드로이드 위클리 요약에서는 인스턴스 런의 기본 개념에서부터 핫, 웜, 콜드 스왑에 대한 설명, 사용시 주의할 점, 마지막으로 JRebel과의 비교 내용을 정리하면서 ‘인스턴트 런’을 집중적으로 파헤쳐 보겠습니다.

인스턴스 기본 개념

인스턴트 런이란 여러분의 코딩/테스팅/디버깅 과정에서 변경 및 추가된 코드 변화에 대해 빌드와 디플로이 시간을 마법처럼 줄여줄 수 있는 방법입니다. 이미 실행중인 앱의 코드와 리소스 변경에 대해 핫 스왑을 지원하면서 빌드시간을 단축시켜주는 것이죠. 평소와 같이 코드를 실행(run)하고 그 다음부터 수정하고 다시 실행할 때 옆에 번개표시가 있는 인스턴트 런을 실행하면 ‘마법’처럼 그 변화가 순식간에 적용되는 것을 알 수 있습니다.

인스턴트런은 어떻게 작동하는가 (Instant Run: How Does it Work?!)에서 인스턴트 런이 동작하는 과정을 자세히 논의하고 있습니다.

인스턴트 런 목적 및 특징:

“거쳐야 할 단계수를 가능한 줄이고, 남아있는 것은 가능한 빨리 처리한다”

이런 개발 뉴스를 더 만나보세요

  • 변화가 있는 것에 대해서만 빌드와 디플로이 한다.
  • 엡을 다시 인스톨하지 않는다.
  • 앱을 다시 시작하지 않는다.
  • 심지어 액티비티를 다시 시작하지 않는다.

일반적인 방식으로 처음 코드를 실행하게 되면 메니페스트 파일들과 앱의 리소스가 APK로 머지되고 패키징됩니다. 마찬가지로 .java파일들도 바이트코드로 컴파일되고 .dex파일로 전환되어 APK에 포함됩니다.

처음 인스턴트 런을 실행하면 바이트코드 도구가 .class 파일에 추가되고 새로운 앱 서버(App Server)클래스도 추가됩니다. 커스텀 클래스 로더를 주입해 앱 서버를 실행시키는 새로운 어플리케이션 클래스도 추가되죠. 이렇게 실행되는 인트턴트 런은 Hot/Warm/Cold 스왑을 사용합니다.

Hot, Warm, Cold 스왑 비교

  • Hot swap: 점진적 변화에 대해 새로 런치하거나 현재 액티비티를 실행하지 않고 앱에 반영하는 방식으로 메소드 실행 내부의 간단한 변화에 사용 가능
  • Warm swap: 변화가 반영되기 전 액티비티가 재실행되는 방식으로 리소스 변화가 있을 때 요구됨
  • Cold swap: 앱이 재시작(새로 인스톨되는 것은 아님!)되는 방식으로 상속, 메소드 시그너쳐와 같은 구조적 변화에 요구됨


  • Hot swap 자세히 알아보기

안드로이드 스튜디오는 개발과정에서 어떤 파일이 변경되었는지 모니터링하고 커스텀 Gradle 태스크로 오직 변경된 클래스에 대해서만 dex파일을 생성하도록 실행합니다. 새로운 .dex파일들은 안드로이드 스튜디오에 의해 선택되고 앱에서 실행중인 앱서버에 디플로이 시킵니다. 왜냐하면 실행중인 앱 인스턴스에 기존 버전의 클래스가 이미 존재하기 때문에 Gradle은 이를 업데이트 버전으로 변환시킵니다. 그리고는 커스텀 클래스 로더를 이용해 앱 서버에의해 로드되는 것이죠~

이후로 앱 내에서 메소드가 불릴 때마다 도구(instrumentation)는 기존 클래스파일에 주입되어 앱 서버가 업데이트 된 것이 있는지 확인하게 됩니다. 이에 따라 새로이 오버라이드된 클래스가 실행되면서 변경된 메소드가 실행됩니다.

  • Warm swap 자세히 알아보기

웜 스왑은 액티비티를 재시작시킵니다. 만약 리소스를 변경한다면 리소스를 새롭게 로드 할 수 있도록 액티비티를 재시작할 필요가 있습니다. 점진적 패키저(incremental packager)로 수정된 리소스에 대해서만 패키지하여 디플로이 시킬 수 있습니다.

Warm swap은 메니페스트 내 리소스 변경에 대해 작동하지 않습니다. 왜냐하면 메니페스트 값들은 APK가 인스톨 될 때 읽히기 때문에 관련 변경은 전체 빌드와 디플로이 과정을 필요로합니다.

  • Cold swap 자세히 알아보기

추가, 제거, 어노테니션 변경, 필트, 스태틱 또는 인스턴스 메소드 시그너처, 부모 클래스 변화 등 구조적 변화는 콜드 스왑이 필요합니다.

디플로이과정에서 여러분의 앱과 하위 프로젝트(sub-projects)는 10개까지 슬라이스로 구분되고, 각각은 dex파일을 가집니다. 클래스들은 그들의 패키지명 기반으로 슬라이스에 할당됩니다. 콜드 스왑이 적용될 때 수정된 클래스가 속한 슬라이스의 다른 클래스들도 모두 해당 슬라이스가 타켓 디바이스에 디플로이되기 전에 redex되도록 합니다.

안드로이드 5.0(API 21)이상에서 가능한 ART라는 피처 기반으로 여러개 dex파일을 로딩할 할 수 있는 안드로이드 런타임에 의존하는 접근법입니다. 따라서 API 20 이하 디바이스에서는 안드로이드 스튜디오는 전체 APK를 디플로이시킵니다.

인스턴트 런 사용을 위한 팁!

  • 그래들 프로세스에 할당하는 리소스 조정 즉, gradle.properties 파일에서 jvmarg 세팅을 통해 Gradle Daemon JVM에 적어도 2 gig를 할당하면 dex-in-process가 가능해지고 빌드 속도를 높일 수 있습니다.
  • MinSDK를 21 이상으로 세팅해야 인스턴트 런을 사용할 수 있습니다.
  • 메니페스트 변경은 전체 빌드와 디플로이 사이클을 거칩니다.
  • 인스턴트 런은 메인 프로세스에 대해 동작합니다. 따라서 멀티프로세스를 사용하는 앱이라면 Hot/Warm 스왑은 Cold스왑으로 처리되거나 또는 API 21이하에서는 전체 빌드됩니다.
  • 윈도우 사용자라면 Windows Defender Real-Time Protection이 인스턴트 런을 방해할 수 있습니다. 이럴땐 여러분의 프로젝트 폴더를 Window Defender 제외하는 리스트에 포함시키세요! *인스턴스런은 Jack compiler, Instrumentation Tests, 동시에 여러 디바이스에 디플로잉하는 것을 지원하지 않습니다.

JRebel과 인스턴트 런 비교

인스턴트 런 개념 자체는 사실 새로운 것은 아닙니다. JRebel은 Java SE/EE에 대한 자바 코드 재로딩 도구입니다. JRebel덕분에 개발자들은 지난 8년간 나은 개발 환경을 갖출 수 있었고, 이것이 JRebel for Android로 발전하면서 지난 약 1.5년간 안드로이드 개발자분들에게 도움을 주고 있습니다.

그렇다면 JRebel과 인스턴트 런의 차이점은 무엇일까요? 안드로이드의 JRebel과 인스턴트 런 살펴보기 (Looking at JRebel for Android and Instant Run: how to update code and resources in Android application without wasting time on restarts.)에서 그 답을 제시합니다.

  • 사용하는 스왑 종류 차이
    • 인스턴트 런: hot 또는 warm 스왑 (세팅 설정: Android Studio > Preferences > Build, Execution, Deployment > Build Tools > Instant Run “Restart activity on code changes)
    • JRebel for Android: warm 스왑
  • 어플리케이션 실행 중 유지되는 것

  • API버전
    • 인스턴트 런: API 21이상
    • JRebel for Android: API 15이상(콜드스왑 리밋 없음)

정리하면 인스턴트 런과 JRebel for Android 모두 더 나은 개발을 위해 도움이 되는 툴입니다. 둘 중 어떤 것을 사용할 것인지는 여러분 판단입니다! 이제 빌드와 인스톨 시간을 줄여서 더 생산성 있는 개발과정이 되시길 바랍니다!!

오픈소스 라이브러리

  • Navi 액티비티와 프래그먼트에 리스너를 추가하는 라이브러리입니다.

  • error-prone 컴파일 타임에 자바에서 흔한 개발 실수를 잡아주는 스태틱 분석 도구입니다.

  • Androidstarter 안드로이드 초보 개발자를 위한 MVP구조를 사용한 템플릿 어플리케이션입니다. 간단하면서 아래와 같은 기본 작업들이 포함되어 있습니다.
    • REST API
    • 로컬 스토리지에 데이터 저장하고 꺼내기
    • 로직 레이어와 화면간 전환 구성
  • flexbox-layout CSS Flexible Box Layout Module와 유사한 기능을 갖는 라이브러리입니다. Linear layout과 Relative layout처럼 View Group을 확장할 수 있습니다.

  • CloudRail SI Android SDK 다양한 프로바이더들이 제공한 여러 API들을 추상화시켜 하나의 인터페이스로 만드는 라이브러리입니다.

더 읽을 거리

5월 첫째 주의 기사를 Android Weekly 204 영어 원문에서 볼 수 있습니다.

지난 뉴스가 궁금하다면 아래 링크를 참고해 주세요.

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.


Realm Korea

Realm Korea Team

4 design patterns for a RESTless mobile integration »

close