티스토리 뷰

 안드로이드 Multiple APK를 지원한다고 합니다. 지원하게 되면 어떤식으로 적용이 가능한지 이를 통해 변경된 사항이 무엇인지 작성하려고 합니다. 이 글은 안드로이드 개발 홈페이지에 작성되어 있는 글을 참고하여 작성하였습니다.


Multiple AKP Support 메뉴얼

  https://developer.android.com/google/play/publishing/multiple-apks.html


Multiple APK 적용가능한 범위

 같은 이름의 패키지 명을 사용해야 하는데 APK 1개로 처리하기엔 이미지 사이즈도 크고, 그로 인해 적용되어야 하는 폰이 아닌 경우에도 모두 1개의 APK로 처리해야 하여 그만큼의 용량을 비효율적으로 사용하게 되는 경우 등이 있습니다. 멀티 APK 지원을 통해 이를 해결할 수 있도록 변경되었습니다.

 여러개의 APK를 둬야 하는 아래 사항에 대하여 Multiple APK 적용이 가능한 경우들 입니다.

 - CPU마다 최적화를 처리해야 하는 경우(NDK 빌드 시)

 - 이미지 사이즈를 각각 적용해야하는 경우(DPI 순으로)

 - 플렛폼 버전별로 별도의 앱을 구현해야 할 경우

 - OpenGL Texture 지원 포멧에 따라서

 이렇게 4가지 방식의 경우 Multiple APK를 통해 동일한 Package 이름을 사용하여 1개의 앱을 마켓에 등록하고, 위의 사항에 따라서 다운받는 안드로이드 종류에 따라서 모두 다르게 적용이 가능하도록 지원하게 됩니다.

 이미지를 사이즈별로 각각 적용해야 하는 경우에는 지원하지 않는 사이즈를 가진 폰에서까지 APK에 포함되어 있는 모든 이미지를 가지게 되는 사항을 말합니다. 내폰은 XHDPI를 적용하는 폰인데 HDPI, MDPI, LDPI의 사이즈 이미지까지 모두 가지고 있어야 하는 경우입니다. 이들의 이미지 때문에 APK 파일도 커지는 경우에 적용하시면 됩니다. 이미지 1~2개를 가지고 분리하는것은 .. 의미가 없겠죠?

 위와 같은 이유로 분리해야 할 경우가 있다면 Multiple APK 지원을 하시면 됩니다.


Multiple APK Rules

 응용 프로그램을 Multiple APK를 지원하는 고급모드를 사용하기 전에 지켜야할 내용입니다.

 - 제가 작성하는 내용은 아래 사이트를 참고하여 중요해 보이는 내용을 작성하였습니다. 모든 내용이 포함되어 있지 않으므로 자세한 내용은 아래 사이트를 참고해주세요.

    https://developer.android.com/google/play/publishing/multiple-apks.html#Rules


 - 꼭 동일한 패키지명을 가져야 하며 같은 사이닝을 해야 합니다.

 - 버전 코드는 서로 다르게 가지고 있어야 합니다. 아래 Multiple APK 생성하기 부분을 참고하세요.

 - 위의 분리 조건을 제외하고 지원되는 내용이 일치해야 합니다.

    위에서 작성한 Multiple APK 분리 가능 조건의 내용과 일치해야 합니다. 그 외 완전히 다르게 처리하는 경우가 발생해서는 안된다는 이야기입니다. 이 경우는 전혀 다른 앱이 되는것이겠죠? 

 - 버전 코드가 기존에는 0400이고 새로 적용하는 APK가 0300이라면 업데이트가 불가능하게 됩니다. 버전 코드에 주의하세요.


 이정도로 정리는 했지만 더 디테일한 내용이 많이 있습니다. 대부분 버전코드에 대한 내용입니다. 안드로이드 마켓에서는 버전 코드가 기존에 작성한 코드가 1.0.0 이라면 다음 코드는 1.0.0 보다 커야 합니다. 이를 Multiple APK 룰에 따라서 적용 받으시는게 가장 안전하다는 이야기가 됩니다. 그리고 이미지 사이즈의 경우 XHDPI를 지원하는 APK가 있고, HDPI를 지원하는 APK가 있습니다. 하지만 실제로 2개 모두 XHDPI가 지원되는 형태를 가지고 있을 수 있습니다. 이럴 경우에는 오류를 발생시키게 됩니다. 모두 버전과 이미지 사이즈 등 겹치지 않게 설계해야 Multiple APK를 지원 할 수 있다는 이야기가 되겠습니다.


Multiple APK 생성하기

 Multiple APK를 지원하기 위해서는 별도의 프로젝트가 필요하게 됩니다. 이렇게 별도의 프로젝트 폴더를 가지고 있어야 한다면 당연히 소스코드도 변경되어야 합니다. 그렇다고 버전에 따라서 소스코드까지 다르게 처리하기에는 너무 많은 코드를 가지게 되는 단점이 있습니다. 이럴 때는 적적하게 작성된 중복코드를 라이브러리 형태의 코드로 처리하는 것이 가장 좋은 방법이라고 합니다. 이미지만 다르게 처리하거나, 버전만 다르게 처리하거나, OpenGL Texture 지원 포멧방식만 다르게 하거나 등이있습니다. 모두 라이브러리를 통해 적절하게 처리해주면 중복 코드를 최소화 할 수 있는 방법이라고 합니다.


- Multiple APK의 버전 코드명 작성법

 싱글 APK의 경우 1개의 APK 파일에 버그 패치를 하더라도 모든 폰에 적용이 되게 됩니다. 하지만 Multiple APK를 지원한 이후에는 수많은 APK에 모두 버그 패치를 적용할 필요는 없습니다. 내가 버그 패치할 1개의 파일에 대해서만 업로드하면 됩니다. 기존 싱글 APK에서는 버전 코드이름이 1.0.0 의 순서를 사용하여 버그 패치라면 1.0.1 등의 숫자가 적용됩니다. 하지만 Multiple APK는 7자리 이상의 숫자를 사용할 것을 권장한다고 합니다. 바로 아래와 같습니다.


 그림의 설명에도 있지만 API Level 2자리 코드, 가운데 2자리는 스크린 사이즈이거나 OpenGL texture 지원 포멧 형식에 따른 번호, 안드로이드 앱의 현재 앱 버전코드 3자리로 구분되어 있습니다. 위에서 제공하는 버전코드는 API 4 버전에서 동작하며 스크린사이즈가 small-normal을 지원하는 3.1 버전의 앱을 의미하게 됩니다. 버전별로 스크린사이즈를 세분화 화고 싶을 경우 위와 같이 작성합니다.   위에 작성된 코드는 하나의 예일 뿐 개발자가 직접 정의하여 사용하시면 됩니다. 난 API만 구분하고 싶어의 경우라면 2.3.3을 지원하는 버전과 그 이상의 버전을 지원하는 버전 2개로 구분하는 번호를 작성하시면 됩니다.

 17100 이라는 숫자를 예로 들면 17 버전의 API를 사용하고, 현재 앱 버전은 1.0.0 이라는 의미가 됩니다. minSdkVersion만 구분하시면 2.3.3 을 지원하는 앱과 구분이 가능하게 됩니다. 2.3.3 을 지원하는 경우는 10100 이 되겠죠?



 이 글은 APK Support에는 없지만 참고하면 좋을것 같아추가해보았습니다.

 최근 안드로이드의 해상도, 버전이 많이 추가되고 있습니다. 안드로이드에서 지원하는 해상도는 LDPI부터 XXHDPI까지 지원합니다. (XXHDPI는 최근에 추가되었지만 기존 XHDPI를 통해서도 지금은 10인치까지 지원이 되더군요) 최근에 조사한 자료에 따르면 아래 표와 같은 점유율을 가지고 있습니다. 아직 2.3.3~2.3.7 버전을 사용하는 사용자가 전체 1위에 해당됩니다. 40%가 넘게 3.0 미만의 버전을 사용하는 샘이죠.

 표는 아래 사이트에서 가져왔습니다.

 http://developer.android.com/about/dashboards/index.html?buffer_share=0df75&utm_source=buffer&utm_medium=twitter&utm_campaign=Buffer%253A%252Bkwang82%252Bon%252Btwitter

그 다음으로 JellyBean(4.1, 4.2), ICS 27.5%, Honeycomb가 0.1% 입니다.


 이번엔 적용가능한 DPI를 살펴보겠습니다. 아래와 같이 4가지 DPI 사이즈를 가지고 있습니다. 거기에 최근에 추가된 XXHDPI도 있습니다.(이 XXHDPI는 새로운 어플리케이션 생성시에 확인가능합니다.)

마무리

 수많은 플렛폼과 수많은 해상도를 지원하기 위해서 단일 APK를 통해 지원할 수있는 앱이 일반적입니다. 그렇지만 게임과 같이 고해상도의 이미지가 많은 경우에는 Multiple APK를 작성하여 구분하면 됩니다. 이렇게 Multiple APK를 지원하고 싶다면 위에서 작성한 코드네임을 주의하여 작성해야 한다고 합니다. 싱글 APK의 경우는 상관 없습니다. 테블릿과 스마트폰앱을 따로 올릴 필요가 없다는 설명을.. 최종적으로 하고^^;; 마치겠습니다. 부족한 내용이 많으니 댓글로 잘못된 부분 지적 부탁드립니다.





댓글