트렌드

‘안드로이드L’이 가져올 개발 환경의 변화

2014.07.04

‘안드로이드L’이 세상에 모습을 드러낸 지 이제 일주일이 갓 지났다. 안드로이드L은 단순히 이용자에게 새로운 안드로이드 경험을 주는 것도 있지만 개발자들로서는 큰 숙제를 떠안게 됐다. 물론 그 결과물은 이용자들이 안드로이드와 앱을 더 쉽고 편하게 쓸 수 있도록 하기 위한 것이니 피할 수 없는 일이기도 하다.

일단 가장 큰 변화는 런타임 환경이다. 안드로이드는 자바를 기반으로 한 ‘달빅’을 써 왔다. 달빅은 일종의 가상 머신이다. 코딩된 앱을 기기에 맞게 컴파일하면서 실행하는 주체라고 보면 된다. NHN NEXT에서 안드로이드 개발 과정을 맡고 있는 손영수 교수와 안드로이드L과 개발 환경에 대한 이야기를 나눴다.

“달빅은 앱의 최소부분만 컴파일해두었다가 앱이 돌아가는 시점에서야 앱의 전체가 기계어로 변환되어 작동합니다. 앱을 실행해야 스마트폰이 앱을 컴파일하고 모든 내용을 읽을 수 있기 때문에 아무래도 로딩속도가 느려질 수밖에 없습니다. ART는 이 부분을 개선해 미리 모든 내용을 컴파일해 곧바로 실행할 수 있도록 개선한 런타임입니다.”

nexusL_01

달빅은 .dex 확장자 형태의 파일을 앱이 실행될 때마다 실시간으로 변환한다. 이를 JIT(just in time) 컴파일이라고 부른다. 앱이 실행될 때마다 약간의 컴파일이 필요하다. 반면 ART는 이를 OAT라는 상태로 미리 변환해다. 둘의 차이는 설치 과정에서 완전히 번역된 것이냐, 아니냐의 차이로 보면 된다.

달빅의 JIT가 무조건 나쁜 건 아니다. 자바는 애초에 기기를 가리지 않고 똑같은 결과물을 내는 것이 설계의 기본이었기 때문에 실행할 때 각 기기에 맞도록 앱이 컴파일하면서 호환성을 높인다. 반면 ART는 앱이 설치될 때 아예 그 기기에 맞도록 컴파일을 마친다. 그 결과가 OAT 파일에 담긴다. 이 OAT는 각 기기에 맞춰 생성되기 때문에 결과적으로 각 기기에 설치되면 프로세서, GPU에 꼭 맞는 파일로 변환된다. 스마트폰의 프로세서를 바꿀 일은 없으니 한번 컴파일하면 다시는 변환할 필요가 없다.

어떻게 보면 자바로 만들되 실행은 네이티브 앱처럼 곧장 결과물을 실행하는 것이다. 이는 로딩 속도 뿐 아니라 앱 실행 속도에도 영향을 준다. 이 때문에 가상 머신이 없어지는 것 아니냐는 해석도 있다. 하드웨어에 컴파일된 기계어가 직접 실행되기 때문에 네이티브 앱과 비슷해 보이긴 하지만 아직은 가상 머신이 완전히 사라졌다고 보기는 어렵다. 새로운 형태의 가상 머신이라는 해석도 있다.

그렇다면 ART에 따라 앱을 완전히 새로 개발해야 할까? 꼭 그런건 아니다. 가장 이상적인 것은 ART가 각 앱을 인지해 알아서 앱을 컴파일하고 매끄럽게 실행하는 것이다. 라이브러리도 같다. 하지만 지금 적지 않은 앱이 제대로 동작하지 않는 것은 런타임에 대한 API들이 아직 완성되지 않았고 구글이 앱 개발자들과 함께 런타임 문제를 풀어보자는 의도도 있다. 안드로이드 버전이 업데이트되면서 API들이 조금씩 추가되고, 사라지고, 대체된 것과 비슷하다고 볼 수 있다.

손영수 교수는 “특히 비동기식이 앱이나 백그라운드에서 작업을 하는 앱들에서 에러가 자주 발생한다”고 설명했다. 웹에서 정보를 가져오는 하이브리드앱들도 적지 않은 문제를 일으킨다. 이는 안드로이드L이 차차 개발이 마무리되면서 풀어갈 문제다.

android_L_05

메모리를 정리하는 가비지 콜렉션도 중요한 문제로 꼽힌다. 안드로이드는 각 앱에 할당해서 쓸 수 있는 메모리에 제한이 있다. 그런데 그 제한이 기기마다 다르다. 구형 기기의 경우 수십MB 정도고, 요즘 나오는 기기는 512MB 정도까지 당겨 쓸 수 있다. 특히 이미지를 많이 불러오는 앱들은 메모리를 많이 쓰는데 제한된 메모리를 넘기지 않기 위해서 적절한 때에 쓰지 않는 메모리를 삭제해야 앱이 먹통이 되지 않는다. 이를 가비지 콜렉션이라고 하는데, 이 과정에서 아주 순간이지만 기기가 멈칫한다. 이게 이용자들에게 불편을 줄 수 있다.

“대체로 앱 개발 과정에서는 구형 기기를 포기할 수 없기 때문에 메모리를 아주 방어적으로 쓸 수밖에 없습니다. 보통 기기를 인식해 메모리 제한을 푸는 식으로 메모리를 쓰는데 ART에서는 가비지가 생기는 것을 억제할 수 있습니다. 단편화를 줄인다는 것이지요. 단편화가 줄어들면 이를 소거하는 데 필요한 시간이 줄어들고 기기가 멈칫하는 것을 줄일 수 있습니다.”

메모리 관리는 매우 중요한데 돌아보면 기존 안드로이드 2.x대에서는 운영체제가 아예 통으로 관리했다. 이후 4.0으로 넘어가면서 앱에서 필요에 따라 조금씩 메모리를 더 할당할 수 있도록 여지를 주었다. 이게 L부터는 효율성을 높이는 쪽으로 개tjs되는 것이다.

android_L_07

그렇다면 안드로이드L이 나오면 기존 앱과 완전히 다르게 설계해야 하는 것일까? 이건 약간 묘한 문제라 정답이 없다. 손영수 교수는 “일단 구글이 앱 개발자들에게 불편을 주지 않도록 개발도구에서 최적화를 돕는 것이 당연한 일”이라고 설명했다. 하지만 현실적으로 어렵기 때문에 일부분은 오픈소스의 도움이 필요하다고 짚었다. 특히 최근 구글의 행보를 개발자 입장에서 보면 오픈소스 안드로이드인 AOSP와 점점 더 멀어지고 있다는 설명이다. 대표적인 것이 저전력 모드다. 새로 추가된 기능으로 배터리가 적게 남으면 꼭 필요한 부분만 남기고 앱의 일부를 제어하는 것이다.

“구글이 가장 우려하는 건 애플이 아니라 AOSP로 기기를 만드는 샤오미, 아마존 등입니다. 저전력 모드를 비롯해 일부 기능들은 AOSP에 포함하지 않고 있습니다. 점점 더 구글은 안드로이드의 기능을 ‘구글플레이 서비스’로 집중하고 있습니다. 어떻게 보면 앱 개발자들은 구글플레이와 AOSP 사이에서 고민을 해야 합니다. 엄청난 단편화가 이뤄지는 것이지요.”

최근 구글의 새 서비스들은 구글플레이서비스를 통해서 적용되는 부분이 많다. 간혹 안드로이드에 경고 표시가 뜨면서 ‘구글플레이 서비스를 업데이트해야 설치할 수 있다’는 메시지가 뜨는 것을 볼 수 있다. 이 구글플레이서비스는 안드로이드에 새로운 기능들을 정의하는 허브다.

androidboy_1

‘안드로이드웨어’가 대표적인 예다. 기존에 없던 안드로이드웨어라는 전혀 새로운 작동 API를 기존 안드로이드 기기에서 돌리기 위해서는 운영체제가 시스템단에서 처리를 해주어야 하는데, 일단 제조사들이 안드로이드 버전 업데이트하는 게 쉬운 일이 아니다. 구글 입장에서는 당장 써야 하는 기능들이 있는데 마냥 업데이트만 바라볼 수도 없다. 이 때문에 최근 안드로이드는 중요한 요소들을 모두 이 구글플레이 서비스를 통해 제공한다. 이를 통해 두 가지 효과가 있는데 하나는 기기 펌웨어 업데이트와 관계 없이 새 서비스를 할 수 있다는 점, 그리고 구글플레이 서비스가 깔리지 않는 AOSP를 견제하는 것이다. 구글이 자랑하는 기능들 대부분은 AOSP에서 안 된다.

하지만 앱 개발자 입장에서는 AOSP를 무시할 수 없다. 특히 중국 시장은 샤오미나 원플러스처럼 AOSP를 기반으로 자체 개발한 운영체제를 쓰는 기업들이 많고, 이름없는 저가폰은 셀 수 없이 많다. 중국 시장을 놓치지 않으려면 새로운 방향의 안드로이드와 AOSP를 모두 끌어안아야 한다. 손영수 교수는 “어느 정도 기능들은 오픈소스로 대체될 수 있는데 개발자로서는 준비를 많이 해야 할 것”이라고 짚었다.

안드로이드의 파편화는 계속해서 지적되고 또한 보완되고 있긴 하지만 여전히 개발자들에게 고민거리다. 그 자체가 시장과 연결되기 때문이다. 시장에 따라 아직 안드로이드 2.x 버전이 주력인 경우도 많고, 새 기술이 빨리 받아들여지는 경우도 있다. 이를 어떻게 최적화하느냐는 앱의 전략이나 정책과 긴밀하게 결정해야 할 문제다. 새 기술 뒤에 숨어 있는 개발자들의 고민거리다.

allove@bloter.net

프리랜서 IT 컬럼니스트, 기술과 사람이 더 가까워질 수 있는 이야기를 담고 싶습니다. e메일 work.hs.choi@gmail.com