مقدمة: خطأ «غير مرئي» يفسد عملية البناء
\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\nKotlin، كونها لغة حديثة، تدعم هذا المفهوم بالكامل. على سبيل المثال:
\n\ninterface Logger {\n fun log(message: String)\n fun logWithTimestamp(message: String) {\n log("${System.currentTimeMillis()}: $message")\n }\n}\n\nهنا logWithTimestamp هي طريقة واجهة افتراضية. إذا قام class بتنفيذ Logger، فلا داعي لإعادة تعريف هذه الطريقة، بل يمكن استخدام التنفيذ «الافتراضي». مريح، أليس كذلك؟
المشكلة هي أنه على مستوى 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طرق الواجهة الافتراضية مدعومة فقط بدءًا من 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كيفية إصلاح الخطأ؟ 3 طرق مجربة
\n\nدعنا نستعرض جميع الحلول الممكنة - من الأبسط إلى الأكثر مرونة.
\n\nالطريقة 1: رفع minSdkVersion إلى 24
\n\nهذا هو الحل الأكثر مباشرة. إذا كان تطبيقك لا يجب أن يدعم الأجهزة الأقدم من Android 7.0، فما عليك سوى تغيير minSdkVersion في ملف build.gradle (على مستوى الوحدة):
android {\n ...\n defaultConfig {\n minSdkVersion 24\n targetSdkVersion 34\n ...\n }\n}\n\nالإيجابيات: سريع، نظيف