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

يصف هذا الدليل التغييرات اللازمة للانتقال إلى الإصدار 5.0.

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

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

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

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

  • إصدار Gradle لا يقل عن الإصدار 7.5.0 ولا يزيد عن الإصدار 7.6.0
  • إصدار مكوّن إضافي لنظام Gradle المتوافق مع Android (AGP) في النطاق 7.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

المصدر

بما أنّ الحد الأدنى لمستوى واجهة برمجة التطبيقات (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، المصدر

يستخدم الإصدار 7.4 من AGP والإصدارات الأحدث أداة R8 كأداة تلقائية لتقليل حجم البرنامج الثنائي وإخفاء مفاتيح فك التشفير وتحسينه، لذا لا يلزم اتّخاذ أي إجراء خاص في هذه المرحلة.

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

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

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

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

الخطوة 1: نقل البيانات إلى Kotlin Gradle Plugin 1.9.0

المصدر

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

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

يجب عليك نقل تطبيقك من Kotlin-synthetics في حال كنت تستخدم Kotlin Gradle Plugin 1.6.X أو 1.7.X. راجِع دليل نقل البيانات الرسمي لمزيد من المعلومات.

الخطوة 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.
    }
  }
});