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

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

نظرة عامة على علاقات JDK في عملية إنشاء Gradle
الشكل 1. إنشاء علاقات JDK في إطار

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

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

كيف يمكنني اختيار حزمة JDK لتشغيل "استوديو Android"؟

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

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

  1. متغيّر البيئة STUDIO_JDK
  2. دليل studio.jdk (في حزمة توزيع "استوديو Android")
  3. jbr (JetBrains Runtime)، في الإصدار المُوزَّع من "استوديو Android" يُنصح به.
  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 نفسهما. يؤدي إعادة استخدام الخادم الدائم إلى تقليل وقت بدء تشغيل Java Virtual Machine (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
  • تنزيل حزمة تطوير Java (JDK)
  • إضافة ملف JDK محدد
  • حِزم JDK التي تم رصدها محليًا من ملف التثبيت التلقائي لحِزم JDK في نظام التشغيل

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

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

تتيح الوحدات النمطية اختيار مسار JDK الديناميكي للمشروع:

  • JAVA_HOME: يستخدم متغيّر البيئة بالاسم نفسه
  • GRADLE_LOCAL_JAVA_HOME: يستخدم الخاصية java.home فيملف .gradle/config.properties الذي يُستخدَم تلقائيًا مع JetBrains Runtime.

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

احرص على اختيار إصدار JDK أعلى من أو يساوي إصدارات JDK التي تستخدمها المكوّنات الإضافية في عملية إنشاء Gradle. لتحديد الحد الأدنى من إصدار JDK المطلوب لمكوّن Android Gradle الإضافي (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 بشكل واضح. تحديد ذلك:

  • يحدِّد هذا الخيار موقع حزمة Java Development Kit (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.

حدِّد sourceCompatibility في ملف build.gradle(.kts) الخاص بالوحدة على النحو التالي:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

رائع

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

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

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

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

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

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

يُرجى العلم أنّه يجب أن تكون قيمة targetCompatibility أكبر من أو تساوي sourceCompatibility. من الناحية العملية، يجب أن تستخدم sourceCompatibility وtargetCompatibility وjvmTarget القيمة نفسها بشكل عام. يمكنك ضبطها على النحو التالي:

Kotlin

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

رائع

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

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