إصدارات Java في إصدارات Android

سواء كان رمز المصدر مكتوبًا بلغة Java أو Kotlin أو كليهما، هناك عدة أماكن يجب فيها اختيار إصدار لغة JDK أو Java لتصميمك.

نظرة عامة على علاقات JDK في إصدار Gradle

مسرد المصطلحات

حزمة تطوير Java (JDK)
تحتوي حزمة تطوير Java (JDK) على ما يلي:
  • الأدوات، مثل التجميع والمحلل ومنشئ الأرشيف. وتُستخدم هذه المعلومات وراء الكواليس أثناء التصميم لإنشاء التطبيق.
  • المكتبات التي تحتوي على واجهات برمجة تطبيقات يمكنك ��لبها من رمز المصدر بلغة Kotlin أو Java. يُرجى العلم أنّ بعض الدوال غير متوفرة على Android.
  • آلة Java الافتراضية (JVM)، وهي عبارة عن مترجم ينفّذ تطبيقات Java. ويمكنك استخدام JVM لتشغيل بيئة التطوير المتكاملة (IDE) من "استوديو Android" وأداة إنشاء Gradle. ولا يتم استخدام JVM على أجهزة Android أو أدوات المحاكاة.
وقت تشغيل JetBrains (JBR)
وقت تشغيل JetBrains (JBR) هو نظام JDK محسّن يتم توزيعه من خلال "استوديو Android". يتضمّن هذا الإصدار ا��عديد من التحسينات لاستخدامها في "استوديو YouTube" ومنتجات JetBrains ذات الصلة، ولكن يمكن استخدامها أيضًا لتشغيل تطبيقات Java أخرى.

كيف أختار JDK لتشغيل "استوديو Android"؟

ننصحك باستخدام JBR لتشغيل "استوديو Android". تم نشر هذه الأداة واستخدامها لاختبار "استوديو Android"، كما أنّها تشمل تحسينات لتعزيز الاستخدام الأمثل لـ "استوديو Android". للتأكد من ذلك، لا تضبط متغيّر البيئة STUDIO_JDK.

تبحث النصوص البرمجية لبدء التشغيل في "استوديو Android" عن JVM بالترتيب التالي:

  1. متغيّر بيئة واحد (STUDIO_JDK)
  2. دليل studio.jdk (في توزيعة "استوديو Android")
  3. دليل jbr (وقت تشغيل JetBrains) في توزيع Android Studio. يُنصح به.
  4. متغيّر بيئة واحد (JDK_HOME)
  5. متغيّر بيئة واحد (JAVA_HOME)
  6. java قابل للتنفيذ في متغيّر البيئة PATH.

كيف أختار نظام JDK الذي يدير إصدارات Gradle الخاصة بي؟

إذا كنت تشغِّل Gradle باستخدام الأزرار في "استوديو Android"، يُستخدَم ملف JDK الذي تم ضبطه في إعدادات "استوديو Android" لتشغيل Gradle. إذا شغّلت Gradle في وحدة طرفية، سواء داخل "استوديو Android" أو خارجه، سيحدِّد متغيّر بيئة JAVA_HOME (في حال تحديده) نظام JDK الذي يشغِّل نصوص Gradle البرمجية. إذا لم يتم ضبط السياسة JAVA_HOME، يتم استخدام الأمر java في متغيّر بيئة PATH.

للحصول على النتائج الأكثر اتساقًا، احرص على ضبط متغيّر بيئة JAVA_HOME وضبط Gradle JDK في "استوديو Android" على نفس JDK.

عند تشغيل التصميم، ينشئ Gradle عملية تسمى برنامج خفي لتنفيذ الإنشاء الفعلي. ويمكن إعادة استخدام هذه العملية، طالما أن التصميمات تستخدم نفس إصدار JDK وGradle. فإعادة استخدام برنامج خفي يقلل الوقت اللازم لبدء تشغيل جهاز JVM جديد وتهيئة نظام التصميم.

فإذا بدأت إصدارات باستخدام إصدارات JDK أو Gradle مختلفة، يتم إنشاء برامج خفية إضافية، ما يستهلك وحدة معالجة مركزية (CPU) أكبر وذاكرة أكبر.

ضبط Gradle JDK في "استوديو Android"

لتعديل إعدادات Gradle JDK للمشروع الحالي، افتح إعدادات Gradle من File (ملف) (أو Android Studio على نظام التشغيل macOS) > Settings (الإعدادات) > Build, Execution, Deployment > Build Tools > Gradle. تحتوي القائمة المنسدلة Gradle JDK على الخيارات التالية للاختيار من بينها:

  • وحدات ماكرو مثل JAVA_HOME وGRADLE_LOCAL_JAVA_HOME
  • إدخالات جدول JDK بتنسيق vendor-version مثل jbr-17 التي يتم تخزينها في ملفات إعداد Android
  • تنزيل ملف JDK
  • إضافة ملف JDK محدد
  • ملفات JDK التي تم اكتشافها محليًا من دليل تثبيت JDK الافتراضي لنظام التشغيل

يتم حفظ الخيار المحدَّد في الخيار gradleJvm ضمن ملف .idea/gradle.xml الخاص بالمشروع، ويتم استخدام دقة مسار JDK لتشغيل Gradle عند البدء من خلال "استوديو Android".

الشكل 1. إعدادات Gradle JDK في "استوديو Android"

تُفعِّل وحدات الماكرو اختيار مسار JDK للمشروع الديناميكي:

  • JAVA_HOME: يستخدم متغير البيئة الذي يحمل الاسم نفسه
  • GRADLE_LOCAL_JAVA_HOME: يستخدم السمة java.home في ملف .gradle/config.properties الذي يتم ضبطه تلقائيًا على "وقت تشغيل JetBrains".

يتم استخدام دالة JDK المحدَّدة لتشغيل إصدار Gradle وحل مراجع واجهة برمجة تطبيقات JDK، وذلك عند تعديل النصوص البرمجية للإنشاء ورمز المصدر. يُر��ى العِلم أنّ السياسة compileSdk المحدّدة ستقيّد بشكل أكبر رموز Java التي ستكون متاحة عند تعديل رمز المصدر وإنشائه.

تأكد من اختيار إصدار JDK أعلى من أو يساوي إصدارات JDK المستخدمة بواسطة المكونات الإضافية التي تستخدمها في إصدار Gradle الخاص بك. لتحديد الحد الأدنى المطلوب لإصدار JDK للمكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP)، يُرجى الاطّلاع على جدول التوافق في ملاحظات الإصدار.

على سبيل المثال، يتطلب الإصدار 8.x من المكوّن الإضافي لنظام Gradle المتوافق مع Android تثبيت JDK 17. إذا حاولت تشغيل إصدار Gradle الذي يستخدمه مع إصدار سابق من JDK، فسيتم الإبلاغ عن رسالة مثل:

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /usr/local/buildtools/java/jdk11
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

ما هي واجهات برمجة تطبيقات Java التي يمكنني استخدامها في رمز مصدر Java أو Kotlin؟

يمكن لتطبيق Android استخدام بعض واجهات برمجة التطبيقات المحددة في JDK، لكن ليس كلها. تحدد حزمة تطوير البرامج (SDK) لنظام التشغيل Android عمليات تنفيذ العديد من دوال مكتبة Java كجزء من واجهات برمجة التطبيقات المتاحة لها. تحدّد السمة compileSdk إصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android الذي سيتم استخدامه عند تجميع رمز المصدر بلغة Kotlin أو Java.

Kotlin

android {
    ...
    compileSdk = 33
}

رائع

android {
    ...
    compileSdk 33
}

يتوافق كل إصدار من Android مع إصدار معيّن من ملف JDK ومجموعة فرعية من واجهات برمجة تطبيقات Java المتاحة. إذا كنت تستخدم واجهة برمجة تطبيقات Java API متوفّرة في compileSdk غير متوفّرة في minSdk المحدَّد، قد تتمكّن من استخدام واجهة برمجة التطبيقات في الإصدار السابق من Android من خلال عملية تُعرَف باسم إزالة المحتوى. راجِع واجهات برمجة تطبيقات Java 11 والإصدارات الأحدث المتاحة من خلال إزالة التصنيف للاطّلاع على واجهات برمجة التطبيقات المتوافقة.

استخدِم هذا الجدول لتحديد إصدار Java الذي تتوافق مع كل واجهة برمجة تطبيقات Android، وأين يمكنك العثور على تفاصيل حول توفُّر واجهات برمجة تطبيقات Java.

Android Java الميزات المتاحة في واجهة برمجة التطبيقات واللغات
14 (واجهة برمجة التطبيقات 34) 17 المكتبات الأساسية
13 (واجهة برمجة التطبيقات 33) 11 المكتبات الأساسية
12 (واجهة برمجة التطبيقات 32) 11 Java API
11 والإصدارات الأدنى إصدارات Android

أي JDK يجمع رمز مصدر Java؟

تحتوي سلسلة أدوات Java على JDK على المحول البرمجي لـ Java، والذي يُستخدم لتجميع أي رمز مصدر لـ Java. يُشغِّل JDK أيضًا اختبارات javadoc والوحدة أثناء عملية الإنشاء.

يتم ضبط سلسلة الأدوات تلقائيًا على JDK المستخدَم لتشغيل Gradle. في حال استخدام الإعداد التلقائي وتشغيل الإصدار على أجهزة مختلفة (على سبيل المثال، جهازك المحلي وخادم الدمج المستمر المنفصل)، يمكن أن تختلف نتائج الإصدار في حال استخدام إصدارات مختلفة من JDK.

لإنشاء إصدار أكثر اتساقًا، يمكنك تحديد إصدار سلسلة أدوات Java بشكل واضح. تحديد ذلك:

  • تحديد موقع JDK متوافق على النظام الذي يُشغِّل الإصدار
    • في حال عدم توفّر JDK متوافق (وتحديد برنامج تعيين سلسلة أدوات)، يتم تنزيل أحد البرامج.
  • تعرض واجهات برمجة تطبيقات Java لسلسلة الأدوات لتنفيذ الطلبات من رمز المصدر.
  • لتجميع مصدر Java باستخدام إصدار لغة Java.
  • يتم توفير القيم التلقائية لكل من sourceCompatibility وtargetCompatibility.

ننصحك بأن تحدّد دائمًا سلسلة أدوات Java، وأن تتأكّد من تثبيت JDK المحدّد، أو إضافة أداة تعيين سلسلة الأدوات إلى تصميمك.

يمكنك تحديد سلسلة الأدوات سواء كان رمز المصدر مكتوبًا بلغة Java أو Kotlin أو كليهما. حدِّد سلسلة الأدوات في المستوى الأعلى من ملف build.gradle(.kts) الخاص بالوحدة.

حدد إصدار سلسلة أدوات Java على النحو التالي:

Kotlin

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

رائع

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

ويمكن إجراء ذلك إذا كان المصدر هو Kotlin أو Java أو مزيجًا من الاثنين معًا.

يمكن أن يكون إصدار JDK لسلسلة الأدوات هو نفسه إصدار JDK المستخدم لتشغيل Gradle، ولكن ضع في اعتبارك أنهما يخدمان أغراضًا مختلفة.

ما هي ميزات مصدر لغة Java التي يمكنني استخدامها في رمز مصدر Java؟

تحدّد السمة sourceCompatibility ميزات لغة Java والمتاحة أثناء تجميع مصدر Java. ولا يؤثر ذلك في مصدر لغة Kotlin.

إذا لم يتم تحديده، سيتم ضبطه تلقائيًا على سلسلة أدوات Java أو JDK المستخدمة لتشغيل Gradle. ننصحك بأن تحدّد دائمًا بشكل واضح سلسلة أدوات (مفضّلة) أو sourceCompatibility.

حدِّد sourceCompatibility في ملف build.gradle(.kts) للوحدة.

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

رائع

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

ما هي ميزات Java الثنائية التي يمكن استخدامها عند تجميع مصدر Kotlin أو Java؟

ويؤدي تحديد targetCompatibility وjvmTarget إلى تحديد إصدار تنسيق فئة Java المستخدَم عند إنشاء رمز بايت لمصدر Java وKotlin المجمّع، على التوالي.

كانت بعض ميزات Kotlin موجودة قبل إضافة ميزات Java المكافئة. كان على المبرمجين الأوائل لـ Kotlin إنشاء طريقتهم الخاصة لتمثيل ميزات Kotlin. تمت إضافة بعض هذه الميزات لاحقًا إلى Java. وفي مستويات jvmTarget اللاحقة، قد يستخدم المحول البرمجي لـ Kotlin ميزة Java مباشرةً، ما قد يؤدي إلى تحسين الأداء.

يتم ضبط targetCompatibility تلقائيًا على القيمة نفسها مثل sourceCompatibility، ولكن في حال تحديدها، يجب أن تكون أكبر من أو تساوي sourceCompatibility.

يتم ضبط jvmTarget تلقائيًا على إصدار toolchain.

تتوافق إصدارات Android المختلفة مع إصدارات مختلفة من Java. يمكنك الاستفادة من ميزات Java الإضافية من خلال زيادة targetCompatibility وjvmTarget، ولكن قد يفرض ذلك عليك أيضًا زيادة الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android لضمان إتاحة الميزة.

Kotlin

android {
    compileOptions {
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

رائع

android {
    compileOptions {
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget '17'
    }
}