גרסאות Java בגרסאות build של Android

בין אם קוד המקור נכתב ב-Java, ב-Kotlin או בשניהם, יש כמה מקומות שבהם צריך לבחור שפת JDK או Java עבור ה-build שלך.

סקירה כללית של קשרי JDK ב-build של Gradle

מילון מונחים

Java Development Kit (JDK)
ערכת הפיתוח של Java (JDK) כולל:
  • כלים, כגון מהדר, כלי ליצירת פרופילים ויוצר ארכיון. אנחנו משתמשים בהן מאחורי הקלעים במהלך ה-build כדי יוצרים את האפליקציה.
  • ספריות שמכילות ממשקי API שאפשר לקרוא אליהם קוד מקור של Kotlin או Java. שימו לב שלא כל הפונקציות זמינה ב-Android.
  • מכונה וירטואלית ב-Java (JVM), תרגום שמבצע אפליקציות Java. אתם משתמשים ב-JVM כדי להריץ את Android Studio IDE ואת כלי ה-build של Gradle. לא נעשה שימוש ב-JVM ב-Android או אמולטורים.
JetBrains Runtime (JBR)
זמן הריצה של JetBrains (JBR) הוא JDK משופר, שמופץ באמצעות Android Studio. התוכנית כוללת כמה אופטימיזציות לשימוש ב-Studio וב-JetBrains קשורות מוצרים, אבל ניתן להשתמש בהם גם כדי להריץ יישומים אחרים של Java.

איך בוחרים JDK כדי להפעיל את Android Studio?

כדי להפעיל את Android Studio, מומלץ להשתמש ב-JBR. היא פרוסה שמשמש לבדיקת Android Studio, והוא כולל שיפורים כדי להשיג ביצועים אופטימליים שימוש ב-Android Studio. כדי לוודא זאת, אין להגדיר את STUDIO_JDK במשתנה הסביבה.

הסקריפטים להפעלה של Android Studio מחפשים JVM בגרסה הבאה: הזמנה:

  1. משתנה סביבה אחד (STUDIO_JDK)
  2. הספרייה studio.jdk (בהפצה של Android Studio)
  3. ספריית jbr (JetBrains Runtime), ב-Android Studio של הסבירות. מומלץ.
  4. משתנה סביבה אחד (JDK_HOME)
  5. משתנה סביבה אחד (JAVA_HOME)
  6. קובץ הפעלה אחד (java) במשתנה הסביבה PATH

איך בוחרים איזה JDK יריץ את גרסאות ה-build שלי של Gradle?

אם אתם מריצים את Gradle באמצעות הלחצנים של Android Studio, ה-JDK מוגדר כדי להפעיל את Gradle, ההגדרות של Android Studio משמשות. אם אתם משתמשים ב-Gradle בטרמינל, בתוך Android Studio או מחוץ לו, משתנה הסביבה JAVA_HOME (if set) קובע איזה JDK מריץ את הסקריפטים של Gradle. אם JAVA_HOME אינה מוגדרת, היא משתמשת בפקודה java בסביבת PATH מותאם אישית.

כדי לקבל תוצאות עקביות ככל האפשר, חשוב להגדיר את הפרמטר JAVA_HOME משתנה הסביבה, הגדרת Gradle JDK ב-Android Studio לאותה הגדרה JDK.

במהלך ה-build שלך, Gradle יוצרת תהליך שנקרא daemon לבצע את ה-build בפועל. אפשר לעשות שימוש חוזר בתהליך הזה, כל עוד ממשקי ה-build משתמשים באותה גרסה של JDK ו-Gradle. שימוש חוזר דימון (daemon) מפחית את הזמן לביצוע משימות JVM חדש ולאתחול מערכת ה-build.

אם מתחילים גרסאות build עם גרסאות JDK או Gradle שונות, דימוןים נוצרים והם צורכים יותר משאבי מעבד (CPU) וזיכרון.

הגדרה של Gradle JDK ב-Android Studio

כדי לשנות את ההגדרות האישיות של 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 שלו משמשת להרצה שדרוג כשמתחילים להשתמש ב-Android Studio.

איור 1. ההגדרות של Gradle JDK ב-Android Studio.

פקודות המאקרו מאפשרות בחירת נתיב JDK דינמית של הפרויקט:

  • JAVA_HOME: משתמש במשתנה הסביבה עם אותו שם
  • GRADLE_LOCAL_JAVA_HOME: משתמש בנכס java.home ב- הקובץ .gradle/config.properties שברירת המחדל שלו היא 'זמן ריצה של JetBrains'.

ה-JDK שנבחר משמש להפעלת ה-build של Gradle ולפתרון הבעיה של JDK API בזמן עריכת הסקריפטים של ה-build ואת קוד המקור. שימו לב שצוין compileSdk יגביל עוד יותר את סמלי Java שיהיו בזמן העריכה והבנייה של קוד המקור.

צריך לבחור גרסת JDK גבוהה יותר מ-JDK או שווה לה הגרסאות שבהן נעשה שימוש ביישומי הפלאגין שבהם אתם משתמשים ב-build של Gradle. כדי לקבוע את לגרסת JDK המינימלית הנדרשת ל-Android Gradle Plugin (AGP), אפשר לעיין ב בנתוני הגרסה,

לדוגמה, כדי להשתמש בפלאגין של Android Gradle בגרסה 8.x, נדרש JDK 17. אם תנסו להריץ build של 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`.

באילו ממשקי API של Java אפשר להשתמש בקוד המקור של Java או Kotlin?

אפליקציה ל-Android יכולה להשתמש בחלק מממשקי ה-API שמוגדרים ב-JDK, אבל לא בכולם מהם. ב-Android SDK מוגדרים הטמעות של פונקציות רבות בספריית Java כחלק מממשקי ה-API שזמינים לה. המאפיין compileSdk מציין גרסת Android SDK לשימוש במהלך הידור של קוד המקור ב-Kotlin או Java.

Kotlin

android {
    ...
    compileSdk = 33
}

מגניב

android {
    ...
    compileSdk 33
}

כל גרסה של Android תומכת בגרסה ספציפית של ה-JDK ובקבוצת משנה של של ממשקי ה-API שלה ב-Java. אם אתם משתמשים בממשק API של Java שזמין ב- compileSdk שלא זמין ברשימה שצוינה minSdk, ייתכן שתוכלו להשתמש ב-API בגרסה הקודמת של Android באמצעות תהליך שנקרא הסרת סוכרים. לקבלת מידע נתמך, ראו ממשקי API של Java 11 ואילך שזמינים לאחר הסרת סוכרים ממשקי API.

ניתן להשתמש בטבלה הזו כדי לקבוע איזו גרסת Java נתמכת על ידי לגבי כל ממשק API של Android, ואיפה ניתן למצוא פרטים על ממשקי ה-API הזמינים של Java.

Android Java תמיכה בתכונות API ושפה
14 (API 34) 17 ספריות ליבה
13 (API 33) 11 ספריות ליבה
12 (API 32) 11 ב-Java API
11 ומטה גרסאות Android

איזה JDK אוסף את קוד המקור שלי ב-Java?

ה-JDK בצרור הכלים של Java מכיל את המהדר של Java שמשמש להרכבת כל קוד Java קוד המקור. ה-JDK הזה מריץ גם בדיקות JavaScript ובדיקות יחידה במהלך ה-build.

ברירת המחדל של ה-toolchain היא ה-JDK שמשמש להרצת Gradle. אם משתמשים בברירת המחדל ולהריץ build במכונות שונות (לדוגמה, שרת אינטגרציה רציפה (CI) נפרד), התוצאות של ה-build. יכול להיות שונה אם משתמשים בגרסאות שונות של JDK.

כדי ליצור build עקבי יותר, אפשר לציין במפורש גרסת Java Toolchain. מציין את הפרטים הבאים:

  • איתור JDK תואם במערכת שמפעילה את ה-build.
    • אם לא קיים JDK תואם (ומוגדר מקודד של 'צרור כלים'), מוריד אחת.
  • חשיפת ממשקי ה-API של Java ב-toolchain לקריאות מקוד מקור.
  • מבצעת הידור של מקור Java באמצעות גרסת שפת ה-Java שלו.
  • ברירות המחדל של ציוד עבור sourceCompatibility ו- targetCompatibility

מומלץ תמיד לציין את 'צרור הכלים של Java' ולהקפיד שה-JDK שצוין מותקן, או מוסיפים מקודד כלים ל-build שלך.

תוכלו לציין את ה-toolchain אם קוד המקור נכתב ב-Java, Kotlin, או שניהם. מציינים את 'צרור הכלים' ברמה העליונה של המודול קובץ build.gradle(.kts).

מציינים את גרסת Java Toolchain באופן הבא:

Kotlin

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

מגניב

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

אפשרות זו מתאימה אם המקור הוא Kotlin , Java או שילוב של שניהם.

גרסת ה-JDK של Toolchain יכולה להיות זהה ל-JDK שהשתמשת בה כדי להפעיל את Gradle, צריך לזכור שהם משמשים למטרות שונות.

באילו תכונות מקור של שפת Java אפשר להשתמש בקוד המקור של Java?

המאפיין sourceCompatibility קובע אילו תכונות של שפת Java זמינים במהלך הידור של מקור Java. היא לא משפיעה על המקור של Kotlin.

אם לא צוין אחרת, ברירת המחדל תהיה Java Toolchain או בעבר השתמשנו ב-JDK כדי להפעיל את Gradle. מומלץ תמיד לציין במפורש atoolchain (מועדף) או 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 לבינה מלאכותית גנרטיבית. חלק מהתכונות האלה נוספו מאוחר יותר ל-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'
    }
}