기기 호환성 개요

Android는 스마트폰, 태블릿, TV 등 다양한 기기에서 실행되도록 설계되었습니다. 다양한 기기의 범위는 앱의 엄청난 잠재 잠재고객을 제공합니다. 앱이 모든 기기에서 성공하려면 기능의 가변성을 용인하고 다양한 화면 구성에 맞게 조정되는 유연한 사용자 인터페이스를 제공해야 합니다.

기기 호환성을 지원하기 위해 Android는 정적 파일에서 구성별 앱 리소스(예: 다양한 화면 크기에 맞는 다양한 XML 레이아웃)를 제공할 수 있는 동적 앱 프레임워크를 제공합니다. 그러면 Android가 현재 기기 설정에 따라 적절한 리소스를 로드합니다. 앱 디자인과 추가 앱 리소스를 고려하여 다양한 기기에서 사용자 환경을 최적화하는 단일 애플리케이션 패키지 (APK)를 게시할 수 있습니다.

그러나 필요한 경우 앱의 기능 요구사항을 지정하고 Google Play 스토어에서 앱을 설치할 수 있는 기기 유형을 제어할 수 있습니다. 이 문서에서는 앱에 액세스할 수 있는 기기를 제어하는 방법과 적절한 잠재고객에게 도달할 수 있도록 앱을 준비하는 방법을 설명합니다.

'호환성' 정의

Android 개발에는 기기 호환성앱 호환성, 두 가지 유형의 호환성이 있습니다.

Android는 오픈소스 프로젝트이므로 모든 하드웨어 제조업체에서 Android 운영체제를 실행하는 기기를 만들 수 있습니다. 하지만 Android 실행 환경용으로 작성된 앱을 올바르게 실행할 수 있는 경우에만 'Android 호환' 기기가 됩니다. Android 실행 환경의 정확한 세부정보는 Android 호환성 프로그램에 의해 정의됩니다. 각 기기는 호환성 테스트 모음(CTS)을 통과해야 호환되는 것으로 간주됩니다.

Android 호환 기기만 Google Play 스토어를 포함하므로 앱 개발자는 기기가 Android 호환 기기인지 걱정할 필요가 없습니다. 따라서 사용자가 Google Play 스토어에서 앱을 설치하는 경우 Android 호환 기기를 사용합니다.

그러나 앱이 각각의 가능한 기기 구성과 호환되는지 고려해야 합니다. Android는 다양한 기기 구성에서 실행되므로 일부 기기에서는 일부 기능을 사용할 수 없습니다. 예를 들어 일부 기기에는 나침반 센서가 포함되어 있지 않을 수 있습니다. 앱의 핵심 기능에 나침반 센서가 필요한 경우 앱은 이 기능이 포함된 기기에만 호환됩니다.

기기에 대한 앱 사용 가능 여부 제어

Android는 앱이 플랫폼 API를 통해 활용할 수 있는 다양한 기능을 지원합니다. 일부 기능은 나침반 센서와 같은 하드웨어 기반이고, 앱 위젯과 같은 소프트웨어 기반이며 플랫폼 버전에 따라 다릅니다. 모든 기기가 모든 기능을 지원하는 것은 아니므로 앱의 필수 기능에 따라 기기에 대한 앱의 사용 가능 여부를 제어해야 할 수 있습니다.

최대한 많은 앱 사용자층을 확보하려면 단일 APK 또는 AAB를 사용하여 최대한 많은 기기 구성을 지원하세요. 대부분의 경우 런타임 시 선택적 기능을 사용 중지하고 다양한 구성(예: 다양한 화면 크기에 맞는 다양한 레이아웃)의 대안으로 앱 리소스를 제공하면 됩니다. 필요한 경우 다음 기기 특성에 따라 Google Play 스토어를 통해 특정 기기에서 앱 사용 가능 여부를 제한할 수 있습니다.

기기 기능

기기 기능을 기반으로 앱의 사용 가능 여부를 관리하기 위해 Android는 일부 기기에서 사용할 수 없는 하드웨어 또는 소프트웨어 기능의 기능 ID를 정의합니다. 예를 들어 나침반 센서의 기능 ID는 FEATURE_SENSOR_COMPASS이고 앱 위젯의 기능 ID는 FEATURE_APP_WIDGETS입니다.

필요한 경우 앱의 매니페스트 파일에서 <uses-feature> 요소를 사용하여 기능을 선언하여 기기에서 필요한 기능을 제공하지 않을 때 사용자가 앱을 설치하지 못하도록 할 수 있습니다.

예를 들어 나침반 센서가 없는 기기에서 앱이 적합하지 않으면 다음 매니페스트 태그를 사용하여 나침반 센서를 요구사항으로 선언할 수 있습니다.

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

Google Play 스토어는 앱에 필요한 기능을 각 사용자 기기에서 사용할 수 있는 기능과 비교하여 앱이 각 기기와 호환되는지 확인합니다. 기기에 앱에 필요한 모든 기능이 없으면 사용자가 앱을 설치할 수 없습니다.

그러나 앱의 기본 기능에 기기 기능이 필요하지 않다면 required 속성을 "false"로 설정하고 런타임에 기기 기능을 확인합니다. 현재 기기에서 앱 기능을 사용할 수 없다면 앱 기능의 성능을 단계적으로 저하시킵니다. 예를 들어 다음과 같이 hasSystemFeature()를 호출하여 기능을 사용할 수 있는지 쿼리할 수 있습니다.

Kotlin

if (!packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature()
}

Java

PackageManager pm = getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
    // This device doesn't have a compass. Turn off the compass feature.
    disableCompassFeature();
}

Google Play 스토어를 통해 앱의 사용 가능 여부를 제어하는 데 사용할 수 있는 모든 필터에 관한 자세한 내용은 Google Play 필터 문서를 참고하세요.

플랫폼 버전

기기마다 Android 12 또는 Android 13과 같은 다양한 버전의 Android 플랫폼을 실행할 수 있습니다. 각 연속 플랫폼 버전에서는 이전 버전에서 사용할 수 없는 API를 추가하는 경우가 많습니다. 사용 가능한 API 집합을 나타내기 위해 각 플랫폼 버전은 API 수준을 지정합니다. 예를 들어 Android 12는 API 수준 31이고 Android 13은 API 수준 33입니다.

build.gradle 파일에서 minSdkVersiontargetSdkVersion 값을 지정해야 합니다.

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(30)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 30

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

build.gradle 파일에 관한 자세한 내용은 빌드 구성을 참고하세요.

연속된 각 Android 버전은 이전 플랫폼 버전의 API를 사용하여 빌드된 앱과 호환되므로 문서화된 Android API를 사용하는 동안 앱이 향후 Android 버전과 호환됩니다.

그러나 앱이 최신 플랫폼 버전에 추가된 API를 사용하지만 주요 기능에 필요하지 않은 경우 런타임에 API 수준을 확인하고 API 수준이 너무 낮으면 상응하는 기능을 단계적으로 저하시킵니다. 이 경우 minSdkVersion을 앱의 기본 기능에 가능한 가장 낮은 값으로 설정한 다음, 다음 예와 같이 현재 시스템 버전 SDK_INT을 확인하려는 API 수준에 상응하는 Build.VERSION_CODES의 코드명 상수와 비교합니다.

Kotlin

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop()
}

Java

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
    // Running on something older than API level 11, so disable
    // the drag and drop features that use ClipboardManager APIs.
    disableDragAndDrop();
}

화면 구성

Android는 스마트폰, 태블릿, TV 등 다양한 크기의 기기에서 실행됩니다. Android는 화면 유형별로 기기를 분류하기 위해 각 기기의 두 가지 특성, 즉 화면 크기 (화면의 실제 크기)와 화면 밀도(DPI라고 하는 화면 픽셀의 물리적 밀도)를 정의합니다. 다양한 구성을 단순화하기 위해 Android는 이러한 변형을 더 쉽게 타겟팅할 수 있는 그룹으로 일반화합니다.

  • 일반화된 4가지 크기: 소형, 중형, 대형, 특대형
  • 일반화된 몇 가지 밀도: mdpi (중간 밀도), hdpi (고밀도), xhdpi (초고밀도), xxhdpi (초초고밀도) 등

시스템에서 각 화면의 필요에 따라 UI 레이아웃과 이미지 리소스를 조정하므로 기본적으로 앱은 모든 화면 크기 및 밀도와 호환됩니다. 일반적인 화면 밀도에 최적화된 비트맵 이미지를 제공합니다.

유연한 레이아웃을 최대한 많이 사용하여 사용자 환경을 최적화합니다. 세로 모드 및 가로 모드와 같이 큰 구성 변경을 위한 레이아웃이 있거나 큰 창 크기와 작은 창 크기와 같은 레이아웃이 있는 경우 작은 구성 변경에 유연한 대체 레이아웃을 제공하는 것이 좋습니다. 이렇게 하면 태블릿, 스마트폰, 폴더블과 같은 폼 팩터에서 사용자 환경이 개선됩니다. 또한 멀티 윈도우 모드에서 창 크기가 변경될 때도 유용합니다.

다양한 화면에 맞는 대체 리소스를 만드는 방법과 필요한 경우 앱을 특정 화면 크기로 제한하는 방법에 관한 자세한 내용은 화면 호환성 개요대형 화면 앱 품질 가이드라인을 참고하세요.

비즈니스상의 이유로 앱 사용 가능 여부 제어

기기 특성에 따라 앱의 사용 가능 여부를 제한하는 것 외에도 비즈니스 또는 법적 이유로 앱의 가용성을 제한해야 할 수도 있습니다. 예를 들어 런던 지하철의 기차 시간표를 표시하는 앱은 영국 외 지역의 사용자에게는 유용하지 않을 수 있습니다. 이러한 유형의 상황을 위해 Google Play 스토어는 Play Console에서 사용자의 언어나 무선 이동통신사와 같은 비기술적 사유로 앱의 사용 가능 여부를 제어할 수 있는 필터링 옵션을 제공합니다.

필수 하드웨어 구성요소와 같은 기술 호환성 필터링은 항상 APK 또는 AAB 파일에 포함된 정보를 기반으로 합니다. 하지만 지리적 언어와 같은 비기술적인 이유로 필터링하는 것은 항상 Google Play Console에서 처리됩니다.

추가 리소스

앱 리소스 개요
특정 기기 구성에 관한 대체 리소스를 제공하는 방법을 포함하여 앱 코드와 앱 리소스를 분리하도록 Android 앱이 구조화되는 방식에 관한 정보입니다.
Google Play 필터
Google Play 스토어에서 앱이 여러 기기에 설치되지 않도록 하는 다양한 방법에 관한 정보입니다.
Android에서의 권한
Android가 특정 API에 대한 앱의 액세스를 제한하기 위해 권한 시스템을 사용하는 방법. 이러한 API를 사용하려면 앱이 사용자의 동의를 얻어야 합니다.