מדריך להעברה של Android Driver SDK 5.0

במדריך הזה מתוארים השינויים הנדרשים כדי לעבור לגרסה 5.0.

עדכונים ל-Gradle ולפלאגין של Android Gradle

שדרוג הגרסאות של Gradle ושל הפלאגין של Android Gradle

קודם משדרגים את הגרסאות של 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 Plugin, משנים את הקובץ 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

R8, מקור

בגרסה 7.4 ואילך של AGP, נעשה שימוש ב-R8 בתור כלי ברירת המחדל לצמצום, לטשטוש ולביצוע אופטימיזציה של הקובץ הבינארי, כך שאין צורך לבצע פעולה מיוחדת בשלב הזה.

אם הפרויקט הועתק מ-AGP מגרסה 4.0 ואילך, יכול להיות שמערכת AGP תנפיק את האזהרות הבאות לגבי הסרת קבצים:

  • שימוש ב-useProguard true בקובץ build.gradle
  • שימוש ב-android.enableR8=false בקובץ gradle.properties

בדרך כלל, הסרת השורות האלה פותרת את הבעיות האלה.

מעבר מ-Kotlin 1.6 ל-1.9

שלב 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 Plugin 1.6.X או 1.7.X, עליכם להעביר את האפליקציה מ-Kotlin-synthetics. מידע נוסף זמין במדריך הרשמי להעברת נתונים.

שלב 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 שינויים עיקריים:

  1. משנים את ממשק implements מ-StatusListener ל-DriverStatusListener.
  2. מוסיפים פרמטר Nullable cause אל updateStatus.
  3. צריך להתקשר למספר 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.
    }
  }
});