בין שקוד המקור שלכם נכתב ב-Java, ב-Kotlin או בשתיהן, יש כמה מקומות שבהם עליכם לבחור גרסת JDK או שפת Java ל-build.
מילון מונחים
- ערכת הפיתוח של Java (JDK)
-
ערכת הכלים לפיתוח Java (JDK)
כוללת:
- כלים, כמו קומפיילר, כלי לניתוחי פרופיל ויצירת ארכיונים. המערכת משתמשת בהם מאחורי הקלעים במהלך ה-build כדי ליצור את האפליקציה.
- ספריות שמכילות ממשקי API שאפשר להפעיל מקוד המקור של Kotlin או Java. חשוב לזכור שלא כל הפונקציות זמינות ב-Android.
- Java Virtual Machine (JVM), מתורגמן שמריץ אפליקציות Java. משתמשים ב-JVM כדי להריץ את סביבת הפיתוח המשולבת (IDE) של Android Studio ואת הכלי ל-build של Gradle. לא נעשה שימוש ב-JVM במכשירי Android או במהירי Android.
- JetBrains Runtime (JBR)
- JetBrains Runtime (JBR) הוא JDK משופר שמופץ עם Android Studio. הוא כולל כמה אופטימיזציות לשימוש ב-Studio ובמוצרים קשורים של JetBrains, אבל אפשר להשתמש בו גם להרצת אפליקציות Java אחרות.
איך בוחרים JDK כדי להריץ את Android Studio?
מומלץ להשתמש ב-JBR כדי להריץ את Android Studio. הוא נפרס עם Android Studio ומשמשים לבדיקת Android Studio, והוא כולל שיפורים לשימוש אופטימלי ב-Android Studio. כדי לוודא זאת, אל תגדירו את משתנה הסביבה STUDIO_JDK
.
סקריפטים לטעינה בזמן ההפעלה של Android Studio מחפשים JVM בסדר הבא:
- משתנה הסביבה
STUDIO_JDK
- ספריית
studio.jdk
(בהפצה של Android Studio) - ספריית
jbr
(JetBrains Runtime), בהפצה של Android Studio. מומלץ. - משתנה הסביבה
JDK_HOME
- משתנה הסביבה
JAVA_HOME
- קובץ ההפעלה
java
במשתנה הסביבהPATH
איך בוחרים את JDK שבו יפעלו גרסאות ה-build של Gradle?
אם מריצים את Gradle באמצעות הלחצנים ב-Android Studio, ה-JDK שמוגדר בהגדרות של Android Studio משמש להרצת Gradle. אם מריצים את Gradle במסוף, בתוך Android Studio או מחוץ אליו, משתנה הסביבה JAVA_HOME
(אם הוא מוגדר) קובע איזה JDK ירוץ את הסקריפטים של Gradle. אם JAVA_HOME
לא מוגדר, המערכת משתמשת בפקודה java
במשתנה הסביבה PATH
.
כדי לקבל את התוצאות העקביות ביותר, חשוב להגדיר את משתנה הסביבה JAVA_HOME
והגדרת Gradle JDK ב-Android Studio לאותו JDK.
כשמריצים את ה-build, Gradle יוצר תהליך שנקרא daemon כדי לבצע את ה-build בפועל. אפשר לעשות שימוש חוזר בתהליך הזה, כל עוד ב-builds נעשה שימוש באותה גרסת JDK ו-Gradle. שימוש חוזר בדימון מפחית את הזמן הנדרש להפעלת JVM חדשה ולהפעלת מערכת ה-build.
אם מתחילים גרסאות build עם גרסאות שונות של JDK או Gradle, נוצרים עוד דימונים (daemons) שמנצלים יותר מעבד וזיכרון.
הגדרת Gradle JDK ב-Android Studio
כדי לשנות את ההגדרה הקיימת של 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 - הורדת JDK
- הוספת JDK ספציפי
- גרסאות JDK שזוהו באופן מקומי מהספרייה שמוגדרת כברירת מחדל להתקנת JDK במערכת ההפעלה
האפשרות שנבחרה מאוחסנת באפשרות gradleJvm
בקובץ .idea/gradle.xml
של הפרויקט, והפתרון של נתיב ה-JDK משמש להפעלת Gradle כשמפעילים אותו דרך Android Studio.
המאקרו מאפשר בחירת נתיב JDK דינמי לפרויקט:
JAVA_HOME
: משתמש במשתנה הסביבה עם אותו שםGRADLE_LOCAL_JAVA_HOME
: משתמש במאפייןjava.home
בקובץ.gradle/config.properties
, שמוגדר כברירת מחדל ל-JetBrains Runtime.
JDK שנבחר משמש להרצת ה-build ב-Gradle ולפתרון הפניות ל-JDK API בזמן העריכה של סקריפטים ל-build וקוד המקור. הערה: הערך שצוין בשדה compileSdk
יגדיר אילו סמלי Java יהיו זמינים בזמן העריכה והיצירה של קוד המקור.
חשוב לבחור גרסת JDK שגדולה או שווה לגרסאות ה-JDK שבהן משתמשים הפלאגינים שבהם אתם משתמשים ב-build של Gradle. כדי לקבוע את גרסת ה-JDK המינימלית הנדרשת לפלאגין Android Gradle (AGP), אפשר לעיין בטבלת התאימות שמופיעה בהערות המוצר.
לדוגמה, כדי להשתמש ב-Android Gradle Plugin בגרסה 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/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 API אפשר להשתמש בקוד המקור של Java או Kotlin?
אפליקציה ל-Android יכולה להשתמש בחלק מממשקי ה-API שמוגדרים ב-JDK, אבל לא בכלם. Android SDK מגדיר הטמעות של פונקציות רבות בספריית Java כחלק מממשקי ה-API הזמינים שלו. המאפיין compileSdk
מציין באיזו גרסה של Android SDK יש להשתמש כשמפעילים הידור של קוד המקור ב-Kotlin או ב-Java.
Kotlin
android {
...
compileSdk = 33
}
Groovy
android {
...
compileSdk 33
}
כל גרסה של Android תומכת בגרסה ספציפית של JDK ובקבוצת משנה של ממשקי ה-API הזמינים של Java. אם אתם משתמשים ב-Java API שזמין ב-compileSdk
שאינו זמין ב-minSdk
שצוין, יכול להיות שתוכלו להשתמש ב-API בגרסה הקודמת של Android באמצעות תהליך שנקרא desugaring.
במאמר ממשקי 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 toolchain מכיל את המהדר של Java שמשמש להדרת כל קוד מקור של Java. JDK הזה גם מפעיל javadoc ובדיקות יחידה במהלך ה-build.
ברירת המחדל של כלי הפיתוח היא JDK שמשמש להפעלת Gradle. אם משתמשים בברירת המחדל ומריצים build במכונות שונות (לדוגמה, במחשב המקומי ובשרת נפרד של שילוב רצף משימות), התוצאות של ה-build עשויות להיות שונות אם משתמשים בגרסאות שונות של JDK.
כדי ליצור גרסה עקבית יותר של build, אפשר לציין באופן מפורש את הגרסה של toolchain של Java. מציינים את הפרטים הבאים:
- מאתר JDK תואם במערכת שבה פועל ה-build.
- אם אין JDK תואם (והוגדר פותר של כלי פיתוח), מתבצע הורדה של JDK.
- חשיפת ממשקי ה-API של 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 toolchain. אם אתם לא משתמשים בכלי פיתוח של Java, הגרסה שתיבחר כברירת מחדל תהיה זו שנבחרה על ידי הפלאגין של Android Gradle (לדוגמה, Java 8 ואילך).
באילו תכונות בינאריות של Java אפשר להשתמש כשמפעילים הידור של קוד המקור ב-Kotlin או ב-Java?
המאפיינים targetCompatibility
ו-jvmTarget
קובעים את גרסת פורמט הכיתה של Java שבה נעשה שימוש בזמן יצירת קוד באקס (bytecode) למקורות 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 toolchain. אם אתם לא משתמשים בכלי פיתוח של Java, ערכי ברירת המחדל עשויים להיות שונים ולגרום לבעיות ב-build. לכן, מומלץ תמיד לציין את הערכים האלה באופן מפורש או להשתמש בערכת כלים של Java.