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

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

نظرة عامة على علاقات JDK في إصدار Gradle
الشكل 1. علاقات حزمة تطوير البرامج (JDK) في الإصدار

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

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

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

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

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

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

كيف يمكنني اختيار JDK الذي يتم تشغيل إصدارات Gradle عليه؟

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

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

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

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

إعداد JDK لنظام Gradle في "استوديو Android"

لتعديل إعدادات Gradle JDK الحالية للمشروع، افتح إعدادات Gradle من ملف (أو استوديو Android على نظام التشغيل macOS) > الإعدادات > الإنشاء والتنفيذ والنشر > أدوات الإنشاء > Gradle. تحتوي القائمة المنسدلة Gradle JDK على الخيارات التالية للاختيار من بينها:

  • وحدات ماكرو مثل JAVA_HOME وGRADLE_LOCAL_JAVA_HOME
  • إدخالات جدول JDK بالتنسيق vendor-version مثل jbr-17، والتي يتم تخزينها في ملفات إعداد Android
  • تنزيل حزمة تطوير البرامج (JDK)
  • إضافة حزمة تطوير برامج Java محدّدة
  • حِزم 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 هو الإعداد التلقائي له.

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

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

على سبيل المثال، يتطلّب الإصدار 8.x من المكوّن الإضافي لنظام Gradle المتوافق مع Android الإصدار 17 من JDK. إذا حاولت تنفيذ إصدار 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 = 33
}

Groovy

android {
    ...
    compileSdk 33
}

يتوافق كل إصدار من نظام التشغيل Android مع إصدار محدّد من JDK ومجموعة فرعية من واجهات برمجة تطبيقات Java المتاحة. إذا كنت تستخدم واجهة برمجة تطبيقات Java متوفّرة في 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 المتوافقة على النظام الذي يتم تشغيل الإصدار عليه
    • إذا لم يكن هناك حزمة تطوير برامج Java متوافقة (وتم تحديد أداة تحليل لسلسلة الأدوات)، يتم تنزيل إحدى الحزم.
  • تعرض واجهات برمجة تطبيقات Java الخاصة بسلسلة الأدوات لإجراء طلبات من رمز المصدر.
  • يُجمّع مصدر Java باستخدام إصدار لغة Java.
  • توفّر هذه السمة القيم التلقائية لكل من sourceCompatibility وtargetCompatibility.

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

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

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

Kotlin

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

Groovy

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
    }
}

Groovy

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"
    }
}

Groovy

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

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