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

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

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

ترقية إصدارات Gradle وAndroid Gradle Plugin

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

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

  • إصدار Gradle v7.5.0 على الأقل وليس أعلى من v7.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 للترحيل

الخطوة الأولى: تفعيل دعم مكتبة Java 8

المصدر

نظرًا لأن مستوى واجهة برمجة التطبيقات في حزمة SDK min هو 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)

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

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

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

المصدر

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

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

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

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

المصدر

عليك ترقية التطبيق kotlin-stblib إلى الإصدار 1.9.0 في ملف create.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. أضِف مَعلمة cause Nullable إلى updateStatus.
  3. يمكنك طلب الرقم DriverContextBuilder.setDriverStatusListener بدلاً من setStatusListener

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

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

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