다양한 GL 텍스처를 위한 다중 APK 만들기

앱을 Google Play에 게시하면 Android App Bundle을 빌드하고 업로드해야 합니다. 이렇게 하면 Google Play에서 각 사용자의 기기 설정에 최적화된 APK를 자동으로 생성하여 제공하므로 사용자는 앱을 실행하는 데 필요한 코드와 리소스만 다운로드하면 됩니다. Google Play에 게시하지 않는다면 다중 APK 게시가 유용하지만 각 APK를 직접 빌드, 서명 및 관리해야 합니다.

Google Play에서 다중 APK를 활용하기 위해 Android 애플리케이션을 개발할 때는 처음부터 권장사항을 적용하고 개발 과정에서 발생하는 불필요한 문제를 방지하는 것이 중요합니다. 이 과정에서는 각각 다양한 OpenGL 텍스처 형식의 하위 집합을 지원하는 앱의 다중 APK를 만드는 방법을 보여줍니다. 다중 APK 코드베이스를 최대한 쉽게 유지하는 데 필요한 도구도 제공합니다.

다중 APK가 필요한지 확인

사용 가능한 모든 Android 지원 기기에서 작동하는 애플리케이션을 만들려고 하는 경우, 기기에서 모두 동일한 GL 텍스처 집합을 지원하지는 않더라도 각 기기에서 최상의 상태로 표시되도록 하기를 원합니다. 처음에는 다중 APK 지원이 최상의 솔루션인 듯 보이지만 그렇지 않은 경우가 많습니다. 다중 APK 개발자 가이드의 단일 APK 대신 사용 섹션에는 런타임 시 지원되는 텍스처 형식을 감지하는 방법을 포함하여 단일 APK로 이를 달성하는 방법에 관한 유용한 정보가 포함되어 있습니다. 상황에 따라 애플리케이션에 모든 형식을 번들로 묶고 런타임 시 사용할 형식을 간단히 선택하는 것이 더 쉬울 수 있습니다.

관리 가능한 경우 애플리케이션을 단일 APK에 제한하면 다음과 같은 여러 이점이 있습니다.

  • 더욱 쉽게 게시하고 테스트할 수 있습니다.
  • 코드베이스를 하나만 유지 관리하면 됩니다.
  • 애플리케이션을 기기 설정 변경에 맞게 조정할 수 있습니다.
  • 여러 기기에서 앱 복원을 쉽게 할 수 있습니다.
  • 시장 선호도나 APK 간 '업그레이드'에 따른 동작 또는 어떤 기기 클래스에 어떤 APK가 사용되는지 걱정할 필요가 없습니다.

이 과정의 나머지 부분에서는 개발자가 주제를 조사하고, 연결된 리소스의 자료를 철저히 습득했으며, 다중 APK가 애플리케이션에 적합한 경로라고 판단했다고 가정합니다.

요구사항 차트

Android 개발자 가이드에서는 support-gl-texture 페이지에서 일반적으로 지원되는 텍스처를 편리하게 참조할 수 있습니다. 이 페이지에는 어떤 휴대전화 (또는 휴대전화 제품군)가 특정 텍스처 형식을 지원하는지에 관한 힌트도 포함되어 있습니다. 텍스처 형식은 OpenGL ES 2.0 사양을 지원하는 모든 Android 지원 기기에서 지원되므로 일반적으로 APK 중 하나에서 EC1을 지원하는 것이 좋습니다.

대부분의 Android 지원 기기는 두 개 이상의 텍스처 형식을 지원하므로 선호도 순서를 설정해야 합니다. 애플리케이션에서 지원할 모든 형식이 포함된 차트를 만듭니다. 맨 왼쪽 셀이 가장 낮은 우선순위가 됩니다 (성능 및 호환성 측면에서 매우 견고한 기본값인 ETC1일 가능성이 높음). 그런 다음 각 셀이 APK를 나타내도록 차트에 색상을 지정합니다.

ETC1 ATI PowerVR

차트에 색상을 지정하면 이 가이드의 단색이 덜 색이 됩니다. 또한 팀 내 소통도 쉬워집니다. 이제 각 APK를 'ETC1 텍스처 형식을 지원하는 것' 등 대신 '파란색', '녹색' 또는 '빨간색'으로 간단히 지칭할 수 있습니다.

라이브러리 프로젝트에 모든 공통 코드 및 리소스 배치

이는 기존 Android 애플리케이션을 수정하거나 처음부터 시작할 때 코드베이스에 가장 먼저 해야 할 일이며 가장 중요한 작업입니다. 라이브러리 프로젝트에 들어가는 모든 내용은 한 번만 업데이트하면 됩니다 (언어 현지화 문자열, 색상 테마, 공유 코드에서 수정된 버그).

참고: 라이브러리 프로젝트를 만들고 포함하는 방법의 구현 세부정보는 이 과정의 범위를 벗어나지만 Android 라이브러리 만들기를 참고하여 자세히 알아볼 수 있습니다.

다중 APK 지원을 사용하도록 기존 애플리케이션을 변환하는 경우 모든 현지화된 문자열 파일, 값 목록, 테마 색상, 메뉴 아이콘, APK 간에 변경되지 않는 레이아웃의 코드베이스를 검색하고 모두 라이브러리 프로젝트에 넣습니다. 많이 변경되지 않는 코드도 라이브러리 프로젝트에 들어가야 합니다. 이러한 클래스를 확장하여 APK에서 APK로 한두 개의 메서드를 추가하게 될 것입니다.

반면 처음부터 애플리케이션을 만드는 경우 먼저 라이브러리 프로젝트에 가능한 한 많은 코드를 작성하고 필요한 경우에만 개별 APK로 내려갑니다. 이는 blob을 하나씩 추가하고 몇 개월 후에 이 blob을 문제없이 라이브러리 섹션으로 이동할 수 있는지 파악하는 것보다 장기적으로 관리하기 훨씬 쉽습니다.

새로운 APK 프로젝트 만들기

출시할 각 APK에는 별도의 Android 프로젝트가 있어야 합니다. 쉽게 구성하려면 라이브러리 프로젝트와 모든 관련 APK 프로젝트를 동일한 상위 폴더에 배치합니다. 또한 각 APK는 패키지 이름을 가져야 하지만 패키지 이름을 반드시 라이브러리와 공유할 필요는 없습니다. 앞서 설명한 스키마에 따라 APK가 3개 있다면 루트 디렉터리는 다음과 같을 수 있습니다.

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

프로젝트가 만들어지면 라이브러리 프로젝트를 각 APK 프로젝트의 참조로 추가하세요. 가능하면 라이브러리 프로젝트에서 시작 활동을 정의하고 APK 프로젝트에서 이 활동을 확장합니다. 라이브러리 프로젝트에 시작 활동을 정의하면 모든 애플리케이션 초기화를 한곳에 배치할 수 있으므로 각 개별 APK가 애널리틱스 초기화, 라이선스 확인 실행, APK에서 APK로 많이 변경되지 않는 기타 초기화 절차와 같은 '범용' 작업을 다시 구현할 필요가 없습니다.

매니페스트 조정

사용자가 Google Play에서 다중 APK를 사용하는 애플리케이션을 다운로드하면 몇 가지 간단한 규칙에 따라 사용할 올바른 APK가 선택됩니다.

  • manifest는 특정 APK가 적합하다고 표시해야 합니다.
  • 적합한 APK 중에 가장 높은 버전 번호가 우선됩니다.
  • APK에 나열된 텍스처 형식 중 하나라도 시중의 기기에서 지원되는 경우 해당 기기는 자격을 충족하는 것으로 간주됩니다.

GL 텍스처와 관련하여 이 마지막 규칙이 중요합니다. 예를 들어 동일한 애플리케이션에서 다른 GL 형식을 사용할 때는 매우 주의해야 합니다. PowerVR을 99% 까지 사용했지만 스플래시 화면에 ETC1을 사용했다면... 그러면 매니페스트가 두 형식 모두의 지원을 표시합니다. ETC1 지원하는 기기는 호환되는 것으로 간주되어 앱이 다운로드되며 사용자에게는 짜릿한 비정상 종료 메시지가 표시됩니다. 일반적인 사례는 여러 APK를 사용하여 특히 GL 텍스처 지원에 따라 다양한 기기를 타겟팅하는 경우 APK당 하나의 텍스처 형식이 되는 것입니다.

실제로 텍스처 지원이 다른 두 개의 다중 APK 크기인 API 수준 및 화면 크기와 약간 다릅니다. 주어진 기기에는 API 수준과 화면 크기가 하나만 있으며 이러한 기기의 범위를 지원하는 것은 APK에 달려 있습니다. 텍스처의 경우 APK는 일반적으로 하나의 텍스처를 지원하고 기기는 여러 텍스처를 지원합니다. 하나의 기기가 여러 APK를 지원하는 측면에서 중복되는 경우가 많지만 솔루션은 동일합니다. 바로 버전 코드입니다.

예를 들어 몇 가지 기기의 경우 앞서 정의된 APK 중 몇 개가 각 기기에 적합한지 확인해 보세요.

FooPhone Nexus S Evo
ETC1 ETC1 ETC1
PowerVR ATI TC

사용 가능한 경우 ETC1보다 PowerVR 및 ATI 형식이 모두 선호된다고 가정할 때 '가장 높은 버전 번호가 우선된다' 규칙에 따르는 것보다 각 APK의 versionCode 속성을 빨간색 ≥ 녹색 ≥ 파란색과 같이 설정하면 빨간색과 녹색이 항상 파란색보다 파란색보다 선택되며 빨간색과 녹색을 모두 지원하는 기기가 함께 제공되는 경우 빨간색이 선택됩니다.

모든 APK를 별도의 '트랙'에 유지하려면 적절한 버전 코드 체계가 있어야 합니다. 개발자 가이드의 버전 코드 영역에서 권장사항을 확인할 수 있습니다. 예시 APK 집합은 가능한 3가지 측정기준 중 하나만 다루기 때문에 각 APK를 1, 000으로 구분하고 거기서부터 증분하는 것으로 충분합니다. 다음과 같습니다.

파란색: 1001, 1002, 1003, 1004...
녹색: 2001, 2002, 2003, 2004...
빨간색:3001, 3002, 3003, 3004...

종합하면 Android 매니페스트는 다음과 유사합니다.

파란색:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

녹색:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

빨간색:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

출시 전 체크리스트 검토

Google Play에 업로드하기 전에 다음 항목을 다시 확인하세요. 이는 특히 다중 APK와 관련이 있으며 Google Play에 업로드되는 모든 애플리케이션의 전체 체크리스트를 나타내는 것은 아닙니다.

  • 모든 APK의 패키지 이름은 동일해야 합니다.
  • 모든 APK는 동일한 인증서로 서명되어야 합니다.
  • 충돌하는 정보가 있는지 매니페스트 필터를 다시 확인하세요. 특대형 화면에서 Cupcake만 지원하는 APK는 누구에게도 표시되지 않습니다.
  • 각 APK의 매니페스트는 지원되는 화면이나 OpenGL 텍스처, 플랫폼 버전 중 하나 이상에서 고유해야 합니다.
  • 하나 이상의 기기에서 각 APK를 테스트해 봅니다. 이 테스트만 제외하면 업계에서 가장 맞춤설정 가능한 기기 에뮬레이터 중 하나가 개발 머신에 있습니다. 맘껏 활용하세요.

또한 시장에 출시하기 전에 컴파일된 APK를 검사하여 Google Play에서 애플리케이션을 숨길 수 있는 예상치 못한 문제가 없는지 확인하는 것이 좋습니다. 실제로 'aapt' 도구를 사용하는 것은 매우 간단합니다. Aapt (Android Asset Packaging Tool)는 Android 애플리케이션을 만들고 패키징하는 빌드 프로세스의 일부이며 Android 애플리케이션을 검사하는 매우 편리한 도구이기도 합니다.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

aapt 출력을 검사할 때 supports-screens 및compatible-screens에 충돌하는 값이 없는지, 매니페스트에서 설정한 권한으로 인해 추가된 의도하지 않은 'uses-feature' 값이 없는지 확인해야 합니다. 위의 예에서 APK는 모든 기기가 아닌 대부분의 기기에 표시되지 않습니다.

이유가 무엇인가요? 필수 권한 SEND_SMS를 추가하면서 android.hardware.telephony의 기능 요구사항이 암시적으로 추가되었기 때문입니다. 대부분의 특대형 기기는 텔레포니 하드웨어가 없는 태블릿이므로 Google Play에서 이러한 경우 특대형 화면 크기로 보고되고 텔레포니 하드웨어를 보유할 만큼 큰 기기가 나올 때까지 이 APK를 필터링합니다.

다행히 매니페스트에 다음을 추가하여 이 문제를 쉽게 해결할 수 있습니다.

<uses-feature android:name="android.hardware.telephony" android:required="false" />

android.hardware.touchscreen 요구사항도 암시적으로 추가됩니다. APK를 터치스크린이 아닌 TV에 표시하려면 매니페스트에 다음을 추가해야 합니다.

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

출시 전 체크리스트를 완료했다면 Google Play에 APK를 업로드하세요. Google Play를 탐색할 때 애플리케이션이 표시되는 데 약간의 시간이 걸릴 수 있지만 표시되면 마지막으로 한 번 확인합니다. 보유한 테스트 기기에 애플리케이션을 다운로드하여 APK가 의도한 기기를 타겟팅하고 있는지 확인합니다. 축하합니다. 모든 단계를 마쳤습니다.