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

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

עדכונים ב-Gradle וב-Android Gradle Plugin

שדרוג הגרסאות של Gradle ושל Android Gradle Plugin

קודם צריך לשדרג את הגרסאות של Gradle ושל Android Gradle Plugin. השדרוג הזה כולל תאימות טובה יותר ליחסי תלות מסוימים של SDK (כולל Kotlin 1.9), וגם כמה תיקוני באגים קריטיים.

הגרסה הראשית הזו של ה-SDK דורשת את יחסי התלות הבאים בגרסה עבור פרויקט האפליקציה שלך ל-Android:

  • גרסת Gradle לפחות v7.5.0 אבל לא יותר מ-v7.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, source

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

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

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

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

העברה מ-Kotlin 1.6 ל-Kotlin 1.9

שלב 1 – מעבר ל-Kotlin Gradle Plugin 1.9.0

מקור

מעדכנים את הגרסה של Kotlin Gradle Plugin בקובץ 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.
    }
  }
});