기기 호환성 개요

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()
}

자바

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 버전을 확인하고 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()
}

자바

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가지 크기: small, normal, large, xlarge
  • 여러 일반화된 밀도: mdpi (중밀도), hdpi (고밀도), xhdpi (초고밀도), xxhdpi (초초고밀도) 등

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

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

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

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

기기 특성에 따라 앱의 사용 가능 여부를 제한하는 것 외에도 비즈니스 또는 법적 이유로 앱의 사용 가능 여부를 제한할 수도 있습니다. 이러한 상황에서 Google Play 스토어는 Play Console에서 사용자 언어 또는 무선 이동통신사와 같은 비기술적인 이유로 앱의 사용 가능 여부를 제어할 수 있는 필터링 옵션을 제공합니다.

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

추가 리소스

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