Android ड्राइवर SDK 5.0 माइग्रेशन गाइड

इस गाइड में, वर्शन 5.0 पर माइग्रेट करने के लिए ज़रूरी बदलावों के बारे में बताया गया है.

Gradle और Android Gradle प्लगिन के अपडेट

Gradle और Android Gradle प्लग इन के वर्शन अपग्रेड करना

सबसे पहले, Gradle और Android Gradle प्लगिन के वर्शन अपग्रेड करें. इस अपग्रेड में, कुछ एसडीके डिपेंडेंसी (जैसे, Kotlin 1.9) के साथ बेहतर तरीके से काम करने की सुविधा शामिल है. साथ ही, कुछ गंभीर गड़बड़ियां ठीक की गई हैं.

इस एसडीके की मेजर रिलीज़ के लिए, आपके Android ऐप्लिकेशन प्रोजेक्ट में इन वर्शन की डिपेंडेंसी होनी चाहिए:

  • Gradle का वर्शन कम से कम v7.5.0 होना चाहिए, लेकिन v7.6.0 से ज़्यादा नहीं होना चाहिए.
  • Android Gradle प्लग इन (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 लाइब्रेरी के साथ काम करने की सुविधा पर माइग्रेट करना

पहला चरण - Java 8 लाइब्रेरी इस्तेमाल करने की सुविधा चालू करना

सोर्स

एसडीके का कम से कम एपीआई लेवल 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'
}

दूसरा चरण - Proguard या Dexguard से R8 पर माइग्रेट करना

R8, सोर्स

AGP v7.4+ में, R8 का इस्तेमाल बाइनरी के लिए डिफ़ॉल्ट रूप से किया जाता है. यह बाइनरी को छोटा करने, उसे अस्पष्ट करने, और ऑप्टिमाइज़ करने का टूल है. इसलिए, इस समय कोई खास कार्रवाई करने की ज़रूरत नहीं है.

अगर प्रोजेक्ट को AGP 4.0 या इसके बाद के वर्शन से माइग्रेट किया जाता है, तो AGP फ़ाइलें हटाने के बारे में ये चेतावनियां दिखा सकता है:

  • build.gradle फ़ाइल में useProguard true का इस्तेमाल
  • gradle.properties फ़ाइल में android.enableR8=false का इस्तेमाल

इन लाइनों को हटाने से, आम तौर पर ये समस्याएं ठीक हो जाती हैं.

Kotlin 1.6 से 1.9 पर माइग्रेट करना

पहला चरण - Kotlin Gradle प्लग इन 1.9.0 पर माइग्रेट करना

सोर्स

अपने ऐप्लिकेशन के टॉप लेवल मॉड्यूल की build.gradle फ़ाइल में, Kotlin Gradle Plugin का वर्शन अपडेट करें. अगर 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-synthetics से माइग्रेट करना होगा. ज़्यादा जानकारी के लिए, डेटा को दूसरी जगह भेजने से जुड़ी आधिकारिक गाइड देखें.

दूसरा चरण - kotlin-stdlib को 1.9.0 पर अपग्रेड करें

सोर्स

अपने ऐप्लिकेशन की build.gradle फ़ाइल में, kotlin-stblib को 1.9.0 पर अपग्रेड करें.

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.0"
}

पक्का करें कि आपने kotlin-stdlib-jdk7 या kotlin-stdlib-jdk8 के सभी रेफ़रंस हटा दिए हों. दोनों डिपेंडेंसी को kotlin-stdlib में शामिल कर दिया गया है. यह Kotlin 1.8.0 से शुरू होता है.

StatusListener को बंद किया जा रहा है

StatusListener इंटरफ़ेस अब काम नहीं करता. इसे v6 में हटा दिया जाएगा. इसके बजाय, DriverStatusListener का इस्तेमाल करें.

इसमें मुख्य रूप से तीन बदलाव किए गए हैं:

  1. implements इंटरफ़ेस को StatusListener से बदलकर DriverStatusListener करें.
  2. updateStatus में Nullable cause पैरामीटर जोड़ें.
  3. setStatusListener के बजाय DriverContextBuilder.setDriverStatusListener को कॉल करें.

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