APK를 업로드하는 경우 Google Play의 대상 API 수준 요구사항을 충족해야 합니다.
2024년 8월 31일부터 다음과 같습니다.
- 새 앱과 앱 업데이트는 Google Play에 제출하려면 Android 14 (API 수준 34) 이상을 타겟팅해야 합니다. 단, Android 13 (API 수준 33) 이상을 타겟팅해야 하는 Wear OS 및 Android TV 앱은 예외입니다.
- 기존 앱이 Android 13 (API 수준 33) 이상을 타겟팅해야 앱의 대상 API 수준보다 상위 버전의 Android OS를 실행하는 기기에서 신규 사용자가 계속 사용할 수 있습니다. Android 12 (API 수준 31) 이하 (Wear OS의 경우 Android 10 (API 수준 29) 이하, Android TV의 경우 Android 11 (API 수준 30) 이하)를 타겟팅하는 앱은 앱의 대상 API 수준과 같거나 낮은 Android OS를 실행하는 기기에서만 사용할 수 있습니다.
앱을 업데이트하기 위해 시간이 더 필요한 경우 2024년 11월 1일까지 연장을 요청할 수 있습니다. 올해 말에는 Play Console에서 앱의 기한 연장 요청 양식을 이용할 수 있게 됩니다.
이러한 요구사항에 대한 예외는 다음과 같습니다.
- 특정 조직의 사용자로 제한되며 내부 배포용으로만 사용되는 영구 비공개 앱
- Android Automotive OS를 타겟팅하는 앱 또는 Android Automotive OS를 타겟팅하는 APK로 패키징된 앱입니다.
최신 SDK를 타겟팅해야 하는 이유
새로운 Android 버전이 출시될 때마다 보안 및 성능이 개선되며 Android 사용자 환경이 향상됩니다. 이러한 변경사항 중 일부는 targetSdkVersion
매니페스트 속성 (타겟 API 수준이라고도 함)을 통해 지원을 명시적으로 선언한 앱에만 적용됩니다.
최신 API 수준을 타겟팅하도록 앱을 구성하면 사용자가 이러한 개선사항의 이점을 누릴 수 있으며, 이전 Android 버전에서도 계속해서 앱을 실행할 수 있습니다. 최신 API 수준을 타겟팅하면 앱에서 플랫폼의 최신 기능을 활용해 사용자 환경을 개선할 수 있습니다. 또한 Android 10 (API 수준 29)부터 앱에서 Android 5.1 (API 수준 22) 이하를 타겟팅하는 경우 사용자가 처음으로 앱을 시작할 때 경고가 표시됩니다.
이 문서에서는 Google Play 요구사항을 충족하기 위해 대상 API 수준을 업데이트할 때 알아 두어야 하는 중요한 사항에 관해 다룹니다. 이전할 버전에 따라 다음 섹션의 안내를 참고하세요.
Android 12 이상 (API 수준 31)에서 최신 버전으로 이전
최신 버전의 Android를 타겟팅하도록 앱을 업데이트하려면 관련 동작 변경사항 목록을 따르세요.
Android 11(API 수준 30)에서 Android 12(API 수준 31)로 이전
보안 및 권한
- 블루투스:
BLUETOOTH
및BLUETOOTH_ADMIN
권한의 선언을BLUETOOTH_SCAN
,BLUETOOTH_ADVERTISE
또는BLUETOOTH_CONNECT
권한으로 바꾸어야 합니다. 블루투스 작업을 위해 더 이상LOCATION
런타임 권한을 요청할 필요가 없습니다. - 위치: 사용자는 앱이 대략적인 위치 정보만 가져오도록 요청할 수 있습니다.
ACCESS_FINE_LOCATION
를 요청할 때마다ACCESS_COARSE_LOCATION
권한을 요청해야 합니다.- 인텐트 필터: 앱에 인텐트 필터를 사용하는 활동, 서비스 또는 broadcast receiver가 포함되어 있다면 이러한 구성요소의 android:exported 속성을 명시적으로 선언해야 합니다.
- 최대 절전 모드: 앱이 일정 기간 동안 사용되지 않으면 최대 절전 모드로 전환될 수 있습니다. 최대 절전 모드에서는 앱의 런타임 권한과 캐시가 재설정되며 작업 또는 알림을 실행할 수 없습니다. 앱의 최대 절전 모드 상태를 확인할 수 있습니다.
- 대기 중인 인텐트 변경 가능 여부: 앱에서 만드는 각 PendingIntent 객체의 변경 가능 여부를 지정해야 합니다.
사용자 환경
- 맞춤 알림: 맞춤 콘텐츠 뷰가 있는 알림은 더 이상 전체 알림 영역을 사용하지 않습니다. 대신 시스템에서 표준 템플릿을 적용합니다. 이 템플릿은 맞춤 알림이 모든 상태에서 다른 알림과 동일한 장식을 보유하도록 합니다. 이 동작은
Notification.DecoratedCustomViewStyle
의 동작과 거의 동일합니다. - Android App Links 인증 변경사항: Android App Links 인증을 사용하는 경우 인텐트 필터가 BROWSABLE 카테고리를 포함하고 HTTPS 스키마를 지원하는지 확인하세요.
성능
포그라운드 서비스 실행 제한: Android 12 이상을 타겟팅하려면 앱이 몇 가지 특별한 사례를 제외하고 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작할 수 없습니다. 앱이 백그라운드에서 실행되는 동안 포그라운드 서비스를 시작하려고 하면 예외가 발생합니다(특별한 사례 제외).
앱이 백그라운드에서 실행되는 동안 WorkManager를 사용하여 신속 처리 작업을 예약하고 시작해 보세요. 신속히 처리해야 하는 사용자 요청 작업을 완료하려면 정확한 알람 내에서 포그라운드 서비스를 시작하세요.
알림 트램펄린 제한사항: 사용자가 알림을 탭하면 일부 앱은 사용자가 보고 상호작용할 수 있는 활동을 시작하는 앱 구성요소를 실행하여 응답합니다. 이 앱 구성요소를 알림 트램펄린이라고 합니다.
앱은 알림 트램펄린으로 사용되는 서비스나 broadcast receiver에서 활동을 시작해서는 안 됩니다. 사용자가 알림 또는 알림의 작업 버튼을 탭하면 앱이 서비스나 broadcast receiver 내부에서
startActivity()
를 호출할 수 없습니다.
Android 12 (API 수준 31)를 타겟팅하는 앱에 영향을 주는 변경사항을 모두 살펴보세요.
Android 11 (API 수준 30) 미만에서 이전
이전할 Android 버전을 선택하세요.
Android 5(API 수준 21)로 이전
아래 버전에서 도입된 변경사항이 앱에 적용되었는지 확인하려면 각 버전별 동작 변경사항 페이지를 참고하세요.
다음 섹션의 안내를 따라 계속하세요.
Android 6(API 수준 23)으로 이전
다음 항목은 Android 6.0 이상 버전을 타겟팅하는 앱에 적용됩니다.
-
-
위험한 권한은 런타임에만 부여되기 때문에 UI 흐름에 이러한 권한을 부여할 여유가 확보되어야 합니다.
-
가능한 경우 앱에서 권한 요청 거부를 처리할 준비가 되어 있어야 합니다. 예를 들어 사용자가 기기 GPS 액세스 권한 요청을 거부하면 앱에서 다른 방법으로 진행할 수 있어야 합니다.
-
Android 6.0(API 수준 23)에서 도입된 변경사항의 전체 목록을 확인하려면 해당하는 버전의 Android를 다루는 동작 변경사항 페이지를 참고하세요.
다음 섹션의 안내를 따라 계속하세요.
Android 7(API 수준 24)로 이전
다음 항목은 Android 7.0 이상 버전을 타겟팅하는 앱에 적용됩니다.
-
잠자기 및 앱 대기
잠자기 및 앱 대기 최적화에 설명되어 있는 동작을 고려하여 설계합니다. 여기에는 여러 차례의 플랫폼 출시를 통해 도입된 점진적인 변경사항이 모두 포함됩니다.
기기가 잠자기 및 앱 대기 모드일 때, 시스템은 다음과 같이 작동합니다.
- 네트워크 액세스를 제한합니다.
- 알람, 동기화, 작업을 연기합니다.
- GPS 및 Wi-Fi 검색을 제한합니다.
- 일반적인 우선순위를 갖는 Firebase 클라우드 메시징 메시지를 제한합니다.
-
권한 변경사항
- 시스템에서 앱 비공개 디렉터리 액세스를 제한합니다.
-
앱 외부에
file://
URI를 노출하면FileUriExposedException
이 트리거됩니다. 앱 외부로 파일을 공유해야 하는 경우FileProvider
를 구현합니다.
-
시스템에서 NDK가 아닌 라이브러리로의 링크를 금지합니다.
Android 7.0(API 수준 24)에서 도입된 변경사항의 전체 목록을 확인하려면 해당하는 버전의 Android를 다루는 동작 변경사항 페이지를 참고하세요.
다음 섹션의 안내를 따라 계속하세요.
Android 8(API 수준 26)로 이전
다음 항목은 Android 8.0 이상 버전을 타겟팅하는 앱에 적용됩니다.
- 백그라운드 실행 제한
- 포그라운드에서 실행되지 않는 앱을 대상으로 한 서비스를 시스템에서 제한합니다.
startService()
가 금지된 상태에서 앱이startService()
를 호출하려고 하면 예외가 발생합니다.- 포그라운드 서비스를 시작하려는 앱은
startForeground()
및startForegroundService()
를 사용해야 합니다. - JobScheduler API의 변경사항을 신중하게 검토하시기 바랍니다. 이는 Android 8.0(API 수준 26) 동작 변경사항 페이지에 설명되어 있습니다.
- Firebase 클라우드 메시징을 사용하려면 Google Play 서비스 SDK의 버전 10.2.1 이상이 필요합니다.
- Firebase 클라우드 메시징을 사용할 때 메시지 전달이 백그라운드 실행 제한의 영향을 받습니다. 메시지 수신 시 백그라운드 작업이 필요한 경우(예: 백그라운드 데이터 동기화 수행) 앱에서는 Firebase Job Dispatcher 또는 JobIntentService를 대신 사용하여 작업을 예약해야 합니다. 자세한 내용은 Firebase 클라우드 메시징 문서를 참고하세요.
-
암시적 브로드캐스트
-
암시적 브로드캐스트가 제한됩니다. 백그라운드 이벤트 처리에 관한 자세한 내용은
JobScheduler
API 문서를 참고하세요.
-
암시적 브로드캐스트가 제한됩니다. 백그라운드 이벤트 처리에 관한 자세한 내용은
- 백그라운드 위치 액세스 제한
- 백그라운드에서 실행되는 앱의 위치 데이터 액세스가 제한됩니다.
- Google Play 서비스가 지원되는 기기에서는 통합 위치 정보 제공자를 통해 정기적으로 위치 업데이트를 받습니다.
- 백그라운드에서 실행되는 앱의 위치 데이터 액세스가 제한됩니다.
- 포그라운드에서 실행되지 않는 앱을 대상으로 한 서비스를 시스템에서 제한합니다.
- 알림 채널
- 채널별로 알림 방해 속성을 정의해야 합니다.
- 알림을 표시하려면 채널에 알림을 할당해야 합니다.
- 이 플랫폼 버전에서는
NotificationCompat.Builder
를 지원합니다.
- 개인 정보 보호
- ANDROID_ID는 앱 서명 키별로 범위가 지정됩니다.
Android 8.0(API 수준 26)에서 도입된 변경사항의 전체 목록을 확인하려면 해당하는 버전의 Android를 다루는 동작 변경사항 페이지를 참고하세요.
Android 8 (API 26)에서 Android 9 (API 28)로 이전
- 전원 관리
- 포그라운드 서비스 권한
- 일반 권한
FOREGROUND_SERVICE
(런타임 권한 아님)를 요청해야 합니다.
- 일반 권한
- 개인 정보 보호 변경사항
- 백그라운드 센서 액세스 제한
- 통화 기록 액세스가 제한되며 이제
CALL_LOG
권한 그룹에 포함됩니다. - 전화번호 액세스가 제한되며
READ_CALL_LOG
권한을 요청합니다. - Wi-Fi 정보 액세스 제한
Android 9.0(API 수준 28)에 도입된 변경사항의 전체 목록을 확인하려면 동작 변경사항을 참고하세요.
Android 9 (API 수준 28)에서 Android 10 (API 수준 29)으로 이전
-
전체 화면 인텐트가 있는 알림
-
일반 권한
USE_FULL_SCREEN_INTENT
(런타임 권한 아님)를 요청해야 합니다.
-
일반 권한
- 폴더블 및 큰 화면 기기 지원
-
이제 여러 활동이 동시에 '재개됨' 상태에 있을 수 있지만, 실제로 하나의 활동에만 포커스가 있습니다.
- 이 변경사항은
onResume()
및onPause()
동작에 영향을 미칩니다. onTopResumedActivityChanged()
를 구독하여 감지할 수 있는 '최상위 재개'라는 새로운 수명 주기 개념- 하나의 활동만 '최상위 재개'될 수 있습니다.
- 이 변경사항은
resizeableActivity
를false
로 설정하면 자동으로 앱을 더 좁은 가로세로 비율로 레터박스 처리하는minAspectRatio
를 앱에서 추가로 지정할 수 있습니다.
-
이제 여러 활동이 동시에 '재개됨' 상태에 있을 수 있지만, 실제로 하나의 활동에만 포커스가 있습니다.
- 개인 정보 보호 변경사항
- 범위 지정 저장소
- 외부 저장소 액세스는 앱별 디렉터리 및 앱에서 만든 특정 미디어 유형으로만 제한됩니다.
- 앱이 백그라운드에 있는 동안 위치 액세스가 제한되며
ACCESS_BACKGROUND_LOCATION
권한이 필요합니다. - IMEI 및 일련번호와 같이 재설정할 수 없는 식별자 액세스가 제한됩니다.
- 사용자의 걸음 수와 같은 신체 활동 정보 액세스가 제한되며
ACTIVITY_RECOGNITION
권한이 필요합니다. -
일부 텔레포니, 블루투스, Wi-Fi API 액세스가 제한되며
ACCESS_FINE_LOCATION
권한을 요청합니다. - Wi-Fi 설정 액세스 제한
- 앱에서는 더 이상 Wi-Fi를 직접 사용 설정 또는 사용 중지할 수 없으며 설정 패널을 사용해야 합니다.
- Wi-Fi 네트워크 연결 시작 시 제한사항으로
WifiNetworkSpecifier
또는WifiNetworkSuggestion
을 사용해야 합니다.
- 범위 지정 저장소
Android 10(API 수준 29)에서 Android 11(API 수준 30)로 이전
-
개인 정보 보호
- 범위 지정 저장소 적용: 앱에서 전용 위치를 사용하여 앱 관련 파일 형식, 미디어 파일 형식, 기타 파일 형식을 저장하고 액세스하는 범위 지정 저장소 모델을 채택해야 합니다.
- 권한 자동 초기화: 사용자가 몇 개월 동안 앱과 상호작용하지 않았다면 시스템에서 앱의 민감한 권한을 자동으로 초기화합니다. 이는 대부분 앱에 영향을 미치지 않습니다. 앱이 주로 사용자 상호작용 없이 백그라운드에서 작동한다면 사용자에게 자동 재설정을 사용 중지하도록 요청할 수 있습니다.
- 백그라운드 위치 정보 액세스: 앱에서 포그라운드와 백그라운드 위치 정보 액세스 권한을 별도로 요청해야 합니다. 런타임 권한 대화상자가 아닌 앱 설정에서만 백그라운드 위치 액세스 권한을 부여할 수 있습니다.
-
패키지 공개 상태: 앱이 기기에 설치된 앱과 서비스 목록을 쿼리하면 반환된 목록이 필터링됩니다.
- TTS(텍스트 음성 변환) 또는 음성 인식 서비스를 사용하면 서비스를 위해 쿼리 요소를 매니페스트 파일에 추가해야 합니다.
-
보안
- 압축된 `resource.arsc` 파일이 더 이상 지원되지 않음
- 이제 APK 서명 체계 v2가 필요합니다. 이전 버전과의 호환성을 위해 개발자는 계속 APK 서명 체계 v1로 서명해야 합니다.
- 비 SDK 인터페이스 관련 제한사항이 있습니다. 현재 비 SDK 인터페이스의 일부가 차단되어 있으므로 API 수준 30을 타겟팅하는 앱에는 비 SDK 인터페이스를 사용하지 않는 것이 좋습니다. 차단된 비 SDK 인터페이스의 전체 목록은 Android 11에서 차단된 비 SDK 인터페이스를 참고하세요.
Android 11 (API 수준 30)에서 도입된 변경사항의 전체 목록을 확인하려면 동작 변경사항 페이지를 참고하세요.
이전 섹션의 안내를 따라 API 31로 계속 업데이트합니다.
앱 현대화
앱의 대상 API 수준을 업데이트하면서 Android의 최신 기능을 도입하여 앱을 현대화하고 사용자 환경을 개선할 방법이 있는지 생각해 보세요.
- 베타 버전인 CameraX를 사용하여 카메라를 최대한 활용하세요.
- Jetpack 구성요소를 통해 권장사항을 따르고, 상용구 코드 작성 작업에서 벗어나며, 복잡한 작업을 간소화하여 중요한 코드에만 집중할 수 있습니다.
- Kotlin을 사용하면 더 적은 코드로 더 빠르게 더 나은 앱을 작성할 수 있습니다.
- 개인정보 보호 요구사항 및 권장사항을 준수해야 합니다.
- 앱에 어두운 테마 지원을 추가하세요.
- 앱에 동작 탐색 지원을 추가하세요.
- Google 클라우드 메시징 (GCM)에서 최신 버전의 Firebase 클라우드 메시징으로 앱을 이전하세요.
- 고급 창 관리를 활용합니다.
- 16:9보다 큰 가로세로 비율을 지원하여 최신 하드웨어 기술을 활용하세요. 사용 가능한 화면 공간이 꽉 채워지도록 앱 크기가 조정되는지 확인하세요. 최대 가로세로 비율 선언은 최후의 수단으로만 사용하세요. 최대 가로세로 비율에 관한 자세한 내용은 제한적 화면 지원 선언을 참고하세요.
- 멀티 윈도우 지원을 추가하여 앱의 생산성을 높이고 여러 가지 디스플레이를 관리하세요.
- 최소화된 앱 환경으로 사용자 환경이 개선되는 경우 PIP 모드 지원을 추가하세요.
- 디스플레이 컷아웃이 있는 기기에 맞게 최적화하세요.
- 상태 표시줄의 높이를 짐작하는 대신
WindowInsets
및View.OnApplyWindowInsetsListener
를 사용하세요. 자세한 내용은 droidcon NYC 2017 동영상을 참조하세요. - 앱에 전체 창이 있다고 가정하지 않습니다. 대신
View.getLocationOnScreen()
이 아닌View.getLocationInWindow()
를 사용하여 창 위치를 확인합니다. *MotionEvent
를 처리할 때는MotionEvent.getRawX()
,MotionEvent.getRawY()
이 아닌MotionEvent.getX()
및MotionEvent.getY()
를 사용하세요.
SDK 및 라이브러리 확인 및 업데이트
서드 파티 SDK 종속 항목이 API 31을 지원하는지 확인하세요. 일부 SDK 제공업체는 종속 항목을 매니페스트에 게시하며 추가적인 조사를 요구하는 곳도 있습니다. API 31을 지원하지 않는 SDK를 사용하는 경우 우선 SDK 제공업체와 함께 문제를 해결해야 합니다.
또한 앱이나 게임의 targetSdkVersion
이 비공개 Android 플랫폼 라이브러리 액세스를 제한할 수 있습니다. 자세한 내용은 플랫폼 라이브러리에 연결되는 NDK 앱을 참고하세요.
사용 중인 Android 지원 라이브러리 버전에 있을 수 있는 모든 제한사항도 확인해야 합니다. 항상 Android 지원 라이브러리의 주요 버전과 앱의 compileSdkVersion
이 호환되는지 확인해야 합니다.
지원 라이브러리의 주요 버전 이하의 targetSdkVersion
을 선택하는 것이 좋습니다. 최신 호환 기능 및 버그 수정을 활용하려면
호환되는 최신 지원 라이브러리로 업데이트하는 것이
좋습니다.
앱 테스트
앱의 API 수준과 기능을 적절하게 업데이트한 후에는 몇 가지 핵심 사용 사례를 테스트해야 합니다. 다음 제안사항에 전체 내용이 포함된 것은 아니지만, 테스트 프로세스의 길잡이로 삼기에 좋습니다. 테스트에서 다음 항목을 확인하시기 바랍니다.
- 앱이 오류나 경고 없이 API 29로 컴파일됩니다.
앱이 사용자가 권한 요청을 거부하는 경우를 대비한 전략을 갖추고 있으며 사용자에게 권한 요청 메시지를 표시합니다. 방법은 다음과 같습니다.
- 앱의 앱 정보 화면으로 이동하여 각 권한을 사용 중지합니다.
- 앱을 열고 비정상 종료가 발생하지 않는지 확인합니다.
- 핵심 사용 사례 테스트를 실행하고 필수 권한이 다시 표시되는지 확인합니다.
잠자기가 예상대로 동작하고 오류가 발생하지 않습니다.
- adb를 사용하여 앱이 실행되고 있을 때 테스트 기기를 잠자기로 설정합니다.
- Firebase 클라우드 메시징 메시지를 트리거하는 사용 사례를 테스트합니다.
- 알람 또는 작업을 사용하는 사용 사례를 테스트합니다.
- 백그라운드 서비스의 종속 항목을 제거합니다.
- 앱을 앱 대기 모드로 설정합니다.
- Firebase 클라우드 메시징 메시지를 트리거하는 사용 사례를 테스트합니다.
- 알람을 사용하는 사용 사례를 테스트합니다.
- adb를 사용하여 앱이 실행되고 있을 때 테스트 기기를 잠자기로 설정합니다.
새로운 사진/동영상 촬영이 정상적으로 처리됩니다.
- 앱에서 제한된
ACTION_NEW_PICTURE
및ACTION_NEW_VIDEO
브로드캐스트를 제대로 처리하는지 확인합니다 (JobScheduler 작업으로 이동). - 이러한 이벤트에 의존하는 주요 사용 사례가 여전히 작동하는지 확인합니다.
- 앱에서 제한된
다른 앱과의 파일 공유 처리 - 다른 앱과 파일 데이터를 공유하는 사용 사례를 테스트합니다. 이는 같은 개발자의 다른 앱이더라도 마찬가지입니다.
- 다른 앱에 콘텐츠가 표시되고 비정상 종료가 트리거되지 않는지 테스트합니다.
추가 정보
Google에서 월간 파트너 뉴스레터를 비롯한 Android 및 Google Play의 중요한 소식과 공지사항을 보내 드릴 수 있도록 Google Play Console에서 이메일 수신에 동의하세요.