APK를 업로드하는 경우 Google Play의 타겟 API 수준 요구사항을 충족해야 합니다. 새 앱과 앱 업데이트는 Android 10(API 수준 29) 이상을 타겟팅해야 합니다. 단, Wear OS 앱은 API 수준 28 이상을 타겟팅해야 합니다.
2021년 8월부터 신규 앱은 다음 요건을 충족해야 합니다.
- Android App Bundle 형식을 사용하여 게시합니다.
- 다운로드 크기가 150MB를 초과하는 애셋 또는 기능을 업로드하려면 Play Asset Delivery 또는 Play Feature Delivery를 사용합니다. 신규 앱에는 더 이상 확장 파일(OBB)이 지원되지 않습니다.
- API 수준 30(Android 11) 이상을 타겟팅하고 동작 변경사항에 맞게 조정합니다. 단, Wear OS 앱은 계속 API 수준 28 이상을 타겟팅해야 합니다.
2021년 11월부터 앱 업데이트는 API 수준 30 이상을 타겟팅하고 Android 11의 동작 변경사항에 맞게 조정해야 합니다. 업데이트를 수신하지 않는 기존 앱은 영향을 받지 않으며 Play 스토어에서 계속 다운로드할 수 있습니다. Wear OS 앱은 API 수준 28 이상을 계속 타겟팅해야 합니다.
Android App Bundle 전송으로의 전환은 기존의 인스턴트 앱 ZIP 형식을 사용하는 인스턴트 환경에도 영향을 줍니다. 2021년 8월부터 새로운 인스턴트 환경 및 기존 인스턴트 환경 업데이트는 인스턴트 지원 App Bundle을 게시해야 합니다.
최신 SDK를 타겟팅해야 하는 이유
새로운 Android 버전이 출시될 때마다 보안 및 성능이 크게 개선되며 전반적으로 Android 사용자 환경이 향상됩니다. 이러한 변경사항 중 일부는 targetSdkVersion
매니페스트 속성(타겟 API 수준이라고도 함)을 통해 지원을 명시적으로 선언한 앱에만 적용됩니다.
최신 API 수준을 타겟팅하도록 앱을 구성하면 사용자가 이러한 개선사항의 혜택을 받을 수 있으며, 이전 Android 버전에서도 계속해서 앱을 실행할 수 있습니다. 최신 API 수준을 타겟팅하면 앱에서 플랫폼의 최신 기능을 활용해 사용자 환경을 개선할 수 있습니다. 또한 Android 10(API 수준 29) 현재 앱에서 Android 5.1(API 수준 22) 이하를 타겟팅하는 경우 사용자가 처음으로 앱을 시작할 때 경고가 표시됩니다.
이 문서에서는 대상 API 수준을 업데이트하여 Google Play 요구사항을 충족할 때 알아 두어야 하는 중요사항에 관해 다룹니다.
참고: Gradle 파일에 매니페스트 항목이 포함되어 있는 경우 빌드 구성의 설명대로 앱의 Gradle 파일에서 targetSdkVersion
의 현재 값을 확인하거나 변경할 수 있습니다.
또는 <uses-sdk> 매니페스트 요소 문서에 설명되어 있는 대로 매니페스트 파일에 있는 android:targetSdkVersion
속성을 사용할 수 있습니다.
Android 10(API 수준 29)에서 Android 11(API 수준 30)로 이전
- 개인정보 보호
- 범위 지정 저장소 적용: 앱에서 전용 위치를 사용하여 앱 관련 파일 형식, 미디어 파일 형식, 기타 파일 형식을 저장하고 액세스하는 범위 지정 저장소 모델을 채택해야 합니다.
- 권한 자동 초기화: 사용자가 몇 개월 동안 앱과 상호작용하지 않았다면 시스템에서 앱의 민감한 권한을 자동으로 초기화합니다. 이는 대부분 앱에 영향을 미치지 않습니다. 앱이 주로 사용자 상호작용 없이 백그라운드에서 작동한다면 사용자에게 자동 초기화를 사용 중지하도록 요청할 수 있습니다.
- 백그라운드 위치 액세스: 앱에서 포그라운드와 백그라운드 위치 액세스 권한을 별도로 요청해야 합니다. 런타임 권한 대화상자가 아닌 앱 설정에서만 백그라운드 위치 액세스 권한을 부여할 수 있습니다.
- 패키지 공개 상태: 앱에서 기기에 설치된 앱과 서비스 목록을 쿼리할 때 반환되는 목록이 필터링됩니다.
- TTS(텍스트 음성 변환) 또는 음성 인식 서비스를 사용하면 서비스를 위해
<queries>
요소를 매니페스트 파일에 추가해야 합니다.
- TTS(텍스트 음성 변환) 또는 음성 인식 서비스를 사용하면 서비스를 위해
- 보안
- 압축된
resource.arsc
파일은 더 이상 지원되지 않습니다. - 이제 APK 서명 체계 v2가 필요합니다. 이전 버전과의 호환성을 위해 개발자는 계속 APK 서명 체계 v1로 서명해야 합니다.
- 비 SDK 인터페이스 관련 제한사항이 있습니다. 현재 비 SDK 인터페이스의 일부가 차단되어 있으므로 API 수준 30을 타겟팅하는 앱에는 비 SDK 인터페이스를 사용하지 않는 것이 좋습니다. 차단된 비 SDK 인터페이스의 전체 목록은 Android 11에서 차단된 비 SDK 인터페이스를 참고하세요.
- 압축된
Android 11(API 수준 30)에 도입된 변경사항의 전체 목록을 확인하려면 동작 변경사항 페이지를 참고하세요.
Android 10(API 수준 29) 미만에서 이전
이전할 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
을 사용해야 합니다.
- 범위 지정 저장소
이전 섹션의 안내를 따라 API 30으로 계속 업데이트합니다.
앱 현대화하기
앱의 대상 API를 업데이트하면서 Android의 최신 기능을 도입하여 앱을 현대화하고 사용자 환경을 개선할 방법이 있는지 생각해 보세요.
- 베타 버전인 CameraX를 사용하여 카메라를 최대한 활용하세요.
- Jetpack 구성요소를 통해 권장사항을 따르고, 상용구 코드 작성 작업에서 벗어나며, 복잡한 작업을 간소화하여 중요한 코드에만 집중할 수 있습니다.
- Kotlin을 사용하면 더 적은 코드로 더 빠르게 더 나은 앱을 작성할 수 있습니다.
- 개인정보 보호 요구사항 및 권장사항을 준수해야 합니다.
- 앱에 어두운 테마 지원을 추가하세요.
- 앱에 동작 탐색 지원을 추가하세요.
- Google 클라우드 메시징(GCM)에서 최신 버전의 Firebase 클라우드 메시징으로 앱을 이전하세요.
- 고급 창 관리를 활용합니다.
- 16:9보다 큰 가로세로 비율을 지원하여 최신 하드웨어 기술을 활용하세요. 사용 가능한 화면 공간이 꽉 채워지도록 앱 크기가 조정되는지 확인하세요. 최대 가로세로 비율 선언은 최후의 수단으로만 사용하세요. 최대 가로세로 비율에 관한 자세한 내용은 제한적 화면 지원 선언을 참조하세요.
- 멀티 윈도우 지원을 추가하여 앱의 생산성을 높이고 여러 가지 디스플레이를 관리하세요.
- 최소화된 앱 환경으로 사용자 환경이 개선되는 경우 PIP 모드 기능 지원을 추가하세요.
- 디스플레이 컷아웃이 있는 기기에 맞게 최적화하세요.
- 상태 표시줄의 높이를 짐작하는 대신
WindowInsets
및View.OnApplyWindowInsetsListener
를 사용하세요. 자세한 설명은 이 동영상을 참조하세요. - 앱이 전체 창을 차지할 것이라고 짐작하는 대신
View.getLocationInWindow()
를 사용하여 창 위치를 확인합니다.View.getLocationOnScreen()
을 사용하지 마세요. MotionEvent
를 처리할 때MotionEvent.getX()
및MotionEvent.getY()
를 사용합니다.MotionEvent.getRawX()
및MotionEvent.getRawY()
를 사용하지 마세요.
SDK 및 라이브러리 확인 및 업데이트하기
타사 SDK 종속 항목이 API 29를 지원하는지 확인하세요. 일부 SDK 제공업체는 종속 항목을 매니페스트에 게시하며 추가적인 조사를 요구하는 곳도 있습니다. API 29를 지원하지 않는 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에서 이메일 수신에 동의해 주세요.