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

במדריך הזה מתוארים השינויים הנדרשים כדי לעבור לגרסה 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

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 שינויים:

  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.
    }
  }
});