يعني اشتراط مستوى API المستهدف 36 على Google Play أن أي إصدار مبني لنسخة أقدم من Android 16 لا يمكن نشره. واعتبارًا من أكتوبر 2026، يرفض Play كل تطبيق جديد وكل تحديث يستهدف مستوى أدنى، وغالبًا مع الرسالة Target SDK of artifact is too low. وكان بإمكان التطبيقات التي تلقت تحذيرًا بشأن السياسة طلب مهلة إضافية، لكن التمديد ينتهي في 1 نوفمبر 2026. يشرح هذا الدليل ما الذي لا يزال التمديد يمنحك إياه، وكيف تنقل Expo وFlutter وReact Native إلى API 36، وما الذي يتعطل عادةً بعد ذلك.
ما الذي يمنعه اشتراط مستوى API المستهدف 36 فعليًا؟
إنه يمنع عمليات الإرسال. فمنذ 31 أغسطس 2026 لا يمكنك رفع تطبيق هاتف جديد أو تحديث ما لم يستهدف API 36. أما التطبيقات المنشورة بالفعل التي تستهدف API 35 أو أعلى فتظل متاحة بالكامل، بما في ذلك للمستخدمين الجدد.
وفقًا لصفحة متطلبات مستوى API المستهدف من Google: "يجب أن تستهدف التطبيقات الجديدة وتحديثات التطبيقات Android 16 (مستوى API 36) أو أعلى لإرسالها إلى Google Play." وتختلف المتطلبات حسب نوع الجهاز، والاستثناء الكامل الوحيد هو للتطبيقات الخاصة بشكل دائم والمخصصة للتوزيع الداخلي داخل مؤسسة واحدة.
| نوع الجهاز | التطبيقات الجديدة والتحديثات (من 31 أغسطس 2026) | تظل التطبيقات القائمة متاحة بالكامل إذا استهدفت |
|---|---|---|
| الهاتف، الجهاز اللوحي، Android Auto | API 36 | API 35 أو أعلى |
| Wear OS | API 35 | API 34 أو أعلى |
| Android Automotive OS | API 35 | API 32 أو أعلى |
| Android TV | API 34 | API 33 أو أعلى |
| Android XR | API 34 | API 34 أو أعلى |
التطبيق القائم الذي يقل عن هذه المستويات "لن يكون متاحًا إلا على الأجهزة التي تعمل بنظام Android مساوٍ لمستوى API المستهدف لتطبيقك أو أقل منه." ويواصل من ثبّتوه بالفعل استخدامه كما كان. لكن من يستخدم هاتفًا أحدث تظهر له رسالة بأن التطبيق "صُمِّم لإصدار أقدم من Android."
هل لا يزال بإمكانك الحصول على التمديد قبل 1 نوفمبر 2026؟
فقط إذا أرسل Play إلى تطبيقك تحذيرًا بشأن السياسة وكان نموذج الطلب لا يزال ظاهرًا فيه. وحتى في هذه الحالة يستمر التمديد حتى 1 نوفمبر 2026 كحد أقصى، فهو أيام إضافية قليلة لإصلاح شبه مكتمل، وليس خطة جديدة.
تقول Google إنها ترسل إلى التطبيقات المتأثرة "رابط نموذج طلب التمديد عبر الإشعارات"، وإن النموذج "متاح من خلال صفحة تفاصيل التحذير أو المشكلة في صفحة Policy status." ولا تعرض Google أي نموذج على التطبيقات الملتزمة بالفعل.
- افتح Play Console واختر التطبيق.
- ابحث في البريد الوارد (Inbox) أو الإشعارات (Notifications) عن رسالة مستوى API المستهدف. إن وجدتها فاتبع الرابط الموجود فيها.
- إن لم تجدها، فانتقل إلى Policy status وافتح التحذير أو المشكلة المتعلقة بمستوى API المستهدف، وابحث عن نموذج طلب التمديد في صفحة التفاصيل.
- املأ النموذج لكل تطبيق متأثر، فلكل تطبيق تحذيره الخاص.
- سواء مُنح التمديد أم لا، خطّط لرفع إصدار يستهدف API 36 قبل 1 نوفمبر 2026. فبعد هذا التاريخ تحتاج التحديثات إلى 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 | targetSdkVersion: 36 وcompileSdkVersion: 36 في إضافة expo-build-properties |
| React Native (bare) | 0.81 | android/build.gradle | اضبط compileSdk وtargetSdk على 36، ثم عطّل الرجوع التنبؤي (predictive back) في ملف manifest |
| Flutter | 3.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) فـ"احذف مجلدَي 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 التي توفرها 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.
ما الذي يتعطل عندما يبدأ التطبيق في استهداف Android 16؟
التنقل للخلف وتخطيطات الشاشات الكبيرة هما الأكثر تعطلًا. فعند استهداف API 36 يتوقف Android عن استدعاء onBackPressed، ولا يسمح لك بإلغاء وضع العرض من الحافة إلى الحافة (edge-to-edge)، ويتجاهل أقفال الاتجاه وتغيير الحجم على الشاشات التي يبلغ عرضها 600dp على الأقل.
أهم التغييرات بالنسبة للتطبيقات متعددة المنصات، من صفحة تغييرات السلوك في Android 16 من Google:
- الرجوع التنبؤي (Predictive back): "لا يتم استدعاء
onBackPressedولم يعد يتم إرسالKeyEvent.KEYCODE_BACK." ويُعد ضبطandroid:enableOnBackInvokedCallback="false"وسيلة تعطيل مؤقتة. - العرض من الحافة إلى الحافة: أصبح
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، وأضافوا android.suppressUnsupportedCompileSdk=36، لأن "RN 0.79 يثبّت AGP 8.8". كما ضبطوا enableOnBackInvokedCallback="false"، لأن الرجوع من دونه "سيتجاوز React Navigation." ثم أزال طلب دمج لاحق هذا التعطيل بعد انتقالهم إلى React Native 0.81، الذي يسجّل OnBackPressedCallback من تلقاء نفسه.
تطبيق Flutter 3.35.2. في مشكلة Flutter رقم #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." وقُبلت الحزمة أخيرًا بعد إضافة قواعد ProGuard للإبقاء على الفئات، وضبط minSdk صراحةً، وإيقاف تقسيم الحزمة حسب اللغة والكثافة وABI، على حساب حجم تنزيل أكبر.
الدرس المشترك: تغيير الرقم في Gradle لا يُنهي المهمة. فقد اضطر فريق Audius إلى إصلاح سلوك وقت التشغيل، واضطر مطور Flutter إلى إصلاح اعتمادية غيّرت ما قرأه Play من الحزمة. تحقق من الملف المبني نفسه واختبر على جهاز يعمل بـ Android 16، لا ملف الإعدادات فقط.
كيف تتحقق من إصدار API 36 قبل رفعه؟
اقرأ المستوى المستهدف من حزمة الإصدار نفسها، ثم ضع الحزمة على مسار اختبار داخلي أو مغلق، وجرّب التنقل للخلف والهوامش الداخلية (insets) وتخطيط الجهاز اللوحي على Android 16. فالرفض أو خطأ في بيئة الإنتاج يكلّف وقتًا أكثر بكثير من هذه الفحوصات.
مثال عملي: تطبيق على Expo SDK 53 يستهدف API 35 ويحتاج إلى تحديث آخر.
- شغّل
npx expo install expo@^54.0.0 --fix، ثمnpx expo-doctor@latest، وأصلح كل ما يُبلغ عنه. - إذا كان المشروع يستخدم التوليد الأصلي المستمر (Continuous Native Generation)، فاحذف مجلدَي
androidوiosالقديمين وأعد البناء. وإلا فطبّق تغييرات الترقية الأصلية يدويًا. - ابنِ ملف AAB للإصدار، مثلًا باستخدام
eas build -p android --profile production. - تأكد من المستوى المستهدف باستخدام
bundletool dump manifest --bundle app.aab --xpath /manifest/uses-sdk/@android:targetSdkVersion. يجب أن يطبع36. - ارفعه إلى الاختبار الداخلي. على هاتف يعمل بـ Android 16، اضغط زر الرجوع في كل شاشة متداخلة، وتحقق من أن الترويسات والأزرار السفلية غير مخفية تحت أشرطة النظام، وقم بتدوير جهاز لوحي أو محاكٍ قابل لتغيير الحجم.
- رقِّ الإصدار إلى الإنتاج مع ملاحظات إصدار تذكر إصلاحات Android 16.
لتسريع الاختبار، استخدم إعداد المختبِرين في دليلنا للاختبار المغلق على Google Play، واستعر صياغة نص التحديث من أمثلة ملاحظات الإصدار لدينا. وإذا كنت تفضّل تسليم الإصدار لغيرك، فإن خدمة إرسال التطبيقات إلى المتاجر لدينا تغطي Play Console وApp Store Connect مقابل $599 للمتجرين معًا. ورسوم حسابات المطورين منفصلة.
الأسئلة الشائعة
ماذا يحدث إذا فاتني تمديد مستوى API المستهدف في 1 نوفمبر 2026؟
تبقى صفحة تطبيقك الحالية منشورة. ويظل تطبيق الهاتف الذي يستهدف API 35 أو أعلى متاحًا للمستخدمين الحاليين والجدد. لكن Play Console سيرفض أي إصدار جديد، بما في ذلك إصلاحات الأعطال العاجلة، حتى تستهدف الحزمة Android 16 (API 36). أما التطبيقات التي تستهدف أقل من API 35 فلا يمكن تثبيتها إلا على الأجهزة التي تعمل بإصدار Android ذاك أو أقدم.
هل تحتاج تطبيقات Wear OS وAndroid TV إلى استهداف API 36؟
لا. اعتبارًا من أكتوبر 2026، يجب أن تستهدف التطبيقات الجديدة والتحديثات على Wear OS وAndroid Automotive OS مستوى API 35، ويجب أن تستهدف تطبيقات Android TV وAndroid XR مستوى API 34. فقط تطبيقات الهاتف والجهاز اللوحي وAndroid Auto تحتاج إلى API 36. والاستثناء الكامل الوحيد هو التطبيق الخاص بشكل دائم والموزّع داخل مؤسسة واحدة.
هل يمكنني استهداف API 36 دون ترقية Expo SDK؟
على SDK 53 يمكنك ضبط targetSdkVersion وcompileSdkVersion على 36 في إضافة expo-build-properties، وقد فعل ذلك بعض المطورين. لكن React Native 0.79، الذي يستخدمه SDK 53، لا يزال يمرّر ضغطات الرجوع عبر 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.
لماذا لا يزال Play Console يقول إن تطبيقي يستهدف مستوى API أقدم بعد أن غيّرت build.gradle؟
يقرأ Play المستوى المستهدف من الحزمة التي ترفعها، لا من ملفات المصدر. فقد تغيّر قيمةٌ ثابتة في وحدة أخرى، أو إضافةٌ قديمة، أو مكتبةٌ مثل Play Core القديمة ملفَ manifest المدمج. شغّل bundletool dump manifest على ملف AAB للإصدار لترى قيمة targetSdkVersion الفعلية، وتأكد من أنك رفعت الإصدار الجديد لا ملفًا قديمًا.
المصادر وقراءات إضافية
السياسات تتغير. راجع الوثائق الرسمية قبل النشر.
- متطلبات مستوى API المستهدف لتطبيقات Google Play (مساعدة Play Console) ↗تم التحقق في 30 أكتوبر 2026
- تغييرات السلوك: التطبيقات التي تستهدف Android 16 أو أعلى (Android Developers) ↗تم التحقق في 30 أكتوبر 2026
- سجل تغييرات Expo SDK 54 ↗تم التحقق في 30 أكتوبر 2026
- الجديد في Flutter 3.38 ↗تم التحقق في 30 أكتوبر 2026
- fix(mobile): استهداف Android SDK 36، طلب الدمج #14635 في AudiusProject/apps ↗تم التحقق في 30 أكتوبر 2026
- Flutter 3.35.2 يفرض SDK 34 رغم التجاوزات الصريحة، مشكلة flutter/flutter رقم #174516 ↗تم التحقق في 30 أكتوبر 2026
لنوصل تطبيقك إلى خط النهاية.
مكالمة مركّزة لتحديد ما يفصل تطبيقك عن صفحة منشورة في المتجر.
احجز مكالمة ↗

