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

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

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

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

حزمة تطوير 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" (يُنصح به).
  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 مختلفة، يتم إنشاء برامج خفية إضافية، ما يؤدي إلى استهلاك المزيد من وحدة المعالجة المركزية والذاكرة.

إعداد Gradle JDK في "استوديو Android"

لتعديل إعدادات Gradle JDK للمشروع الحالي، افتح إعدادات Gradle من ملف (أو استوديو Android على macOS) > الإعدادات > الإصدار والتنفيذ والنشر > أدوات الإصدار > 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".

الشكل 2. إعدادات 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، اطّلِع على جدول التوافق في ملاحظات الإصدار.

على سبيل المثال، يتطلّب الإصدار 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/jdk
      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 = 36
}

أنيق

android {
    ...
    compileSdk 36
}

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

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

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

ما هي حزمة JDK التي تترجم رمز المصدر Java؟

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

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

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

  • العثور على حزمة JDK متوافقة على النظام الذي يشغّل عملية الإصدار
    • إذا لم تكن هناك حزمة 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.