BUZZVIL 블로그에 소개된 글을 편집한 뒤 모비인사이드에서 한 번 더 소개합니다.

1. 글을 시작하며

저는 버즈빌에서 안드로이드 개발을 하고 있는 초보 개발자 Evan입니다. 버즈빌에서 개발을 시작한지 이제 1년정도 됐는데요. 작년 이맘때와 비교하면 회사의 훌륭한 개발자분들과 같이 일하면서 스스로 ‘많이 성장했구나’라는 생각을 하면서도, 한편으로는 아직도 부족한 점이 많다고 느껴지기도 합니다. 1년여간의 안드로이드 개발 경험을 뒤돌아보면서 어려웠던 점들에 대해서 생각해보면 여러 가지가 있겠지만, 그중 하나를 꼽자면 파편화 문제가 아닐까 싶습니다. 그래서 스스로 정리도 할 겸 제가 맡고 있는 안드로이드의 파편화에 대해서 글을 남겨보고자 합니다.

안드로이드 파편화에 들어가기에 앞서, 파편화에 대해 간략히 설명드리겠습니다. 파편화란, 기기의 앱 구동 환경이 제각각 분열되어 있는 것을 이야기하는데, 크게 OS 측면의 파편화와, 하드웨어 측면의 파편화로 나눌 수 있습니다. 하드웨어와 OS 버전의 다양성이 많지 않은 iOS에 비해 안드로이드는 파편화 정도가 심해서 여러 가지 문제를 발생시키고 있습니다.

 

OS 파편화

OS 파편화는 기기들이 수많은 OS 버전에서 동작할 수 있는 것을 이야기합니다. 아래의 그림은 구글 안드로이드 공식 사이트에서 제시하고 있는 통계 자료입니다. 2017년 7월 초 기준으로 해당 버전을 사용하는 기기의 비율을 나타내고 있는데요(0.1% 미만 제외), Gingerbread에서 Nougat까지 다양한 버전이 존재하는 것을 알 수 있습니다. 최근에는 Nougat 다음인 O 버전의 Preview가 나오고 있는 상황입니다.

지정된 버전의 Android 플랫폼을 실행하는 기기 분포

위와 같이 동일한 기기들이 다양한 OS 환경에서 동작할 수 있기 때문에, 한 가지 기능을 개발하더라도 이러한 OS 파편화로 문제가 발생할 수 있는 가능성을 항상 염두에 두어야 합니다.

대부분의 앱에서 minSdkVersion과 targetSdkVersion 설정을 통해 대응해야 하는 문제의 경우의 수를 줄이고 동작 안정성을 높이고 있지만, 최대한 많은 기능을 제공하기 위해서는 지원 가능한 버전의 범위를 넓히고 각 버전에 맞게 대응을 하며 개발해야 합니다. 또한, 새로 나오는 버전에 대해서도 어떤 API가 바뀌고 사라지는지 관심을 가지고 있어야 새 버전 출시시 기존에 잘 되던 기능이 동작하지 않는 문제를 예방할 수 있습니다.

간략히 OS 파편화에 따른 문제점을 살펴보았지만, 구글이 제공하는 문서에 맞게 개발한다면 예상하지 못한 버그가 생길 가능성은 낮기 때문에 OS 파편화는 그리 큰 문제가 아닐 수도 있습니다. 더 큰 문제는 하드웨어 파편화입니다.

 

하드웨어 파편화

OS 파편화보다 더 큰 문제는 수많은 제조사에 의해 수많은 종류의 기기가 나온다는 것입니다. 아래 그림은 Open Signal 사이트에서 2015년 제시한 기기 파편화에 대한 그림입니다. 사이트에 따르면, 최소 24,000종류가 넘는 기기가 세상에 존재한다고 합니다.

기기 파편화 (Open Signal, 2015)

안드로이드는 오픈 소스이기 때문에 수많은 제조사에서 안드로이드 기반으로 기기를 개발할 수 있고, 이에 따라 안드로이드 기기의 다양성은 점점 더 늘어나고 있는 추세입니다. 기기의 다양성으로 인한 문제 중 하나는 해상도에 관한 것입니다. 너무나 다양한 사이즈의 기기가 존재해서 UI 작업시에는 여러 크기의 화면에서 어떻게 보일지 항상 고민해야 합니다. 특히 그래픽이 중요한 게임 개발시에는 더욱더 해상도 문제가 개발 시간과 비용을 증가시키는 원인으로 작용하고 있습니다.

또한 제조사들은 개발시에 구글의 기본 가이드라인만 준수하면 자신들의 입맛에 맞게 변화가 가능하기 때문에 기능과 서비스, UI 등을 customize해서 제품을 출시하게 됩니다. 또한 같은 모델이라도 통신사에 따라 customize되어 출시되는 경우도 있습니다. 따라서 이러한 customize가 만들어내는 문제가 있을시, 특정 모델에서만 앱이 제대로 동작하지 않는 경우도 생기게 됩니다. 중요한 점은 기기가 너무 다양해서 이러한 문제는 사전에 알고 대처하기 힘들다는 것입니다.

 

파편화가 발생하는 이유

이러한 파편화의 원인에 대해서 좀 더 자세히 알아보겠습니다. 아래 그림은 안드로이드 기기의 제작 과정을 나타낸 것입니다. 아래와 같은 5가지 과정을 거치게 되는데요.

안드로이드 팀이 오픈소스 코드를 릴리즈
반도체 제조사에서 자신들의 하드웨어에 맞게 릴리즈된 버전 수정
기기 제조사에서 출시할 기기에 맞게 릴리즈된 버전 수정
기기 제조사와 통신사에 의한 검증
실제 유저에게 릴리즈

 

안드로이드 기기 제작과정

이렇게 구글의 업데이트에 맞추어 각 제조사별로 다시 기기에 맞는 customize를 해주게 되는데, 이 과정에서 하드웨어 파편화가 발생하게 되는 것입니다. 또한 이는 OS 파편화의 원인이 되기도 하는데, 새 버전이 릴리즈되었다고 해도 위 과정에 드는 시간이 상당히 오래 걸리기 때문에 제조사마다 새 OS버전 업데이트 가능 시점을 예측하기가 어렵기 때문입니다.

 

대응

그렇다면 이러한 파편화 문제에 대해서 어떻게 대응할 것인가에 대해서 생각해보려고 합니다.

스타트업에서는 파편화에 대한 대응을 완벽하게 할 수 있는 환경이 갖춰져 있지 않을 가능성이 높기 때문에, 대응에 드는 리소스를 최소화하는 방향으로 개발하는 것이 바람직할 것입니다.

이는 버즈빌도 마찬가지입니다. 버즈빌에서도 테스트 담당자가 따로 있지 않기 때문에, QA가 필요할 시에는 해당 서비스와 관련된 개발팀, 운영팀 인원이 함께 테스트하는 방식을 취하고 있습니다. 테스트 기기도 마찬가지입니다. 실제 테스트를 모든 기기에서 할 수는 없으므로, 버즈빌에서는 서비스를 제공하는 국가에서 주로 사용하는 기기를 파악한 뒤 대표적인 모델들을 중심으로 테스트를 진행하고 있습니다. 또, 가능하다면 최대한 버전분기를 하지 않는 방향으로 개발하는 것도 하나의 방법입니다. 버전분기가 들어갈수록 해당 기능이 원하는 방식대로 동작할지 알아보기가 힘들고, 유지보수비용도 증가하기 때문입니다.

새로운 버전, 새로운 기기에 대한 호환성 체크도 필요합니다. 위에서도 잠깐 언급했었지만, 새로 릴리즈될 버전에서 어떤 기능이 추가, 제거, 변경되었는지 조사하고 수정해야 할 기능이 없는지 확인하는 것은 필수입니다. 안드로이드 O 버전에서도 많은 변화가 있을 예정인데, 암시적 브로드캐스트에 대한 제한이 추가됨에 따라 기존에 이 기능을 사용하던 부분에 대한 수정을 해야 하는 것도 한 가지 예입니다. 특이한 스펙의 기기가 나왔을 경우에도 마찬가지입니다. 얼마 전 갤럭시 S8과 같이 가로:세로 비율이 1:2에 가까운 기기들이 출시되었는데 이에 따른 UI상의 예외처리도 한 가지 예라고 할 수 있습니다.

구글에서도 당연히 이러한 파편화 문제를 인지하고 있고, 해결하기 위해 여러 방안을 내놓고 있습니다. 넥서스 등의 레퍼런스폰을 지속적으로 출시하고, 안드로이드의 새로운 버전을 1년 주기로 정하고, 핵심 기능들의 업데이트는 플레이 스토어를 통해서 가능하도록 하여 제조사의 커스터마이징 부담을 줄여주었습니다. 또한 Android O부터는 Project Treble을 통해 제조사가 더 쉽고 빠르게 OS 업데이트에 대응할 수 있도록 지원하게 되었습니다. 따라서 제조사와 개발자가 가지고 있는 안드로이드 파편화에 대한 부담은 점점 줄어드는 추세로 나아가고 있습니다.

 

2. 마무리하며

안드로이드 파편화 문제는 안드로이드 초창기부터 꾸준히 제기되었던 문제이고, 여러 이해관계자들이 이 문제를 해결하기 위해 노력한 결과 현재는 좀 더 나은 환경에서 안드로이드 개발을 할 수 있게 되었습니다. 하지만 지금도 파편화는 개발시에 고려해야 할 중요한 문제 중 하나입니다. 다양한 환경에서 안정적이고 일관되게 구동하는 안드로이드 앱을 만들기 위해서는 항상 이 문제를 신경써야 할 것입니다. 기존 버전과의 호환성을 고려하고, 새로운 환경에서도 잘 동작할 수 있는 서비스를 만들기 위해서 저도 공부를 게을리 하지 않아야겠습니다.

원문 바로가기: 안드로이드 파편화(Fragmentation)에 대하여

 

 

 

[fbcomments url=”http://www.mobiinside.com/kr/2017/12/01/buzzvil-android/” width=”100%” count=”off” num=”5″ countmsg=”wonderful comments!”]