제한적 화면 지원 선언

모든 화면 크기와 밀도에 맞게 조정될 수 있도록 앱을 디자인하는 것이 좋지만 여전히 앱이 특정 화면 구성을 지원하지 않기를 원할 수도 있습니다. 이러한 경우 이 페이지에 설명된 대로 Android에서 앱 크기를 조절할 수 있는 정도를 제한하거나 앱을 설치할 수 있는 기기를 제한할 수도 있습니다.

앱을 특정 화면으로 제한하기 전에 여러 화면을 지원하는 모든 기법을 이해하고 최대한 구현해야 합니다.

다양한 화면에 별도의 아티팩트 게시

모든 화면 구성을 지원하는 단일 앱을 빌드하는 것이 적절하지 않은 경우 Google Play에서는 동일한 앱 등록정보의 여러 버전을 게시할 수 있습니다. 이 기능을 사용하면 Google Play 스토어에서 별도의 등록정보를 만들지 않고도 매니페스트 파일에 선언된 대로 서로 다른 화면 구성 세트를 각각 지원하는 별도의 아티팩트를 제공할 수 있습니다.

예를 들어 앱의 핸드셋 버전과 태블릿 버전을 모두 게시하려고 하지만 두 화면 크기에서 모두 작동하는 하나의 APK를 만들 수 없는 경우 동일한 앱 등록정보에 두 개의 APK를 게시할 수 있습니다. 각 기기의 화면 구성에 따라 Google Play는 각 기기의 화면 크기와 일치하는 APK를 다운로드합니다. Android App Bundle을 사용하여 게시하는 경우 제공된 APK가 화면 밀도에 맞게 자동으로 최적화됩니다. 그러나 화면 크기 타겟팅의 경우 동일한 방법을 사용해야 합니다.

자세한 내용은 다양한 화면 크기에 맞게 다중 APK 만들기를 참고하세요.

최대 가로 세로 비율 선언

최대한 많은 기기를 지원하려면 콘텐츠와 컨트롤이 표시되고 체계적으로 구성되도록 앱에서 레이아웃을 동적으로 조정해야 합니다.

또한 대부분의 앱은 사용자가 멀티 윈도우 모드에서 실행할 수 있도록 크기 조절이 가능해야 합니다. 사용자는 크기 조절이 가능한 활동을 화면 분할 모드와 자유 형식 모드에서 시작할 수 있으며 측면이나 모서리를 드래그하여 활동의 크기를 변경할 수 있습니다.

멀티 윈도우 모드는 Android 7.0 (API 수준 24) 이상에서 실행되는 모든 앱에서 사용할 수 있으며 기본적으로 앱의 크기를 조절할 수 있습니다. 전체 앱 또는 특정 활동의 android:resizeableActivity=true 속성을 명시적으로 설정할 수도 있습니다.

Android 12(API 수준 31)는 기본적으로 멀티 윈도우 모드로 설정되어 있습니다. 큰 화면(sw >= 600dp)에서는 모든 앱이 앱 구성과 관계없이 멀티 윈도우 모드로 실행됩니다. resizeableActivity="false"인 경우 앱은 디스플레이 치수를 준수하기 위해 필요한 경우 호환성 모드로 전환됩니다. 작은 화면 (sw < 600dp)에서 시스템은 활동의 minWidth, minHeight, resizeableActivity 설정을 확인하여 활동을 멀티 윈도우 모드에서 실행할 수 있는지 결정합니다. resizeableActivity="false"인 경우 활동은 활동 최소 너비 및 높이와 상관없이 멀티 윈도우 모드를 지원하지 않습니다.

API 수준 30 이하에서 앱 또는 활동을 멀티 윈도우 모드로 실행하지 않으려면 resizeableActivity=false를 설정하세요. 이 경우 앱은 항상 전체 화면으로 표시됩니다. 시스템은 Android OS 수준에 따라 실행 방식을 제어합니다.

  • 앱이 Android 8.0 (API 수준 26)~Android 11 (API 수준 30)을 타겟팅하는 경우 앱은 레이아웃에 따라 전체 화면을 채웁니다.
  • 앱이 Android 7.1 (API 수준 25) 이하를 타겟팅한다면 시스템은 앱 인터페이스의 크기를 가로세로 비율이 16:9(약 1.86)인 창으로 제한합니다. 앱이 화면 가로세로 비율이 더 큰 기기에서 실행되는 경우 화면 일부가 사용되지 않는 16:9 레터박스에 앱이 표시됩니다.

앱 레이아웃을 임의로 큰 가로세로 비율에 맞게 조정할 수 없다면 최대 가로세로 비율을 설정하여 모든 Android OS 수준에서 레터박스를 명시적으로 적용할 수 있습니다. 2.4(12:5)의 비율을 사용하는 것이 좋습니다. 앱이 지정한 것보다 가로세로 비율이 큰 기기에서 실행되면 레터박스 처리됩니다. 선택하는 값은 Wear OS 기기의 경우 1.0 이상, 다른 기기의 경우 최소 1.33이어야 합니다. 이 한도보다 더 작은 비율을 지정하면 시스템은 위에서 설명한 대로 OS 수준에 따라 앱의 가로세로 비율을 제한합니다.

Android 8.0 (API 수준 26) 이상의 최대 가로세로 비율을 설정하려면 <activity> 태그의 android:maxAspectRatio를 사용하여 최대 비율을 선언합니다. 다음 예에서는 최대 가로 세로 비율을 2.4로 선언하는 방법을 보여줍니다.

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>

Android 7.1 이하에서는 다음과 같이 android.max_aspect라는 <meta-data> 요소를 <application> 요소에 추가합니다.

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

최대 가로세로 비율을 설정하는 경우 android:resizeableActivity false도 설정해야 합니다. 그렇지 않으면 최대 가로세로 비율이 아무런 영향을 미치지 않습니다.

최대 화면 크기 선언

다양한 화면 크기를 지원하도록 앱을 완전히 최적화하지 않더라도 Android는 큰 화면에 맞게 대부분의 앱을 확장할 수 있습니다. 따라서 최대 화면 크기를 선언할 필요가 거의 없습니다.

다양한 화면 크기에 맞는 다중 APK를 만들기로 했다면 APK를 작은 화면으로만 제한할 필요가 없습니다. 대형 화면에 최적화된 APK는 versionCode가 더 커야 하므로 Google Play에서 항상 대형 화면의 기기에 APK를 제공합니다.

그러나 Android가 대형 화면에 맞게 앱 크기를 조절하는 방식이 여전히 만족스럽지 않다면 <supports-screens> 매니페스트 태그에 largestWidthLimitDp 속성을 지정하여 특정 너비를 넘는 크기 조절을 사용 중지할 수 있습니다. 그러면 레이아웃의 크기를 조절하는 대신 Android는 화면 호환 모드를 사용 설정합니다. 그러면 앱에서 지원하는 가장 큰 크기로 레이아웃을 그린 다음 모든 픽셀을 확장하여 화면을 채웁니다.

태블릿 또는 TV 전용으로 앱 제한

<supports-screens> 매니페스트 요소를 사용하여 핸드셋 기기에서 앱을 다운로드하지 못하게 할 수 있습니다.

예를 들어 다음은 대형 및 특대형 화면에서만 앱을 설치하도록 선언합니다.

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    ...
</manifest>

특정 크기 및 밀도로만 앱 제한

<compatible-screens> 매니페스트 요소를 사용하여 앱에서 지원하는 정확한 화면 크기와 밀도를 정의할 수 있습니다. 하지만 지정하지 않은 크기와 밀도의 조합은 앱이 호환되지 않는 화면 구성으로 간주되므로 이 옵션은 사용하지 않는 것이 좋습니다. 따라서 이 요소를 사용하면 앱이 실제로 지원할 수 있는 여러 기기에서 앱을 쉽게 차단할 수 있습니다.

<compatible-screens> 요소는 하나 이상의 <screen> 요소를 포함해야 합니다. 각 <screen> 요소는 android:screenSize 속성과 android:screenDensity 속성을 모두 사용하여 앱이 호환되는 화면 구성을 지정합니다. 개별 화면 구성을 지정하려면 각 <screen> 요소에 두 속성을 모두 포함해야 합니다. 두 속성 중 하나가 누락되면 요소가 무효화됩니다 (Google Play와 같은 외부 서비스에서 무시됨).

앱이 소형 및 일반 화면 크기 (및 일부 화면 밀도)와만 호환되는 경우 매니페스트 항목은 다음과 같습니다.

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

여기에 명시적으로 선언되지 않은 크기와 밀도 조합은 앱 설치가 제한됩니다.