Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

제한적 화면 지원 선언

모든 화면 크기와 밀도에 맞게 앱을 디자인하도록 적극 권장하지만, 앱이 특정 화면 구성을 지원하길 원치 않을 수도 있습니다. 그런 경우, 이 페이지에 설명된 대로 Android에서 앱의 크기를 변경할 수 있는 정도, 심지어는 앱을 설치할 수 있는 기기까지도 제한할 수 있습니다.

앱을 특정 화면으로 제한하기 전에, 먼저 다중 화면을 지원하는 모든 기술을 이해해야 하며 최대한의 역량을 발휘하여 이 기술을 구현해야 합니다.

다양한 화면에 별도의 APK 게시

모든 화면 구성을 지원하는 단일 APK를 빌드하는 것이 적절치 않은 경우, Google Play는 동일한 앱 목록에 대해 여러 개의 APK를 게시할 수 있도록 허용합니다. 이 기능을 사용하면 (매니페스트 파일에 선언된 대로) Google Play 스토어에 별도의 목록을 만들지 않고도 다른 화면 구성 세트를 각각 지원하는 별도의 APK를 제공할 수 있습니다.

예를 들어, 핸드셋 버전과 태블릿 버전의 앱을 게시하기 원하지만 두 화면 크기에서 모두 작동하는 단일 APK를 만들 수 없는 경우, 동일한 앱 목록에 대해 두 개의 APK를 게시할 수 있습니다. 각 기기의 화면 구성에 따라 각 기기의 화면 크기에 맞는 APK가 다운로드됩니다.

자세한 내용은 다양한 화면 크기에 대해 다중 APK 생성을 참조하세요.

최대 화면비 선언

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

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

멀티 윈도우 모드는 Android 7.0(API 레벨 24) 이상이 실행 중인 모든 앱에서 사용 가능하며, 앱 크기는 기본적으로 변경이 가능합니다. 또한 전체 앱이나 특정 액티비티에 대해 속성 android:resizeableActivity true를 명시적으로 설정할 수 있습니다.

앱이나 액티비티가 다중 창 모드에서 실행되는 것을 원치 않으면 android:resizeableActivity false를 설정하세요. 이 경우, 앱은 언제나 전체 화면으로 나타납니다. Android OS 레벨에 따라 시스템이 다음과 같이 작동 방식을 제어합니다.

  • 앱이 Android 8.0(API 레벨 26) 이상을 대상으로 하는 경우, 레이아웃에 따라 앱이 전체 화면을 채웁니다.
  • 앱이 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) 이상의 경우 최대 화면비를 설정하려면, android:MaxAspectRatio<activity> 태그에 사용하여 최대 비율을 선언합니다. 다음 예시는 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가 앱 크기를 변경하는 방식이 여전히 불만족스러운 경우, 특정 너비를 넘어서는 크기 변경을 중지하기 위해 largestWidthLimitDp 속성을 <supports-screens> 매니페스트 태그에 지정할 수 있습니다. 그러면 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:screenSizeandroid: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>

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