ข้ามไปยังเนื้อหา
อัปเดตแอป

Target API level 36 บน Google Play: ขยายเวลาถึง 1 พ.ย. 2026 และวิธีแก้สำหรับ Expo, Flutter, React Native

พลาดเส้นตาย 31 สิงหาคมไปแล้ว? ดูว่าการขยายเวลาถึง 1 พฤศจิกายน 2026 ยังช่วยอะไรได้บ้าง แล้วย้าย Expo, Flutter หรือ React Native ไปยัง API 36 โดยไม่ทำให้ปุ่มย้อนกลับหรือเลย์เอาต์พัง

คำตอบสั้น ๆ

กฎ target API level 36 กำหนดว่าตั้งแต่ 31 สิงหาคม 2026 แอปใหม่และอัปเดตแอปทุกตัวที่ส่งเข้า Google Play ต้อง target Android 16 (API 36) นักพัฒนาที่แอปได้รับคำเตือนด้านนโยบายสามารถขอขยายเวลาถึง 1 พฤศจิกายน 2026 ได้จากหน้า Policy status เมื่อการขยายเวลาสิ้นสุดลง Play จะบล็อกการอัปเดตจนกว่าคุณจะอัปโหลดบิลด์ที่มี targetSdk 36 ทั้งนี้ Expo SDK 54 ขึ้นไป, Flutter 3.38 ขึ้นไป และ React Native 0.81 ขึ้นไป target API 36 เป็นค่าเริ่มต้นอยู่แล้ว

ประเด็นสำคัญ
  • ตั้งแต่ 31 สิงหาคม 2026 แอปใหม่และอัปเดตแอปบน Google Play ต้อง target Android 16 (API level 36) ส่วน Wear OS และ Automotive ต้องใช้ API 35 และ Android TV กับ XR ต้องใช้ API 34
  • การขยายเวลามีผลถึงแค่ 1 พฤศจิกายน 2026 เท่านั้น ลิงก์แบบฟอร์มจะส่งถึงแอปที่ไม่เป็นไปตามข้อกำหนดผ่าน Notifications ใน Play Console และผ่านหน้ารายละเอียดของคำเตือนใน Policy status
  • หากแอปโทรศัพท์ที่มีอยู่แล้ว target API 35 ขึ้นไป แอปจะยังให้ผู้ใช้ใหม่ติดตั้งได้ การพลาดเส้นตายจะหยุดการอัปเดตของคุณ ไม่ใช่หน้าสโตร์ที่มีอยู่
  • Expo SDK 54 (React Native 0.81) และ Flutter 3.38 target API 36 เป็นค่าเริ่มต้น การอัปเกรดมักได้ผลดีกว่าการแก้ตัวเลขเอง
  • เมื่อแอป target API 36 แล้ว Android จะไม่เรียก onBackPressed อีกต่อไป และจะไม่สนใจการล็อกการหมุนจอบนหน้าจอที่กว้าง 600dp ขึ้นไป ทดสอบการนำทางย้อนกลับและเลย์เอาต์บนแท็บเล็ตก่อนอัปโหลด
API 36 หรือไม่มีอัปเดต

ข้อกำหนด target API level 36 บน Google Play หมายความว่ารีลีสที่บิลด์ให้ต่ำกว่า Android 16 จะเผยแพร่ไม่ได้ ณ เดือนตุลาคม 2026 Play ปฏิเสธแอปใหม่และอัปเดตทุกตัวที่ target ระดับต่ำกว่านั้น โดยมักแสดงข้อความ Target SDK of artifact is too low แอปที่ได้รับคำเตือนด้านนโยบายสามารถขอเวลาเพิ่มได้ แต่การขยายเวลาจะสิ้นสุดในวันที่ 1 พฤศจิกายน 2026 คู่มือนี้อธิบายว่าการขยายเวลายังช่วยอะไรได้บ้าง วิธีย้าย Expo, Flutter และ React Native ไปยัง API 36 และสิ่งที่มักพังหลังจากย้ายแล้ว

ข้อกำหนด target API level 36 บล็อกอะไรบ้าง?

มันบล็อกการส่งแอป ตั้งแต่ 31 สิงหาคม 2026 คุณจะอัปโหลดแอปโทรศัพท์ใหม่หรืออัปเดตไม่ได้ เว้นแต่จะ target API 36 แอปที่เผยแพร่อยู่แล้วและ target API 35 ขึ้นไปยังคงพร้อมใช้งานเต็มรูปแบบ รวมถึงสำหรับผู้ใช้ใหม่ด้วย

ตามข้อกำหนด target API level ของ Google ระบุว่า "แอปใหม่และอัปเดตแอปต้อง target Android 16 (API level 36) ขึ้นไปจึงจะส่งเข้า Google Play ได้" ข้อกำหนดแตกต่างกันไปตามประเภทอุปกรณ์ และข้อยกเว้นเต็มรูปแบบมีเพียงกรณีเดียว คือแอปที่เป็นส่วนตัวถาวรซึ่งใช้แจกจ่ายภายในองค์กรเดียว

ประเภทอุปกรณ์แอปใหม่และอัปเดต (ตั้งแต่ 31 ส.ค. 2026)แอปที่มีอยู่ยังพร้อมใช้งานเต็มรูปแบบหาก target
โทรศัพท์, แท็บเล็ต, Android AutoAPI 36API 35 ขึ้นไป
Wear OSAPI 35API 34 ขึ้นไป
Android Automotive OSAPI 35API 32 ขึ้นไป
Android TVAPI 34API 33 ขึ้นไป
Android XRAPI 34API 34 ขึ้นไป

แอปที่มีอยู่แล้วแต่ต่ำกว่าระดับเหล่านี้ "จะพร้อมใช้งานเฉพาะบนอุปกรณ์ที่ใช้ Android OS เวอร์ชันเดียวกับหรือต่ำกว่า target API level ของแอปเท่านั้น" ผู้ที่ติดตั้งไว้แล้วยังใช้งานได้ตามเดิม แต่คนที่ใช้โทรศัพท์รุ่นใหม่กว่าจะเห็นข้อความว่าแอป "สร้างขึ้นสำหรับ Android เวอร์ชันเก่า"

ยังขอขยายเวลาก่อน 1 พฤศจิกายน 2026 ได้อยู่ไหม?

ได้ เฉพาะในกรณีที่ Play ส่งคำเตือนด้านนโยบายถึงแอปของคุณ และแบบฟอร์มคำขอยังแสดงอยู่ แม้จะได้รับแล้ว การขยายเวลาก็มีผลถึง 1 พฤศจิกายน 2026 เป็นอย่างช้า จึงเป็นแค่เวลาเพิ่มอีกไม่กี่วันสำหรับงานแก้ที่ใกล้เสร็จแล้ว ไม่ใช่แผนใหม่

Google ระบุว่าจะส่ง "ลิงก์แบบฟอร์มคำขอขยายเวลาผ่าน Notifications" ให้แอปที่ได้รับผลกระทบ และแบบฟอร์ม "เข้าถึงได้จากหน้ารายละเอียดของคำเตือนหรือปัญหาในหน้า Policy status" Google จะไม่แสดงแบบฟอร์มให้แอปที่เป็นไปตามข้อกำหนดอยู่แล้ว

  1. เปิด Play Console แล้วเลือกแอป
  2. ดูใน Inbox หรือ Notifications ว่ามีข้อความเรื่อง target API level หรือไม่ ถ้ามี ให้กดตามลิงก์ในข้อความนั้น
  3. ถ้าไม่มี ให้ไปที่ Policy status เปิดคำเตือนหรือปัญหาเรื่อง target API level แล้วมองหาแบบฟอร์มคำขอขยายเวลาในหน้ารายละเอียด
  4. กรอกแบบฟอร์มสำหรับทุกแอปที่ได้รับผลกระทบ เพราะแต่ละแอปมีคำเตือนแยกกัน
  5. ไม่ว่าจะได้รับการขยายเวลาหรือไม่ ให้วางแผนอัปโหลดบิลด์ API 36 ก่อน 1 พฤศจิกายน 2026 หลังจากวันนั้น การอัปเดตต้องใช้ API 36

จะปรับ Expo, Flutter และ React Native ไปเป็น API 36 ได้อย่างไร?

ทางที่สะอาดที่สุดคืออัปเกรดเป็นเวอร์ชันเฟรมเวิร์กที่ target API 36 อยู่แล้ว ได้แก่ Expo SDK 54, React Native 0.81 หรือ Flutter 3.38 หากยังอัปเกรดไม่ได้ คุณสามารถเพิ่มตัวเลขเองได้ แต่ก็ต้องรับมือกับการเปลี่ยนแปลงพฤติกรรมของ Android 16 ด้วยตัวเองเช่นกัน

สแตกtarget API 36 เป็นค่าเริ่มต้นตั้งแต่ตัวเลขอยู่ที่ไหนวิธีทำเองหากอัปเกรดไม่ได้
Expo (managed / CNG)SDK 54 (React Native 0.81)สร้างโดย prebuild; override ด้วย expo-build-propertiesตั้ง targetSdkVersion: 36 และ compileSdkVersion: 36 ในปลั๊กอิน expo-build-properties
React Native (bare)0.81android/build.gradleตั้ง compileSdk และ targetSdk เป็น 36 แล้วปิด predictive back ใน manifest
Flutter3.38 (flutter.targetSdkVersion = 36)android/app/build.gradle(.kts)เปลี่ยนค่า 35 ที่ฮาร์ดโค้ดไว้เป็น 36 หรือเป็น flutter.targetSdkVersion

Expo changelog ของ SDK 54 ระบุว่า SDK 54 และ React Native 0.81 "target Android 16 แล้ว" อัปเกรดด้วย npx expo install expo@^54.0.0 --fix แล้วรัน npx expo-doctor@latest และหากคุณใช้ Continuous Native Generation ให้ "ลบไดเรกทอรี android และ ios หากคุณสร้างไว้สำหรับ SDK เวอร์ชันก่อนหน้า" บน SDK 53 คุณลองตั้ง targetSdkVersion: 36 ผ่านปลั๊กอิน expo-build-properties ได้ แต่ React Native 0.79 ยังจัดการปุ่มย้อนกลับผ่าน onBackPressed อยู่ ดังนั้นอ่านหัวข้อถัดไปก่อนเผยแพร่

Flutter บันทึกรีลีสของ Flutter 3.38 ระบุค่าเริ่มต้นเป็น flutter.compileSdkVersion (API 36) และ flutter.targetSdkVersion (API 36) และ "แนะนำอย่างยิ่งให้ใช้ตัวแปร API level ที่ Flutter SDK จัดเตรียมไว้ในไฟล์บิลด์ของคุณ" เวอร์ชัน 3.38 ยังต้องใช้ Java 17 เป็นอย่างน้อย หากในโมดูลแอปของคุณฮาร์ดโค้ด targetSdk = 35 ไว้ การอัปเกรด Flutter จะไม่เปลี่ยนค่านี้ ดังนั้นตรวจสอบไฟล์ด้วย

React Native แบบ bare ตั้ง compileSdkVersion และ targetSdkVersion เป็น 36 ใน android/build.gradle บนเวอร์ชัน 0.81 ขึ้นไปแทบจะเสร็จแล้ว สำหรับเวอร์ชันเก่ากว่า ให้เพิ่ม android:enableOnBackInvokedCallback="false" ใน <application> ของ AndroidManifest.xml ด้วย หากไม่เพิ่ม ปุ่มย้อนกลับของฮาร์ดแวร์และท่าทางย้อนกลับจะข้ามการนำทางฝั่ง JavaScript ของคุณไป

อะไรพังบ้างเมื่อแอปเริ่ม target Android 16?

การนำทางย้อนกลับและเลย์เอาต์บนหน้าจอขนาดใหญ่พังบ่อยที่สุด เมื่อ target API 36 แล้ว Android จะหยุดเรียก onBackPressed ไม่ยอมให้ปิดโหมด edge-to-edge และไม่สนใจการล็อกการหมุนจอและการปรับขนาดบนจอแสดงผลที่กว้างอย่างน้อย 600dp

การเปลี่ยนแปลงที่สำคัญที่สุดสำหรับแอปข้ามแพลตฟอร์ม จากการเปลี่ยนแปลงพฤติกรรมของ Android 16 ของ Google:

  • Predictive back: "จะไม่มีการเรียก onBackPressed และไม่มีการส่ง KeyEvent.KEYCODE_BACK อีกต่อไป" การตั้ง android:enableOnBackInvokedCallback="false" เป็นการปิดชั่วคราว
  • Edge-to-edge: windowOptOutEdgeToEdgeEnforcement "เลิกใช้งานและถูกปิดการทำงาน" ส่วนหัวหรือปุ่มด้านล่างจึงอาจไปอยู่ใต้แถบสถานะหรือแถบท่าทาง
  • หน้าจอขนาดใหญ่: บนจอแสดงผลที่กว้าง 600dp ขึ้นไป ค่า screenOrientation, resizableActivity และข้อจำกัดอัตราส่วนภาพจะถูกละเลย ซึ่งอาจทำให้เลย์เอาต์แบบแนวตั้งอย่างเดียวถูกยืด เกมได้รับการยกเว้น PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY เป็นการปิดชั่วคราวที่ "จะไม่มีผลเมื่อ target API level 37"
  • ข้อความ: elegantTextHeight จะถูกละเลย ซึ่งอาจเปลี่ยนความสูงบรรทัดของอักษรอาหรับ ไทย ทมิฬ และอักษรอื่นๆ อีกหลายระบบ
  • เซ็นเซอร์สุขภาพ: BODY_SENSORS ถูกแทนที่ด้วยสิทธิ์ด้านสุขภาพแบบละเอียด เช่น READ_HEART_RATE

นักพัฒนาคนอื่นเจอปัญหาอะไรเมื่อย้ายไป API 36?

รายงานสาธารณะที่มีอยู่ตอนนี้แสดงปัญหาสองแบบ คือพฤติกรรมปุ่มย้อนกลับที่เปลี่ยนไปโดยไม่มีข้อผิดพลาดใดๆ และไลบรารีที่ทำให้ target level ของบันเดิลที่ Play ได้รับแตกต่างจากที่ไฟล์โปรเจกต์ระบุ

Audius (React Native 0.79) ใน pull request #14635 ทีม Audius ระบุว่า Google Play ปฏิเสธการอัปโหลด Android เวอร์ชัน 1.5.186 ทั้งสองครั้งด้วยข้อความ Target SDK of artifact is too low พวกเขาเปลี่ยน compileSdk และ targetSdk จาก 35 เป็น 36 ตั้ง build tools เป็น 36.0.0 และเพิ่ม android.suppressUnsupportedCompileSdk=36 เพราะ "RN 0.79 ล็อก AGP ไว้ที่ 8.8" นอกจากนี้ยังตั้ง enableOnBackInvokedCallback="false" เพราะหากไม่ตั้ง ปุ่มย้อนกลับ "จะข้าม React Navigation ไป" PR ถัดมาได้เอาการปิดนี้ออกหลังจากย้ายไป React Native 0.81 ซึ่งลงทะเบียน OnBackPressedCallback ให้เอง

แอป Flutter 3.35.2 ใน Flutter issue #174516 นักพัฒนาคนหนึ่งตั้ง targetSdk 36 ทั้งใน Gradle และ manifest แต่ Play Console ยังรายงานว่า "Your bundle targets SDK 34, but uses a Play Core library that cannot be used with that version." การลบไลบรารีเก่า com.google.android.play:core:1.10.3 ทำให้เกิดข้อผิดพลาด R8 "Missing classes" และเมื่อแก้แล้วก็เจอ "You can't rollout this release because it doesn't allow any existing users to upgrade to the newly added app bundles." สุดท้ายบันเดิลได้รับการยอมรับหลังจากเพิ่มกฎ keep ของ ProGuard ตั้ง minSdk อย่างชัดเจน และปิดการแยกตามภาษา ความหนาแน่น และ ABI แลกกับขนาดดาวน์โหลดที่ใหญ่ขึ้น

บทเรียนร่วมกันคือ การเปลี่ยนตัวเลขใน Gradle ยังไม่จบงาน Audius ต้องแก้พฤติกรรมขณะรันไทม์ ส่วนนักพัฒนา Flutter ต้องแก้ dependency ที่เปลี่ยนสิ่งที่ Play อ่านได้จากบันเดิล ตรวจสอบ artifact ที่บิลด์แล้วและทดสอบบนอุปกรณ์ Android 16 ไม่ใช่แค่ดูไฟล์คอนฟิก

จะตรวจสอบบิลด์ API 36 ก่อนอัปโหลดอย่างไร?

อ่าน target level จากบันเดิลรีลีสโดยตรง จากนั้นนำบันเดิลขึ้นแทร็กทดสอบภายในหรือแบบปิด แล้วลองการนำทางย้อนกลับ insets และเลย์เอาต์บนแท็บเล็ตใน Android 16 การถูกปฏิเสธหรือบั๊กในโปรดักชันเสียเวลามากกว่าการตรวจสอบเหล่านี้หลายเท่า

ตัวอย่างการทำงานจริง: แอป Expo SDK 53 ที่ target API 35 และต้องการอัปเดตอีกหนึ่งครั้ง

  1. รัน npx expo install expo@^54.0.0 --fix แล้วตามด้วย npx expo-doctor@latest และแก้ทุกอย่างที่รายงานออกมา
  2. หากโปรเจกต์ใช้ Continuous Native Generation ให้ลบโฟลเดอร์ android และ ios เดิมแล้วบิลด์ใหม่ หากไม่ใช้ ให้นำการเปลี่ยนแปลงฝั่ง native ของการอัปเกรดไปใส่เอง
  3. บิลด์ AAB สำหรับรีลีส เช่น ด้วย eas build -p android --profile production
  4. ยืนยัน target ด้วย bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion ซึ่งควรแสดงผลเป็น 36
  5. อัปโหลดขึ้นแทร็กทดสอบภายใน บนโทรศัพท์ Android 16 ให้กดย้อนกลับในทุกหน้าจอที่ซ้อนกัน ตรวจว่าส่วนหัวและปุ่มด้านล่างไม่ถูกแถบระบบบัง และหมุนแท็บเล็ตหรืออีมูเลเตอร์ที่ปรับขนาดได้
  6. โปรโมตขึ้นโปรดักชันพร้อมบันทึกรีลีสที่กล่าวถึงการแก้ไขสำหรับ Android 16

เพื่อให้การทดสอบเร็วขึ้น ใช้การตั้งค่าผู้ทดสอบจากคู่มือการทดสอบแบบปิดบน Google Play ของเรา และยืมถ้อยคำสำหรับข้อความอัปเดตจากตัวอย่างบันทึกรีลีส ของเรา หากคุณต้องการมอบหมายงานรีลีสให้ผู้อื่น บริการส่งแอปขึ้นสโตร์ ของเราครอบคลุมทั้ง Play Console และ App Store Connect ในราคา $599 สำหรับทั้งสองสโตร์ ค่าธรรมเนียมบัญชีนักพัฒนาแยกต่างหาก

คำถามที่พบบ่อย

จะเกิดอะไรขึ้นหากพลาดการขยายเวลา target API ถึง 1 พฤศจิกายน 2026?

หน้าสโตร์ปัจจุบันของคุณยังอยู่ แอปโทรศัพท์ที่ target API 35 ขึ้นไปยังพร้อมใช้งานสำหรับทั้งผู้ใช้เดิมและผู้ใช้ใหม่ แต่ Play Console จะปฏิเสธรีลีสใหม่ทุกตัว รวมถึงการแก้บั๊กเร่งด่วน จนกว่าบันเดิลจะ target Android 16 (API 36) แอปที่ต่ำกว่า API 35 จะติดตั้งได้เฉพาะบนอุปกรณ์ที่ใช้ Android เวอร์ชันนั้นหรือเก่ากว่าเท่านั้น

แอป Wear OS และ Android TV ต้อง target API 36 หรือไม่?

ไม่ต้อง ณ เดือนตุลาคม 2026 แอปใหม่และอัปเดตของ Wear OS และ Android Automotive OS ต้อง target API 35 และแอป Android TV และ Android XR ต้อง target API 34 มีเพียงแอปโทรศัพท์ แท็บเล็ต และ Android Auto ที่ต้องใช้ API 36 ข้อยกเว้นเต็มรูปแบบมีเพียงกรณีเดียว คือแอปที่เป็นส่วนตัวถาวรซึ่งแจกจ่ายภายในองค์กรเดียว

target API 36 ได้โดยไม่ต้องอัปเกรด Expo SDK หรือไม่?

บน SDK 53 คุณสามารถตั้ง targetSdkVersion และ compileSdkVersion เป็น 36 ในปลั๊กอิน expo-build-properties ได้ และนักพัฒนาบางคนก็ทำแล้ว แต่ React Native 0.79 ซึ่ง SDK 53 ใช้อยู่ ยังส่งการกดย้อนกลับผ่าน onBackPressed ซึ่ง Android 16 จะไม่เรียกอีกต่อไปเมื่อ target API 36 คุณจะต้องปิดด้วยการตั้ง enableOnBackInvokedCallback เป็น false การอัปเกรดเป็น SDK 54 คือเส้นทางที่ได้รับการรองรับ

compileSdkVersion กับ targetSdkVersion ต่างกันอย่างไร?

compileSdkVersion คือเวอร์ชัน Android API ที่ใช้คอมไพล์โค้ดของคุณ ส่วน targetSdkVersion บอก Android ว่าแอปของคุณรับพฤติกรรมของเวอร์ชันใดมาใช้ และ Google Play บังคับใช้ค่านี้ compileSdk ต้องเท่ากับหรือสูงกว่า targetSdk ดังนั้นการย้ายไป target 36 หมายถึงต้องคอมไพล์กับ API 36 หรือสูงกว่า ตัวอย่างเช่น Expo SDK 58 คอมไพล์กับ 37 และ target 36

ทำไม Play Console ยังบอกว่าแอปของฉัน target API level เก่าอยู่ ทั้งที่แก้ build.gradle แล้ว?

Play อ่าน target level จากบันเดิลที่คุณอัปโหลด ไม่ใช่จากไฟล์ซอร์ส ค่าที่ฮาร์ดโค้ดไว้ในโมดูลอื่น ปลั๊กอินที่ล้าสมัย หรือไลบรารีอย่าง Play Core เวอร์ชันเก่า อาจเปลี่ยน manifest ที่ถูกรวมแล้วได้ รัน bundletool dump manifest กับ AAB รีลีสเพื่อดู targetSdkVersion ที่แท้จริง และตรวจให้แน่ใจว่าคุณอัปโหลดบิลด์ใหม่ ไม่ใช่ artifact เก่า

แหล่งอ้างอิงและอ่านเพิ่มเติม

นโยบายมีการเปลี่ยนแปลง โปรดตรวจสอบเอกสารทางการก่อนส่งแอป

มีบิลด์ก็เอามา มีแค่ไอเดียก็ได้

มาพาแอปของคุณไปถึงเส้นชัยกัน

คอลแบบเจาะจงเพื่อหาว่าอะไรที่ยังขวางแอปของคุณไม่ให้ขึ้นสโตร์

จองคอล ↗