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

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

تحديثات Gradle والمكوّن الإضافي لنظام Gradle المتوافق مع Android

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

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

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

  • الإصدار 7.5.0 من Gradle على الأقل، ولكن ليس أعلى من الإصدار 7.6.0
  • إصدار من المكوّن الإضافي لنظام Gradle المتوافق مع Android (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 وإصدار "المكوّن الإضافي لنظام Gradle المتوافق مع Android" المطلوب هو 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 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" والإصدارات الأحدث أداة R8 تلقائيًا لتصغير الرمز البرمجي وتشويشه وتحسينه للبرنامج الثنائي، لذا لا يلزم اتّخاذ أي إجراء خاص في هذه المرحلة.

إذا تم نقل المشروع من الإصدار 4.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android أو إصدار أحدث، قد يُصدر المكوّن الإضافي التحذيرات التالية بشأن عمليات إزالة الملفات:

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

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

نقل البيانات من الإصدار 1.6 إلى 1.9 من Kotlin

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

المصدر

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

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

عليك نقل تطبيقك من Kotlin-synthetics إذا كنت تستخدم الإصدار 1.6.X أو 1.7.X من إضافة Kotlin Gradle. لمزيد من المعلومات، يُرجى الرجوع إلى دليل نقل البيانات الرسمي.

الخطوة 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 بدءًا من الإصدار 1.8.0 من Kotlin.

إيقاف 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.
    }
  }
});