본문으로 건너뛰기
앱 업데이트

Google Play 타깃 API 레벨 36: 2026년 11월 1일 연장과 Expo, Flutter, React Native 해결 방법

8월 31일 마감을 놓쳤나요? 2026년 11월 1일 연장으로 아직 얻을 수 있는 것을 확인하고, 뒤로 가기와 레이아웃을 깨뜨리지 않고 Expo, Flutter, React Native를 API 36으로 올리세요.

짧은 답변

타깃 API 레벨 36 규정에 따라 2026년 8월 31일부터 Google Play에 제출하는 모든 신규 앱과 앱 업데이트는 Android 16(API 36)을 타깃으로 해야 합니다. 정책 경고를 받은 앱의 개발자는 정책 상태 페이지에서 2026년 11월 1일까지 연장을 요청할 수 있었습니다. 연장이 끝나면 Play는 targetSdk 36 빌드를 업로드할 때까지 업데이트를 차단합니다. Expo SDK 54 이상, Flutter 3.38 이상, React Native 0.81 이상은 기본적으로 API 36을 타깃으로 합니다.

핵심 요약
  • 2026년 8월 31일부터 Google Play의 신규 앱과 앱 업데이트는 Android 16(API 레벨 36)을 타깃으로 해야 합니다. Wear OS와 Automotive는 API 35, Android TV와 XR은 API 34가 필요합니다.
  • 연장은 2026년 11월 1일까지만 유효합니다. 연장 신청 양식 링크는 Play Console 알림과 정책 상태의 해당 경고 페이지를 통해 규정을 충족하지 않는 앱에만 제공됩니다.
  • 기존 휴대폰 앱이 API 35 이상을 타깃으로 한다면 신규 사용자에게도 계속 제공됩니다. 마감을 놓치면 막히는 것은 업데이트이지, 현재 등록정보가 아닙니다.
  • Expo SDK 54(React Native 0.81)와 Flutter 3.38은 기본적으로 API 36을 타깃으로 합니다. 숫자를 직접 수정하는 것보다 업그레이드가 대체로 더 잘 작동합니다.
  • 앱이 API 36을 타깃으로 하면 Android는 더 이상 onBackPressed를 호출하지 않고, 너비 600dp 이상 화면에서는 방향 고정을 무시합니다. 업로드 전에 뒤로 가기 동작과 태블릿 레이아웃을 테스트하세요.
API 36 아니면 업데이트 불가

Google Play의 타깃 API 레벨 36 요건은 Android 16 미만을 대상으로 빌드한 릴리스는 출시할 수 없다는 뜻입니다. 2026년 10월 현재 Play는 더 낮은 레벨을 타깃으로 하는 모든 신규 앱과 업데이트를 거부하며, 이때 Target SDK of artifact is too low 메시지가 자주 표시됩니다. 정책 경고를 받은 앱은 기한 연장을 요청할 수 있었지만, 연장은 2026년 11월 1일에 끝납니다. 이 가이드에서는 연장으로 아직 얻을 수 있는 것, Expo, Flutter, React Native를 API 36으로 올리는 방법, 그리고 올린 뒤 흔히 깨지는 부분을 다룹니다.

타깃 API 레벨 36 요건은 실제로 무엇을 막나요?

막히는 것은 제출입니다. 2026년 8월 31일부터는 API 36을 타깃으로 하지 않으면 신규 휴대폰 앱이나 업데이트를 업로드할 수 없습니다. 이미 출시되어 API 35 이상을 타깃으로 하는 앱은 신규 사용자를 포함해 계속 정상적으로 제공됩니다.

Google의 타깃 API 레벨 요건에 따르면 "Google Play에 제출하려면 신규 앱과 앱 업데이트는 Android 16(API 레벨 36) 이상을 타깃으로 해야 합니다." 요건은 기기 유형마다 다르며, 완전한 예외는 한 조직 내부 배포용으로 영구 비공개인 앱뿐입니다.

기기 유형신규 앱 및 업데이트(2026년 8월 31일부터)기존 앱이 계속 정상 제공되는 타깃 레벨
휴대폰, 태블릿, Android AutoAPI 36API 35 이상
Wear OSAPI 35API 34 이상
Android Automotive OSAPI 35API 32 이상
Android TVAPI 34API 33 이상
Android XRAPI 34API 34 이상

이 레벨에 못 미치는 기존 앱은 "앱의 타깃 API 레벨과 같거나 그보다 낮은 Android OS를 실행하는 기기에서만 제공됩니다." 이미 설치한 사용자는 이전처럼 계속 사용할 수 있습니다. 하지만 더 최신 휴대폰을 쓰는 사용자에게는 이 앱이 "이전 버전의 Android용으로 제작되었다"는 안내가 표시됩니다.

2026년 11월 1일 전에 아직 연장을 받을 수 있나요?

Play가 앱에 정책 경고를 보냈고 신청 양식이 아직 표시되는 경우에만 가능합니다. 그렇더라도 연장은 늦어도 2026년 11월 1일까지이므로, 새로운 계획이 아니라 거의 끝난 수정을 마무리할 며칠의 여유 정도로 보세요.

Google은 해당 앱에 "알림을 통해 연장 요청 양식 링크"를 보내며, 이 양식은 "정책 상태 페이지에서 경고 또는 문제의 세부정보 페이지를 통해 이용할 수 있다"고 설명합니다. 이미 규정을 충족한 앱에는 양식이 표시되지 않습니다.

  1. Play Console을 열고 앱을 선택합니다.
  2. 받은편지함이나 알림에서 타깃 API 레벨 관련 메시지를 찾습니다. 있다면 링크를 따라갑니다.
  3. 없다면 정책 상태로 이동해 타깃 API 레벨 경고 또는 문제를 열고, 세부정보 페이지에서 연장 요청 양식을 찾습니다.
  4. 해당하는 모든 앱에 대해 양식을 작성합니다. 경고는 앱마다 따로 있습니다.
  5. 연장 승인 여부와 관계없이 2026년 11월 1일 전에 API 36 빌드를 업로드할 계획을 세우세요. 그 이후의 업데이트는 API 36이 필요합니다.

Expo, Flutter, React Native를 API 36으로 어떻게 올리나요?

가장 깔끔한 방법은 이미 API 36을 타깃으로 하는 프레임워크 버전, 즉 Expo SDK 54, React Native 0.81, Flutter 3.38로 업그레이드하는 것입니다. 아직 업그레이드할 수 없다면 숫자를 직접 올릴 수도 있지만, 그 경우 Android 16 동작 변경도 직접 처리해야 합니다.

스택기본으로 API 36을 타깃으로 하는 버전숫자가 있는 위치업그레이드할 수 없을 때의 수동 방법
Expo(managed / CNG)SDK 54(React Native 0.81)prebuild가 생성하며 expo-build-properties로 재정의expo-build-properties 플러그인에 targetSdkVersion: 36과 compileSdkVersion: 36 설정
React Native(bare)0.81android/build.gradlecompileSdk와 targetSdk를 36으로 설정한 뒤 매니페스트에서 예측형 뒤로 가기 비활성화
Flutter3.38(flutter.targetSdkVersion = 36)android/app/build.gradle(.kts)하드코딩된 35를 36 또는 flutter.targetSdkVersion으로 교체

Expo. SDK 54 변경 로그에 따르면 SDK 54와 React Native 0.81은 "이제 Android 16을 타깃으로 합니다." npx expo install expo@^54.0.0 --fix로 업그레이드하고 npx expo-doctor@latest를 실행하세요. Continuous Native Generation을 사용한다면 "이전 SDK 버전용으로 생성한 android 및 ios 디렉터리를 삭제하세요." SDK 53에서는 expo-build-properties 플러그인으로 targetSdkVersion: 36을 설정해 볼 수 있지만, React Native 0.79는 여전히 onBackPressed로 뒤로 가기를 처리하므로 출시 전에 다음 섹션을 꼭 읽어 보세요.

Flutter. Flutter 3.38 릴리스 노트는 기본값을 flutter.compileSdkVersion(API 36)과 flutter.targetSdkVersion(API 36)으로 명시하고, "빌드 파일에서 Flutter SDK가 제공하는 API 레벨 변수를 사용할 것을 강력히 권장"합니다. 3.38 버전은 최소 Java 17도 필요합니다. 앱 모듈에 targetSdk = 35가 하드코딩되어 있으면 Flutter를 업그레이드해도 바뀌지 않으니 파일을 확인하세요.

Bare React Native. android/build.gradle에서 compileSdkVersion과 targetSdkVersion을 36으로 설정합니다. 0.81 이상이라면 대부분 이걸로 끝입니다. 그보다 오래된 버전이라면 AndroidManifest.xml의 <application>에 android:enableOnBackInvokedCallback="false"도 추가하세요. 이 설정이 없으면 하드웨어 뒤로 가기 버튼과 뒤로 가기 제스처가 JavaScript 내비게이션을 건너뜁니다.

앱이 Android 16을 타깃으로 하면 무엇이 깨지나요?

가장 자주 깨지는 것은 뒤로 가기 동작과 대화면 레이아웃입니다. API 36을 타깃으로 하면 Android는 onBackPressed 호출을 중단하고, 더 이상 edge-to-edge를 비활성화할 수 없게 하며, 너비 600dp 이상 디스플레이에서는 방향 및 크기 조절 제한을 무시합니다.

Google의 Android 16 동작 변경사항 중 크로스 플랫폼 앱에 가장 중요한 변경은 다음과 같습니다.

  • 예측형 뒤로 가기: "onBackPressed가 호출되지 않으며 KeyEvent.KEYCODE_BACK도 더 이상 전달되지 않습니다." android:enableOnBackInvokedCallback="false" 설정은 임시 비활성화 방법입니다.
  • Edge-to-edge: windowOptOutEdgeToEdgeEnforcement는 "지원 중단되고 비활성화"되었으므로 헤더나 하단 버튼이 상태 표시줄 또는 제스처 바 아래로 들어갈 수 있습니다.
  • 대화면: 600dp 이상 디스플레이에서는 screenOrientation, resizableActivity, 화면 비율 제한이 무시되어 세로 전용 레이아웃이 늘어날 수 있습니다. 게임은 예외입니다. PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY는 임시 비활성화 방법이며 "API 레벨 37을 타깃으로 할 때는 적용되지 않습니다."
  • 텍스트: elegantTextHeight가 무시되어 아랍어, 태국어, 타밀어 등 여러 문자의 줄 높이가 바뀔 수 있습니다.
  • 건강 센서: BODY_SENSORS는 READ_HEART_RATE 같은 세분화된 건강 권한으로 대체됩니다.

다른 개발자들은 API 36으로 옮길 때 어떤 문제를 겪었나요?

지금까지 공개된 사례를 보면 문제는 두 종류입니다. 아무 오류 없이 뒤로 가기 버튼 동작이 바뀌는 경우, 그리고 라이브러리 때문에 Play가 받은 번들의 타깃 레벨이 프로젝트 파일과 달라지는 경우입니다.

Audius(React Native 0.79). 풀 리퀘스트 #14635에서 Audius 팀은 Google Play가 Android 버전 1.5.186의 업로드 두 건을 모두 Target SDK of artifact is too low로 거부했다고 밝혔습니다. 이들은 compileSdk와 targetSdk를 35에서 36으로 올리고, 빌드 도구를 36.0.0으로 설정했으며, "RN 0.79가 AGP 8.8로 고정되어 있기" 때문에 android.suppressUnsupportedCompileSdk=36을 추가했습니다. 또한 이 설정이 없으면 뒤로 가기가 "React Navigation을 우회하기" 때문에 enableOnBackInvokedCallback="false"도 설정했습니다. 이후 React Native 0.81로 옮기면서 후속 PR에서 이 비활성화 설정을 제거했는데, 0.81은 자체적으로 OnBackPressedCallback을 등록하기 때문입니다.

Flutter 3.35.2 앱. Flutter 이슈 #174516에서 한 개발자는 Gradle과 매니페스트에 targetSdk 36을 설정했지만, Play Console은 여전히 "번들이 SDK 34를 타깃으로 하지만 해당 버전과 함께 사용할 수 없는 Play Core 라이브러리를 사용합니다"라고 보고했습니다. 오래된 com.google.android.play:core:1.10.3 라이브러리를 제거하자 R8 "Missing classes" 오류가 발생했습니다. 이를 고치자 이번에는 "기존 사용자가 새로 추가된 App Bundle로 업그레이드할 수 없으므로 이 버전을 출시할 수 없습니다"라는 메시지가 나왔습니다. 결국 ProGuard keep 규칙을 추가하고, minSdk를 명시적으로 설정하고, 언어·밀도·ABI 분할을 끈 뒤에야 번들이 승인되었으며, 그 대가로 다운로드 용량이 커졌습니다.

공통된 교훈은 Gradle의 숫자를 바꾸는 것만으로는 끝나지 않는다는 점입니다. Audius는 런타임 동작을 고쳐야 했고, Flutter 개발자는 Play가 번들에서 읽는 값을 바꿔 버린 의존성을 고쳐야 했습니다. 설정 파일만 보지 말고 빌드된 결과물을 확인하고 Android 16 기기에서 테스트하세요.

업로드 전에 API 36 빌드를 어떻게 확인하나요?

릴리스 번들 자체에서 타깃 레벨을 읽은 다음, 번들을 내부 테스트 또는 비공개 테스트 트랙에 올려 Android 16에서 뒤로 가기, 인셋, 태블릿 레이아웃을 확인하세요. 거부나 프로덕션 버그는 이런 점검보다 훨씬 많은 시간을 잡아먹습니다.

실전 예시: API 35를 타깃으로 하며 업데이트를 하나 더 내야 하는 Expo SDK 53 앱.

  1. npx expo install expo@^54.0.0 --fix를 실행한 다음 npx expo-doctor@latest를 실행하고, 보고되는 문제를 모두 고칩니다.
  2. 프로젝트가 Continuous Native Generation을 사용한다면 기존 android와 ios 폴더를 삭제하고 다시 빌드합니다. 그렇지 않다면 네이티브 업그레이드 변경사항을 직접 적용합니다.
  3. 릴리스 AAB를 빌드합니다. 예: eas build -p android --profile production.
  4. bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion으로 타깃을 확인합니다. 36이 출력되어야 합니다.
  5. 내부 테스트에 업로드합니다. Android 16 휴대폰에서 모든 중첩 화면에서 뒤로 가기를 눌러 보고, 헤더와 하단 버튼이 시스템 바 아래에 가려지지 않는지 확인하고, 태블릿이나 크기 조절 가능한 에뮬레이터를 회전해 봅니다.
  6. Android 16 관련 수정 내용을 언급한 출시 노트와 함께 프로덕션으로 승격합니다.

테스트를 더 빨리 진행하려면 Google Play 비공개 테스트 가이드의 테스터 설정을 활용하고, 업데이트 문구는 출시 노트 예시를 참고하세요. 출시 작업을 맡기고 싶다면 App Store 제출 서비스가 두 스토어 기준 $599에 Play Console과 App Store Connect를 모두 처리합니다. 개발자 계정 비용은 별도입니다.

자주 묻는 질문

2026년 11월 1일 타깃 API 연장 기한을 놓치면 어떻게 되나요?

현재 등록정보는 그대로 유지됩니다. API 35 이상을 타깃으로 하는 휴대폰 앱은 기존 사용자와 신규 사용자 모두에게 계속 제공됩니다. 다만 번들이 Android 16(API 36)을 타깃으로 할 때까지 Play Console은 긴급 버그 수정을 포함한 모든 새 릴리스를 거부합니다. API 35 미만 앱은 해당 Android 버전 이하를 실행하는 기기에서만 설치할 수 있습니다.

Wear OS와 Android TV 앱도 API 36을 타깃으로 해야 하나요?

아니요. 2026년 10월 기준으로 Wear OS 및 Android Automotive OS의 신규 앱과 업데이트는 API 35, Android TV와 Android XR 앱은 API 34를 타깃으로 해야 합니다. API 36이 필요한 것은 휴대폰, 태블릿, Android Auto 앱뿐입니다. 유일한 완전 예외는 한 조직 내부에서 배포되는 영구 비공개 앱입니다.

Expo SDK를 업그레이드하지 않고 API 36을 타깃으로 할 수 있나요?

SDK 53에서는 expo-build-properties 플러그인에서 targetSdkVersion과 compileSdkVersion을 36으로 설정할 수 있으며, 실제로 그렇게 한 개발자도 있습니다. 하지만 SDK 53이 사용하는 React Native 0.79는 여전히 onBackPressed로 뒤로 가기 입력을 전달하는데, Android 16은 API 36에서 더 이상 이를 호출하지 않습니다. enableOnBackInvokedCallback을 false로 설정해 비활성화해야 합니다. 공식적으로 지원되는 방법은 SDK 54로 업그레이드하는 것입니다.

compileSdkVersion과 targetSdkVersion의 차이는 무엇인가요?

compileSdkVersion은 코드를 컴파일할 때 기준이 되는 Android API 버전입니다. targetSdkVersion은 앱이 어느 버전의 동작을 채택했는지 Android에 알려 주는 값이며, Google Play가 이를 강제합니다. compileSdk는 targetSdk와 같거나 더 높아야 하므로, 타깃을 36으로 올리면 API 36 이상으로 컴파일해야 합니다. 예를 들어 Expo SDK 58은 37로 컴파일하고 36을 타깃으로 합니다.

build.gradle을 바꿨는데도 Play Console에 앱이 이전 API 레벨을 타깃으로 한다고 나오는 이유는 무엇인가요?

Play는 소스 파일이 아니라 업로드한 번들에서 타깃 레벨을 읽습니다. 다른 모듈에 하드코딩된 값, 오래된 플러그인, 또는 예전 Play Core 같은 라이브러리가 병합된 매니페스트를 바꿀 수 있습니다. 릴리스 AAB에 bundletool dump manifest를 실행해 실제 targetSdkVersion을 확인하고, 이전 결과물이 아닌 새 빌드를 업로드했는지 확인하세요.

출처 & 더 읽을거리

정책은 바뀝니다. 제출 전에 공식 문서를 확인하세요.

빌드를 가져오세요. 아이디어만 있어도 됩니다.

앱 출시를 끝까지 마무리합시다.

앱이 스토어에 공개되기까지 무엇이 가로막고 있는지 짚어 보는 집중 통화입니다.

통화 예약 ↗