בין אם קוד המקור נכתב ב-Java, ב-Kotlin או בשניהם, יש כמה מקומות שבהם צריך לבחור שפת JDK או Java עבור ה-build שלך.
מילון מונחים
- 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 בגרסה הבאה: הזמנה:
- משתנה סביבה אחד (
STUDIO_JDK
) - הספרייה
studio.jdk
(בהפצה של Android Studio) - ספריית
jbr
(JetBrains Runtime), ב-Android Studio של הסבירות. מומלץ. - משתנה סביבה אחד (
JDK_HOME
) - משתנה סביבה אחד (
JAVA_HOME
) - קובץ הפעלה אחד (
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.
פקודות המאקרו מאפשרות בחירת נתיב 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'
}
}