במדריך הזה מתוארים השינויים הנדרשים כדי לעבור לגרסה 5.0.
עדכונים של Gradle ו-Android Gradle
שדרוג גרסאות Gradle ו-Android Gradle Plugin
תחילה, עליך לשדרג את גרסאות הפלאגין של Gradle ו-Android Gradle. השדרוג הזה כולל תאימות טובה יותר ליחסי תלות מסוימים ב-SDK (כולל Kotlin 1.9), וגם כמה תיקוני באגים קריטיים.
הגרסה הראשית של ה-SDK מחייבת את יחסי התלות של הגרסאות הבאות בפרויקט של אפליקציית Android שלכם:
- גרסת Gradle מגרסה 7.5.0 ואילך, אבל לא גבוהה מ-7.6.0.
- גרסת Android Gradle Plugin (AGP) בטווח של v7.4.x.
אפשר לטרגט גרסה גבוהה יותר של יישומי הפלאגין. עם זאת, יכול להיות שיופיעו אזהרות על הוצאה משימוש, או שתכונות חדשות מסוימות לא יפעלו.
כדי לשנות את גרסת Gradle, צריך לשנות את השורה בקובץ /gradle/wrapper/gradle-wrapper.properties
של הפרויקט
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
כדי לשנות את גרסת הפלאגין של Android Gradle, צריך לשנות את הקובץ build.gradle
שמכיל את הבלוק buildscript
. למשל:
buildscript {
repositories {
google()
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
העברת תמיכה בספריית Java 7 ל-Java 8
שלב 1 - הפעלת התמיכה בספריית Java 8
רמת ה-API המינימלית של ה-SDK היא 23 וגרסת ה-AGP הנדרשת היא 7.4 ואילך, ולכן ההגדרה שונה מעט ממסמכי התיעוד של המקור שצוין.
buildscript {
repositories {
google()
mavenCentral()
jcenter()
maven {
url = uri("https://storage.googleapis.com/r8-releases/raw")
}
}
dependencies {
classpath 'com.android.tools:r8:8.0.46'
classpath 'com.android.tools.build:gradle:7.4.1'
}
}
android {
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs_nio:2.0.3'
}
שלב 2 – מעבר מ-ProGuard או DexGuard ל-R8
AGP v7.4+ משתמש ב-R8 ככלי ברירת המחדל לכיווץ, לערפול קוד (obfuscation) ולאופטימיזציה של הקובץ הבינארי, לכן לא נדרשת פעולה מיוחדת בשלב זה.
אם הפרויקט מועבר מ-AGP 4.0 ואילך, AGP עשוי להציג את האזהרות הבאות לגבי הסרות קבצים:
- שימוש ב-
useProguard true
בקובץbuild.gradle
- שימוש ב-
android.enableR8=false
בקובץgradle.properties
הסרת השורות האלה בדרך כלל פותרת את הבעיות האלה.
מעבר מגרסאות 1.6 עד 1.9 ל-Kotlin
שלב 1 – מעבר לפלאגין של Kotlin Gradle בגרסה 1.9.0
מעדכנים את גרסת הפלאגין Kotlin Gradle בקובץ build.gradle של המודול ברמה העליונה של האפליקציה. חשוב להוסיף org.jetbrains.kotlin:kotlin-gradle-plugin
ליחסי התלות מבלוק ה-buildscript למקרה שהוא חסר.
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
}
}
אם אתם משתמשים בפלאגין Kotlin Gradle מגרסה 1.6.X או מ-1.7.X, צריך להעביר את האפליקציה מ-Kotlin-{3}. מידע נוסף זמין במדריך הרשמי להעברת נתונים.
שלב 2 – שדרוג kotlin-stdlib ל-1.9.0
צריך לשדרג את kotlin-stblib
לגרסה 1.9.0 בקובץ build.gradle של האפליקציה.
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}
חשוב להסיר את כל ההפניות אל kotlin-stdlib-jdk7
או אל kotlin-stdlib-jdk8
. שתי יחסי התלות אוחדו ל-kotlin-stdlib
החל מ-Kotlin 1.8.0.
הוצאה משימוש של StatusListener
הממשק StatusListener
הוצא משימוש (תוסר בגרסה 6), לטובת DriverStatusListener
.
יש בעיקר 3 שינויים:
- שינוי הממשק
implements
מ-StatusListener
ל-DriverStatusListener
. - מוסיפים את הפרמטר
Nullable
cause
ל-updateStatus
. - מתקשרים אל
DriverContextBuilder.setDriverStatusListener
במקום אלsetStatusListener
.
ל-DriverStatusListener
יש מבנה זהה לזה של StatusListener
. ההבדל העיקרי ביניהם הוא ש-DriverStatusListener.updateStatus()
לוקח פרמטר נוסף בשם cause
. כך המשתמשים יכולים לקבל תובנות לגבי הגורם לעדכון עם רמת סטטוס השגיאה.
בדרך כלל, יש להשתמש ב-cause
כדי לאחזר את קוד השגיאה שהוחזר על ידי Fleet Engine במקרה של עדכוני מיקום שנכשלו.
הדוגמה הבאה ממחישה איך להטמיע את StatusListener
:
class MyStatusListener implements StatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Implementation
}
}
// Inject StatusListener into DriverContext.
DriverContextBuilder.setStatusListener(new MyStatusListener());
למטה מוצגת הטמעה של DriverStatusListener
לדוגמה:
class MyStatusListener implements DriverStatusListener {
/** Called when background status is updated during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg, @Nullable Throwable cause) {
// Existing implementation
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
}
}
DriverContextBuilder.setStatusListener(new MyStatusListener());
הטמעה של DriverStatusListener
כממשק פונקציונלי
DriverStatusListener
תומך בממשקים פונקציונליים של Java בדיוק כמו בממשק הקודם. לדוגמה:
DriverContextBuilder.setDriverStatusListener((statusLevel, statusCode, statusMsg, cause) -> {
if (cause != null && cause instanceof StatusRuntimeException) {
if (Status.NOT_FOUND.getCode().equals(cause.getStatus().getCode())) {
// NOT_FOUND gRPC exception thrown by Fleet Engine.
}
}
});