إصدارات 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 Runtime (JBR) هو نظام JDK محسَّن يتم توزيعه من خلال "استوديو Android". وتتضمّن هذه الترقية العديد من التحسينات لاستخدامها في "استوديو YouTube" ومنتجات JetBrains ذات الصلة، ولكن يمكن استخدامها أيضًا لتشغيل تطبيقات Java الأخرى.

كيف يمكنني اختيار ملف JDK لتشغيل Android Studio؟

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

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

  1. متغير واحد (STUDIO_JDK) للبيئة
  2. دليل studio.jdk (في توزيع Android Studio)
  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 Studio على JDK نفسه.

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

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

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

لتعديل إعدادات Gradle JDK للمشروع الحالي، افتح إعدادات Gradle من File (أو Android Studio على نظام التشغيل 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".

الشكل 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 لمكوّن Android Gradle الإضافي (AGP)، يمكنك الاطّلاع على جدول التوافق في ملاحظات الإصدار.

على سبيل المثال، يتطلب الإصدار 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/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 عمليات تنفيذ العديد من دوال مكتبة جافا كجزء من واجهات برمجة التطبيقات المتاحة لها. تحدّد السمة compileSdk إصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android الذي سيتم استخدامه عند تجميع رمز المصدر بلغة Kotlin أو Java.

Kotlin

android {
    ...
    compileSdk = 33
}

رائع

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 toolchain على أداة التحويل البرمجي لـ Java المستخدمة لتجميع أي رمز مصدر Java. يقوم JDK أيضًا بتشغيل اختبارات javadoc واختبارات الوحدة أثناء الإصدار.

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

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

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

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

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

إذا كان رمز المصدر مكتوبًا بلغة Java فقط، عليك تحديد إصدار سلسلة أدوات Java على النحو التالي:

Kotlin

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

رائع

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

إذا كان المصدر هو Kotlin فقط أو مزيج من Kotlin وJava، فحدد إصدار أداة Java على النحو التالي:

Kotlin

kotlin {
    jvmToolchain(17)
}

رائع

kotlin {
    jvmToolchain 17
}

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

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

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

وفي حال عدم تحديد ذلك، سيتم ضبط القيمة التلقائية على Java toolchain أو 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، ولكن هذا قد يفرض عليك أيضًا زيادة الحد الأدنى من إصدار Android SDK لضمان توفُّر هذه الميزة.

Kotlin

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

رائع

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