Przejdź do treści
Aktualizacje aplikacji

Docelowe API 36 w Google Play: przedłużenie do 1 listopada 2026 i poprawka dla Expo, Flutter, React Native

Termin 31 sierpnia minął? Sprawdź, co jeszcze daje przedłużenie do 1 listopada 2026, i przenieś Expo, Flutter lub React Native na API 36 bez psucia nawigacji wstecz i układów ekranów.

Krótka odpowiedź

Zgodnie z wymogiem docelowego poziomu API 36 od 31 sierpnia 2026 każda nowa aplikacja i każda aktualizacja przesyłana do Google Play musi być kierowana na Androida 16 (API 36). Deweloperzy, których aplikacje otrzymały ostrzeżenie dotyczące zasad, mogli poprosić o przedłużenie do 1 listopada 2026 na stronie Stan zasad. Po zakończeniu przedłużenia Play blokuje aktualizacje, dopóki nie prześlesz kompilacji z targetSdk 36. Expo SDK 54+, Flutter 3.38+ i React Native 0.81+ domyślnie kierują na API 36.

Najważniejsze wnioski
  • Od 31 sierpnia 2026 nowe aplikacje i aktualizacje w Google Play muszą być kierowane na Androida 16 (poziom API 36). Wear OS i Automotive wymagają API 35, a Android TV i XR – API 34.
  • Przedłużenie obowiązuje tylko do 1 listopada 2026. Link do formularza trafia do niezgodnych aplikacji przez Powiadomienia w Play Console oraz stronę ostrzeżenia w sekcji Stan zasad.
  • Jeśli istniejąca aplikacja na telefony jest kierowana na API 35 lub wyższe, nadal jest dostępna dla nowych użytkowników. Przegapienie terminu blokuje aktualizacje, a nie obecny wpis w sklepie.
  • Expo SDK 54 (React Native 0.81) i Flutter 3.38 domyślnie kierują na API 36. Aktualizacja frameworka zwykle działa lepiej niż ręczna zmiana numeru.
  • Gdy aplikacja jest kierowana na API 36, Android przestaje wywoływać onBackPressed i ignoruje blokady orientacji na ekranach o szerokości co najmniej 600dp. Przetestuj nawigację wstecz i układy na tabletach przed przesłaniem.
API 36 albo brak aktualizacji

Wymóg docelowego poziomu API 36 w Google Play oznacza, że wersji zbudowanej dla czegokolwiek poniżej Androida 16 nie da się opublikować. Według stanu na październik 2026 Play odrzuca każdą nową aplikację i każdą aktualizację kierowaną na niższy poziom, często z komunikatem Target SDK of artifact is too low. Aplikacje, które otrzymały ostrzeżenie dotyczące zasad, mogły poprosić o więcej czasu, ale przedłużenie kończy się 1 listopada 2026. Ten przewodnik wyjaśnia, co jeszcze daje przedłużenie, jak przenieść Expo, Flutter i React Native na API 36 oraz co zwykle się psuje po tej zmianie.

Co właściwie blokuje wymóg docelowego poziomu API 36?

Blokuje przesyłanie. Od 31 sierpnia 2026 nie można przesłać nowej aplikacji na telefony ani aktualizacji, jeśli nie jest kierowana na API 36. Aplikacje już opublikowane, kierowane na API 35 lub wyższe, pozostają w pełni dostępne, także dla nowych użytkowników.

Zgodnie z wymaganiami Google dotyczącymi docelowego poziomu API „nowe aplikacje i aktualizacje aplikacji muszą być kierowane na Androida 16 (poziom API 36) lub wyższy, aby można je było przesłać do Google Play”. Wymagania różnią się w zależności od typu urządzenia, a jedyny pełny wyjątek dotyczy trwale prywatnych aplikacji przeznaczonych do wewnętrznej dystrybucji w jednej organizacji.

Typ urządzeniaNowe aplikacje i aktualizacje (od 31 sierpnia 2026)Istniejące aplikacje pozostają w pełni dostępne, jeśli są kierowane na
Telefon, tablet, Android AutoAPI 36API 35 lub wyższe
Wear OSAPI 35API 34 lub wyższe
Android Automotive OSAPI 35API 32 lub wyższe
Android TVAPI 34API 33 lub wyższe
Android XRAPI 34API 34 lub wyższe

Istniejąca aplikacja poniżej tych poziomów „będzie dostępna tylko na urządzeniach z Androidem w wersji takiej samej lub niższej niż docelowy poziom API aplikacji”. Osoby, które już ją zainstalowały, korzystają z niej jak wcześniej. Ktoś z nowszym telefonem zobaczy jednak informację, że aplikacja „została utworzona dla starszej wersji Androida”.

Czy nadal można uzyskać przedłużenie przed 1 listopada 2026?

Tylko jeśli Play wysłał Twojej aplikacji ostrzeżenie dotyczące zasad, a formularz wniosku nadal jest przy nim widoczny. Nawet wtedy przedłużenie trwa najpóźniej do 1 listopada 2026, więc to kilka dodatkowych dni na niemal gotową poprawkę, a nie nowy plan.

Google informuje, że wysyła objętym wymogiem aplikacjom „link do formularza wniosku o przedłużenie w Powiadomieniach” oraz że formularz jest „dostępny na stronie szczegółów ostrzeżenia lub problemu na stronie Stan zasad”. Aplikacjom, które już spełniają wymóg, Google nie pokazuje formularza.

  1. Otwórz Play Console i wybierz aplikację.
  2. Poszukaj w Skrzynce odbiorczej lub Powiadomieniach wiadomości o docelowym poziomie API. Jeśli tam jest, kliknij jej link.
  3. Jeśli nie, przejdź do sekcji Stan zasad, otwórz ostrzeżenie lub problem dotyczący docelowego poziomu API i poszukaj formularza wniosku o przedłużenie na stronie szczegółów.
  4. Wypełnij formularz dla każdej objętej aplikacji. Każda aplikacja ma własne ostrzeżenie.
  5. Niezależnie od tego, czy przedłużenie zostanie przyznane, zaplanuj przesłanie kompilacji z API 36 przed 1 listopada 2026. Po tej dacie aktualizacje wymagają API 36.

Jak podnieść Expo, Flutter i React Native do API 36?

Najczystsza droga to aktualizacja do wersji frameworka, która już kieruje na API 36: Expo SDK 54, React Native 0.81 lub Flutter 3.38. Jeśli nie możesz jeszcze zaktualizować, możesz podnieść numer ręcznie, ale wtedy musisz samodzielnie obsłużyć zmiany zachowania w Androidzie 16.

StosDomyślnie kieruje na API 36 odGdzie znajduje się numerRęczna droga, jeśli nie możesz zaktualizować
Expo (managed / CNG)SDK 54 (React Native 0.81)Generowany przez prebuild; nadpisz przez expo-build-propertiestargetSdkVersion: 36 i compileSdkVersion: 36 we wtyczce expo-build-properties
React Native (bare)0.81android/build.gradleUstaw compileSdk i targetSdk na 36, a następnie wyłącz predictive back w manifeście
Flutter3.38 (flutter.targetSdkVersion = 36)android/app/build.gradle(.kts)Zastąp zakodowane na sztywno 35 wartością 36 lub flutter.targetSdkVersion

Expo. Lista zmian SDK 54 mówi, że SDK 54 i React Native 0.81 „kierują teraz na Androida 16”. Zaktualizuj poleceniem npx expo install expo@^54.0.0 --fix, uruchom npx expo-doctor@latest, a jeśli korzystasz z Continuous Native Generation, „usuń katalogi android i ios, jeśli zostały wygenerowane dla poprzedniej wersji SDK”. Na SDK 53 możesz spróbować ustawić targetSdkVersion: 36 przez wtyczkę expo-build-properties, ale React Native 0.79 nadal obsługuje cofanie przez onBackPressed, więc przed publikacją przeczytaj następną sekcję.

Flutter. Informacje o wydaniu Flutter 3.38 podają jako wartości domyślne flutter.compileSdkVersion (API 36) i flutter.targetSdkVersion (API 36) oraz „zdecydowanie zachęcają do używania w plikach kompilacji zmiennych poziomu API udostępnianych przez Flutter SDK”. Wersja 3.38 wymaga też co najmniej Javy 17. Jeśli w module aplikacji masz na sztywno targetSdk = 35, aktualizacja Fluttera tego nie zmieni, więc sprawdź plik.

Bare React Native. Ustaw compileSdkVersion i targetSdkVersion na 36 w android/build.gradle. Na wersji 0.81 i nowszych to w zasadzie wszystko. W starszych wersjach dodaj też android:enableOnBackInvokedCallback="false" do <application> w AndroidManifest.xml. Bez tego sprzętowy przycisk wstecz i gest cofania omijają nawigację w JavaScripcie.

Co się psuje, gdy aplikacja zaczyna być kierowana na Androida 16?

Najczęściej psują się nawigacja wstecz i układy na dużych ekranach. Przy API 36 jako docelowym Android przestaje wywoływać onBackPressed, nie pozwala zrezygnować z trybu edge-to-edge i ignoruje blokady orientacji oraz zmiany rozmiaru na wyświetlaczach o szerokości co najmniej 600dp.

Zmiany najważniejsze dla aplikacji wieloplatformowych, według dokumentu Google Zmiany w działaniu Androida 16:

  • Predictive back: „onBackPressed nie jest wywoływane, a KeyEvent.KEYCODE_BACK nie jest już wysyłane”. Ustawienie android:enableOnBackInvokedCallback="false" to tymczasowa rezygnacja.
  • Edge-to-edge: windowOptOutEdgeToEdgeEnforcement jest „wycofane i wyłączone”, więc nagłówek lub dolny przycisk może trafić pod pasek stanu albo pasek gestów.
  • Duże ekrany: na wyświetlaczach o szerokości 600dp i większej ignorowane są screenOrientation, resizableActivity i ograniczenia proporcji, co może rozciągać układy przeznaczone tylko do pionu. Gry są wyłączone z tej zmiany. PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY to tymczasowa rezygnacja, która „nie będzie działać przy kierowaniu na poziom API 37”.
  • Tekst: elegantTextHeight jest ignorowane, co może zmienić wysokość wiersza dla pisma arabskiego, tajskiego, tamilskiego i kilku innych.
  • Czujniki zdrowotne: BODY_SENSORS zostaje zastąpione szczegółowymi uprawnieniami zdrowotnymi, takimi jak READ_HEART_RATE.

Na co trafili inni deweloperzy przy przejściu na API 36?

Dotychczasowe publiczne zgłoszenia pokazują dwa rodzaje problemów: zachowanie przycisku wstecz, które zmienia się bez żadnego błędu, oraz biblioteki, przez które docelowy poziom w pakiecie odbieranym przez Play różni się od tego, co mówią pliki projektu.

Audius (React Native 0.79). W pull requeście #14635 zespół Audius pisze, że Google Play odrzucił oba przesłania wersji Androida 1.5.186 z komunikatem Target SDK of artifact is too low. Podnieśli compileSdk i targetSdk z 35 do 36, ustawili build tools na 36.0.0 i dodali android.suppressUnsupportedCompileSdk=36, ponieważ „RN 0.79 przypina AGP 8.8”. Ustawili też enableOnBackInvokedCallback="false", bo bez tego cofanie „omijałoby React Navigation”. Późniejszy PR usunął tę rezygnację po przejściu na React Native 0.81, który sam rejestruje OnBackPressedCallback.

Aplikacja na Flutter 3.35.2. W zgłoszeniu Fluttera #174516 deweloper ustawił targetSdk 36 w Gradle i manifeście, ale Play Console nadal zgłaszał „Your bundle targets SDK 34, but uses a Play Core library that cannot be used with that version”. Usunięcie starej biblioteki com.google.android.play:core:1.10.3 doprowadziło do błędów R8 „Missing classes”. Ich naprawa doprowadziła z kolei do komunikatu „You can't rollout this release because it doesn't allow any existing users to upgrade to the newly added app bundles”. Pakiet został ostatecznie zaakceptowany po dodaniu reguł keep w ProGuard, jawnym ustawieniu minSdk i wyłączeniu podziałów według języka, gęstości i ABI, kosztem większego rozmiaru pobierania.

Wspólna lekcja: zmiana numeru w Gradle nie kończy pracy. Audius musiał naprawić zachowanie w czasie działania, a deweloper Fluttera – zależność, która zmieniała to, co Play odczytywał z pakietu. Sprawdź zbudowany artefakt i przetestuj aplikację na urządzeniu z Androidem 16, a nie tylko plik konfiguracyjny.

Jak sprawdzić kompilację z API 36 przed przesłaniem?

Odczytaj docelowy poziom z samego pakietu wydania, a następnie umieść pakiet na ścieżce testów wewnętrznych lub zamkniętych i sprawdź na Androidzie 16 nawigację wstecz, wcięcia systemowe i układ na tablecie. Odrzucenie albo błąd w produkcji kosztuje znacznie więcej czasu niż te testy.

Przykład: aplikacja na Expo SDK 53, kierowana na API 35, która potrzebuje jeszcze jednej aktualizacji.

  1. Uruchom npx expo install expo@^54.0.0 --fix, potem npx expo-doctor@latest, i napraw wszystko, co zgłosi.
  2. Jeśli projekt korzysta z Continuous Native Generation, usuń stare foldery android i ios i zbuduj ponownie. W przeciwnym razie wprowadź natywne zmiany aktualizacji ręcznie.
  3. Zbuduj wydanie AAB, na przykład poleceniem eas build -p android --profile production.
  4. Potwierdź poziom docelowy poleceniem bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion. Powinno wyświetlić 36.
  5. Prześlij na ścieżkę testów wewnętrznych. Na telefonie z Androidem 16 naciśnij wstecz na każdym zagnieżdżonym ekranie, sprawdź, czy nagłówki i dolne przyciski nie chowają się pod paskami systemowymi, i obróć tablet lub emulator ze zmiennym rozmiarem.
  6. Promuj wydanie do produkcji z informacjami o wersji, które wspominają poprawki dla Androida 16.

Aby przyspieszyć testy, skorzystaj z konfiguracji testerów z naszego przewodnika po testach zamkniętych w Google Play, a sformułowania do opisu aktualizacji zaczerpnij z naszych przykładów informacji o wersji. Jeśli wolisz zlecić wydanie, nasza usługa publikacji w App Store obejmuje Play Console i App Store Connect za $599 za oba sklepy. Opłaty za konta deweloperskie są osobne.

Najczęściej zadawane pytania

Co się stanie, jeśli przegapię przedłużenie terminu docelowego API do 1 listopada 2026?

Obecny wpis w sklepie pozostaje. Aplikacja na telefony kierowana na API 35 lub wyższe jest nadal dostępna dla obecnych i nowych użytkowników. Play Console odrzuci jednak każde nowe wydanie, w tym pilne poprawki błędów, dopóki pakiet nie będzie kierowany na Androida 16 (API 36). Aplikacje poniżej API 35 można instalować tylko na urządzeniach z tą lub starszą wersją Androida.

Czy aplikacje na Wear OS i Android TV muszą być kierowane na API 36?

Nie. Według stanu na październik 2026 nowe aplikacje i aktualizacje na Wear OS i Android Automotive OS muszą być kierowane na API 35, a aplikacje na Android TV i Android XR – na API 34. API 36 wymagają tylko aplikacje na telefony, tablety i Android Auto. Jedynym pełnym wyjątkiem jest trwale prywatna aplikacja dystrybuowana w obrębie jednej organizacji.

Czy mogę kierować na API 36 bez aktualizacji Expo SDK?

Na SDK 53 możesz ustawić targetSdkVersion i compileSdkVersion na 36 we wtyczce expo-build-properties i niektórzy deweloperzy tak zrobili. React Native 0.79, z którego korzysta SDK 53, nadal przekazuje naciśnięcia wstecz przez onBackPressed, a Android 16 przy API 36 już go nie wywołuje. Trzeba by z tego zrezygnować, ustawiając enableOnBackInvokedCallback na false. Oficjalnie wspieraną drogą jest aktualizacja do SDK 54.

Czym różni się compileSdkVersion od targetSdkVersion?

compileSdkVersion to wersja API Androida, względem której kompilowany jest kod. targetSdkVersion informuje Androida, zachowanie której wersji przyjęła aplikacja, i to jego wymaga Google Play. compileSdk musi być równe targetSdk lub wyższe, więc przejście na docelowe 36 oznacza kompilację względem API 36 lub nowszego. Na przykład Expo SDK 58 kompiluje względem 37, a kieruje na 36.

Dlaczego Play Console nadal twierdzi, że aplikacja jest kierowana na starszy poziom API, mimo zmiany w build.gradle?

Play odczytuje docelowy poziom z przesłanego pakietu, a nie z plików źródłowych. Wartość zakodowana na sztywno w innym module, przestarzała wtyczka lub biblioteka taka jak stary Play Core mogą zmienić scalony manifest. Uruchom bundletool dump manifest na wydaniu AAB, aby zobaczyć rzeczywisty targetSdkVersion, i upewnij się, że przesyłasz nową kompilację, a nie stary artefakt.

Źródła i dalsza lektura

Zasady się zmieniają. Przed wysłaniem sprawdź oficjalną dokumentację.

Przynieś build. Albo pomysł.

Doprowadźmy Twoją aplikację do mety.

Konkretna rozmowa, by ustalić, co dzieli Twoją aplikację od publikacji w sklepie.

Umów rozmowę ↗