Google Adsense Side (160x600)



iOS9의 앱 용량 다이어트 기술 App Thinning 썩은 사과


날로 늘어나는 앱 용량때문에 전부터 요구되던 기능이라 언젠가는 자체 구현을 할까 했었던 것이기도 한데(근데 그러면 관리고 뭐고 상당히 복잡해지고 서버까지 운영해야 되니 그냥 미뤄두던 것) 이번 WWDC 2015에서 iOS9의 신기능으로 추가된 것이 바로 App Thinning입니다. 일종의 iOS 기기간의 파편화에 대응하기 위한 전략이기도 한 것으로 보입니다.


크게 3가지 기술로 이루어진 것인데 대충 이렇다고 합니다.

1. 슬라이싱(Slicing)


이제 iOS기기도 꽤 다양해져서 32bit/64bit, 아이폰/아이패드, 비레티나/레티나/3배 레티나(6Plus), 메탈지원/미지원, 512MB/1GB/2GB 기기들이 iOS9을 지원하게 되었죠. 제대로 이들을 지원하려면 실행파일도 아키텍쳐별로 들어가야 되고, 이미지도 3종류 * 아이폰인지 패드인지 구별해야 되고 아무튼 실제 실행시에 쓸모 없는 것들이 잔뜩 포함되게 되었습니다.


기기마다 그걸 다 다운받아 쓰다보니 용량장사라고 욕먹는 애플의 빡빡한 용량 안에서 개발자들은 날로 비대해지는 앱의 크기로 골머리를 썩게 되었죠. 그래서 이번에 등장한 슬라이싱은 개발자가 저걸 전부 포함해서 앱 스토어에 올리면, 앱 스토어에서 알아서 기종에 맞게 최적화된(=못쓰는 부분을 제거한) 앱들을 자동으로 생성해서 사용자 기기에 맞는 버전이 다운되도록 하는 것입니다.

비레티나에 아무런 기능도 없는 아이패드 미니에는 저런 구성이 다운되어 설치되고...

아이폰6+에서는 위와 같이 전혀 다른 구성의 앱이 다운되는 것이죠.

비단 이미지 등이 아니라 모든 리소스에 대해 적용되는 것으로 같은 리소스를 폴더에 넣고 적절한 규칙대로 정보파일을 넣어서 빌드를 하면 사용가능해 집니다. 특히 마음에 드는 것은 Xcode안에서만 되는 것이 아니라 다른 툴에서도 규칙을 지킨 뒤에 특정 폴더에 복사해 넣는 것이 된다는 것이더군요.

나중에는 로컬라이제이션 파일에도 적용되지 않을까 싶군요.



2. 비트코드(Bitcode)

상대적으로 별로 정보가 없는 것인데 iOS의 경우는 강제조건은 아니고 watchOS는 강제입니다. 자바의 바이트코드 처럼 중간형태(intermediate representation)로 컴파일해서 앱 스토어에 등록하면 애플이 알아서 (그때 그 시점에서 최신의) 최종적인 최적화 실행 파일을 만들어서 배포해 준다는 것입니다.



3. 주문형 리소스(On-Demand Resources)

2스테이지까지 진행했다면 2스테이지 까지만...
3스테이지까지 오면 3스테이지를 다운로드...


이걸 지원 안해줘서 자체구현한 개발사가 제법 될 것 같은데 리소스에 태그를 달아서 앱이 필요한 시점에 필요한 부분을 다운받도록 하는 것입니다. 더구나 필요 없어진 부분(또는 오랜기간 사용 안하거나 하면)은 용량이 부족할때 자동으로 제거되어 용량 절약을 할 수 있게 만든 것입니다.

물론 네트워크를 사용한다는 단점이 있지만, 개발자 입장에서는 훨씬 매력적이죠. 일단 초기 다운로드 용량이 적은데다가 이걸 애플이 호스팅해 주니까 말이죠. 게임같은 경우도 게임 특성에 맞다면 훨씬 방대한 리소스를 사용할 수 있겠구요.

안드로이드에서 추가 리소스 파일을 변경했을때 그걸 수동으로 일정 위치에 복사해 넣느라 개발이 엄청나게 짜증났던 기억이 있는데, iOS의 경우 개발과정에서 Xcode가 알아서 스토어를 흉내내 준다고 하므로 상당히 쓸만해 보입니다.


iOS9의 극단적인 용량 다이어트(4.6GB->1.3GB)도 이 기술들이 적용된 것 같습니다.
발표에서는 테스트로 만든 게임에 이 기술들을 적용한 결과 초기 용량이 70MB대에서 14MB정도로 줄었다고 하더군요.

개인적으로 WWDC2015에서 아이패드의 멀티태스킹에 이어 가장 인상적인 부분입니다.
(멀티태스킹은 메모리 관리를 위해 가상메모리 개념까지 열었던데)

App Thinning의 적용으로 최대 업로드 가능 앱 크기가 20GB로 증가되었습니다. 
대신 어떤 시점에서든 동시에 존재해야 될 앱 용량은 2GB라는 듯




핑백