دليل نقل حزمة تطوير البرامج (SDK) لنظام التشغيل Android 5.0

يوضِّح هذا الدليل التغييرات اللازمة لنقل البيانات إلى الإصدار 5.0.

آخر الأخبار عن Gradle و"المكوّن الإضافي لنظام Gradle المتوافق مع Android"

ترقية إصدارات Gradle و"المكوّن الإضافي لنظام Gradle المتوافق مع Android"

عليك أولاً ترقية إصدارَي Gradle وAndroid Gradle Plugin. وتتضمّن هذه الترقية توافقًا أفضل مع بعض تبعيات SDK (بما في ذلك Kotlin 1.9)، بالإضافة إلى بعض إصلاحات الأخطاء المُهمّة.

يتطلب هذا الإصدار الرئيسي لحزمة SDK هذا تبعيات الإصدار التالية لمشروع تطبيق Android الخاص بك:

  • أن يكون إصدار Gradle متوافقًا مع الإصدار 7.5.0 على الأقل ولكن يجب ألا يزيد عن الإصدار 7.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

لتعديل إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android، عليك تعديل ملف 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

المصدر

بما أنّ مستوى واجهة برمجة التطبيقات الأدنى لحزمة تطوير البرامج (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 كأداة تلقائية للتقليص والتشويش والتحسين في البرنامج الثنائي، ولذلك لا يلزم اتخاذ أي إجراء خاص في هذه المرحلة.

إذا تم ترحيل المشروع من الإصدار 4.0 من AGP أو إصدارات أحدث، قد يُصدر AGP التحذيرات التالية حول عمليات إزالة الملفات:

  • استخدام useProguard true في ملف build.gradle
  • استخدام android.enableR8=false في ملف gradle.properties

تؤدي إزالة هذه الأسطر عادةً إلى حل هذه المشاكل.

نقل بيانات Kotlin 1.6 إلى 1.9

الخطوة 1: نقل البيانات إلى الإصدار 1.9.0 من المكوّن الإضافي Kotlin Gradle الإضافي

المصدر

حدِّث إصدار المكوّن الإضافي Kotlin Gradle الإضافي في ملفbuild.gradle في وحدة المستوى الأعلى في تطبيقك. تأكَّد من إضافة org.jetbrains.kotlin:kotlin-gradle-plugin في التبعيات من كتلة Buildscript إذا كانت مفقودة.

buildscript {
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0"
  }
}

يجب نقل طلبك من مواد Kotlin الاصطناعية إذا كنت قادمًا من Kotlin Gradle Plugin 1.6.X أو 1.7.X. يُرجى الرجوع إلى دليل نقل البيانات الرسمي للاطّلاع على مزيد من المعلومات.

الخطوة 2: ترقية kotlin-stdlib إلى الإصدار 1.9.0

المصدر

عليك الترقية من الإصدار kotlin-stblib إلى الإصدار 1.9.0 في ملف version.gradle لتطبيقك.

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

احرص على إزالة أي إشارات إلى kotlin-stdlib-jdk7 أو kotlin-stdlib-jdk8. تم دمج كلتا التبعيتين في kotlin-stdlib بدءًا من Kotlin 1.8.0.

إيقاف ميزة StateListener نهائيًا

تم إيقاف واجهة StatusListener نهائيًا (ستتم إزالتها في الإصدار 6) لصالح DriverStatusListener.

هناك 3 تغييرات بشكل أساسي:

  1. تغيير واجهة implements من StatusListener إلى DriverStatusListener
  2. أضِف معلَمة cause Nullable إلى updateStatus.
  3. عليك الاتصال بـ "DriverContextBuilder.setDriverStatusListener" بدلاً من "setStatusListener".

يشترك DriverStatusListener في البنية نفسها مثل StatusListener. الفرق الرئيسي بينهما هو أن DriverStatusListener.updateStatus() يأخذ معلَمة إضافية باسم cause. يوفر ذلك إحصاءات للمستخدمين حول سبب التحديث بمستوى حالة الخطأ.

يمكنك عادةً استخدام cause لاسترداد رمز الخطأ الذي يعرضه FleetEngine لتحديثات الموقع الجغرافي غير الناجحة.

يوضِّح النموذج التالي كيفية تنفيذ 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.
    }
  }
});