다중 apk 지원
대게 우리는 release 버전으로 빌드한 하나의 apk 파일을 구글플레이에 올리고
사용자는 그 apk 파일을 다운받고 설치합니다.
apk 파일안에 dpi에 따른 이미지 리소스들이 모두 포함되어있고,
manifest파일에 apk에 대한 제약조건(minimum sdk, 퍼미션이나 특정 기능, 화면 크기 등)이 적혀있으므로,
apk 다운받으려는 사용자의 기기가 제외조건에 포함되지 않는다면 apk를 다운받고 설치할수 있습니다.
그런데 내가 만든 apk를 좀 더 많은 사람에게 쓰이게 하고 싶거나,
가능한 적은 용량으로 서비스하고 싶은 경우도 있습니다.
사실 왠만한 앱이라면 굳이 다중 apk 지원을 몰라도 되지만,
글로벌 서비스를 하거나, 저사양의 폰이 많은 국가에 집중적으로 배포를 하려한다면,
꽤 많은 변수들을 염두해두고 조금이라도 더 많은 사람들이 쓸수 있는 apk를 만들어 배포하고 싶을것입니다.
예를들어 극단적으로 android minimum sdk를 4부터 지원해서
완전 구린 스마트폰을 가지고 있는 사용자까지도 잠재 고객 대상으로 넣고 싶다거나,
데이터값이 밥값보다 비싼 그런 국가들을 위해서
apk 파일을 최대한 작게 만들고 싶다 그런 욕구들 말이죠.
글로벌앱 페이스북이나 라인 같은 경우에도 다중 apk 지원을 통해서
다운받는 apk 종류를 다양하게 나누어놓았습니다.
페이스북의 구글플레이 앱정보 화면을 보시면 추가 정보에 저렇게 써있습니다.
앱의 크기도 기기에 따라 다르고, 지원되는 android 버전도 기기에 따라 다르고,
그렇기 때문에 현재 버전도 기기에 따라 다르게 제공되지요.
gradle을 이용해서 조금 더 쉽고 편하게 여러개의 apk 파일을 동시에 빌드 할수 있습니다.
여러개의 빌드를 만들어서 구글플레이에 등록할때
가장 주의해야할 점은 versionName이 같은 여러개의 빌드를 구글플레이에 등록할수 있지만,
versionCode는 중복된것은 올릴수 없습니다.
그렇기 때문에 다중apk를 생성할때는 각각의 apk가 서로다른 versionCode를 가져야합니다.
바로 이 작업을 gradle을 이용해서 좀 더 편하게 하는것이지요.
아래의 샘플 코드는 ldpi, xxhdpi, xxxhdpi 세개를 제외한 나머지 density에 해당하는 apk 파일을 만드는 gradle 코드입니다.
모듈레벨의 gradle파일에 아래 내용을 추가하시면 됩니다.
density로 빌드를 나눌때는 이 부분은
compatibleScreens 'small', 'normal', 'large', 'xlarge'
필수니깐 별다른 수정없이 추가하시면 됩니다.
이렇게 api, cpu, density같은 기준으로 여러개의 apk 파일이 만들어지게 되고
만들어진 파일이 각각 다른 versionCode를 갖게 됩니다.
위의 샘플 소스코드 기준으로
기본 버전코드가 1 이라면
LDPI : 1001
MDPI : 2001
HDPI : 3001
XHDPI : 4001
XXHDPI : 5001
XXXHDPI : 6001
density에 따라 각각의 apk는 위의 형태의 버전코드를 갖게될것입니다.
구글은 버전코드를 만들때 일종의 가이드를 제안하고 있는데 아래의 형태와 같습니다.
제일 첫번째 두자리는 api 레벨, 그다음 두자리는 스크린사이즈같은걸로, 그리고 나머지 세자리를 앱버전코드로 하는 형태말이죠.
꼭 굳이 이렇게 하지 않아도 되지만,
반드시 일종의 규칙을 만드셔야 합니다.
구글플레이는 사용자가 다운로드 받을수 있는 apk가 여러개가 있을때
더 높은 버전의 버전코드를 우선적으로 업데이트합니다.
사용자의 안드로이드 디바이스가 안드로이드 7.0 이상의 고사양기기라면
minimum sdk 버전이 높은걸로 설정되어있는 apk를 받아야할것이고,
고해상도의 화면을 가지고 있는 디바이스는 당연히 고해상도 리소스가 담겨있는 apk를 받아야할것이기 때문에
상위버전의 apk가 높은 숫자의 버전코드를 할당받도록 하셔야 합니다.
여튼 빌드된 apk는 기본적으로 universal용 apk도 포함해서 만들어지기 때문에
하나의 유니버셜 apk와 기타 apk 파일들을 한번에 구글플레이에 등록하면 되고요.
사용자는 구글플레이에서 앱을 설치시에 자신의 디바이스에 맞는 빌드를 다운받을수 있게 되고,
제약조건 그 어디에도 속하지 않는 디바이스인경우에는 universal 앱을 다운받게 됩니다.
다중 apk가 모든면에서 좋다고 보기에도 약간 애매한 부분이 있는데요
density를 기준으로 빌드가 나뉘어졌다면
사용자가 다운받은 apk 파일에는 한종류의 리소스파일 밖에 없기 때문에
더 높은 해상도로 볼수 있는 외부기기가 연결되었거나 했을때도
리소스가 한종류밖에 없기때문에 지원이 제한되는 경우도 발생할수 있습니다.
https://developer.android.com/google/play/publishing/multiple-apks.html#VersionCodes
https://developer.android.com/studio/build/configure-apk-splits.html