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

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

Gradle और Android Gradle प्लग इन से जुड़े अपडेट

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

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

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

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

सोर्स

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'
}

दूसरा चरण - 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 प्लग इन का वर्शन अपडेट करें. अगर 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 1.8.0 से शुरू होने वाले kotlin-stdlib में मर्ज कर दिया गया है.

StatusListener की सुविधा बंद होना

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

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

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

DriverStatusListener का स्ट्रक्चर, StatusListener जैसा ही है. इन दोनों के बीच मुख्य अंतर यह है कि DriverStatusListener.updateStatus(), cause नाम का एक अतिरिक्त पैरामीटर लेता है. इससे उपयोगकर्ताओं को गड़बड़ी की स्थिति के लेवल के साथ, अपडेट की वजह के बारे में अहम जानकारी मिलती है.

आम तौर पर, जगह की जानकारी के अपडेट न होने पर, Fleet Engine से मिला गड़बड़ी कोड पाने के लिए, cause का इस्तेमाल किया जाता है.

यहां दिए गए सैंपल में, 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.
    }
  }
});