طرق الواجهة الافتراضية في Android: خطأ Nougat وحله (Kotlin)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: خطأ «غير مرئي» يفسد عملية البناء

\n\n

أنت تكتب تطبيقًا بلغة Kotlin، كل شيء يسير على ما يرام، ولكن فجأة - بام! - يسلط Android Studio الضوء على سطر باللون الأحمر، ويظهر في سجلات البناء رسالة مخيفة:

\n\n
طرق الواجهة الافتراضية مدعومة فقط بدءًا من Android 7.0 (Nougat)
\n\n

موقف مألوف؟ إذا كنت مبتدئًا في تطوير Android، فقد يبدو هذا الخطأ وكأنه لغز حقيقي. فأنت فقط تستخدم واجهة بطريقة افتراضية - ما الذي يمكن أن يحدث خطأ؟

\n\n

في الواقع، تكمن المشكلة في عدم التوافق بين minSdkVersion لتطبيقك وإمكانيات لغة Kotlin (التي تستخدم داخليًا ميزات Java 8).

\n\n

في هذه المقالة، سنفهم سبب ظهور هذا الخطأ، وكيفية إصلاحه، وكيفية كتابة كود حديث دون فقدان دعم الأجهزة القديمة. هيا بنا!

\n\n

ما هي «طريقة الواجهة الافتراضية» ولماذا ظهرت؟

\n\n

لنبدأ بالأساسيات. في الإصدارات القديمة من Java (قبل 8)، كانت الواجهات تحتوي فقط على تعريفات للطرق - بدون تنفيذ. ولكن مع ظهور Java 8، أصبح من الممكن إضافة طرق مع جسم (ما يسمى الطرق الافتراضية) إلى الواجهات.

\n\n

Kotlin، كونها لغة حديثة، تدعم هذا المفهوم بالكامل. على سبيل المثال:

\n\n
interface Logger {\n    fun log(message: String)\n    fun logWithTimestamp(message: String) {\n        log("${System.currentTimeMillis()}: $message")\n    }\n}
\n\n

هنا logWithTimestamp هي طريقة واجهة افتراضية. إذا قام class بتنفيذ Logger، فلا داعي لإعادة تعريف هذه الطريقة، بل يمكن استخدام التنفيذ «الافتراضي». مريح، أليس كذلك؟

\n\n

المشكلة هي أنه على مستوى byte-code، تتطلب هذه الطرق دعمًا من نظام التشغيل. وهذا الدعم ظهر فقط في Android 7.0 (Nougat, API 24).

\n\n

لماذا يظهر الخطأ في Android Studio؟

\n\n

عندما تقوم بتعيين minSdkVersion أقل من 24 (مثل 21 أو 23)، يرى المترجم أن تطبيقك يمكن أن يعمل على أجهزة تعمل بنظام Android 6.0 أو 5.0. وفي هذه الإصدارات، الطرق الافتراضية للواجهات غير مدعومة على مستوى الآلة الافتراضية (Dalvik/ART).

\n\n

ولهذا السبب يظهر المترجم الخطأ:

\n\n
طرق الواجهة الافتراضية مدعومة فقط بدءًا من Android 7.0 (Nougat)
\n\n

إنه يقول حرفيًا: «لا يمكنني ترجمة هذا الكود لأن تطبيقك قد يعمل على جهاز لا يعرف كيفية تنفيذ هذه الطرق».

\n\n

السيناريو النموذجي لحدوث ذلك

\n\n

غالبًا ما يظهر الخطأ في حالتين:

\n\n
    \n
  • استخدام مجموعات Kotlin (مثل listOf, mapOf) - تحتوي على طرق افتراضية.
  • \n
  • استخدام مكتبات خارجية تحتوي داخليًا على واجهات ذات طرق افتراضية.
  • \n
  • العمل مع Android Jetpack (مثل LifecycleObserver أو DefaultLifecycleObserver).
  • \n
\n\n

قد لا تكتب حتى واجهات خاصة بك تحتوي على طرق افتراضية - سيظل الخطأ يظهر إذا كانت أي من التبعيات تستخدمها.

\n\n

كيفية إصلاح الخطأ؟ 3 طرق مجربة

\n\n

دعنا نستعرض جميع الحلول الممكنة - من الأبسط إلى الأكثر مرونة.

\n\n

الطريقة 1: رفع minSdkVersion إلى 24

\n\n

هذا هو الحل الأكثر مباشرة. إذا كان تطبيقك لا يجب أن يدعم الأجهزة الأقدم من Android 7.0، فما عليك سوى تغيير minSdkVersion في ملف build.gradle (على مستوى الوحدة):

\n\n
android {\n    ...\n    defaultConfig {\n        minSdkVersion 24\n        targetSdkVersion 34\n        ...\n    }\n}
\n\n

الإيجابيات: سريع، نظيف

المدونات

توصيات الكتب