تحديثات واجهة برمجة التطبيقات Android Gradle API الإضافية

تتتبّع هذه الصفحة عملية الإيقاف النهائي وإزالة واجهة برمجة التطبيقات لمكوّنات Android Gradle الإضافية (AGP)، كما تقدّم معلومات حول كيفية تعديل الرمز البرمجي وفقًا لذلك.

أداة تتبُّع عمليات الإيقاف النهائي وعمليات الإزالة في واجهة برمجة التطبيقات

يلخّص الجدول التالي ملخّصًا للحالات التي تم فيها إيقاف واجهات AGP API نهائيًا وإزالتها، في ما يتعلّق بإصدار AGP.

واجهة برمجة التطبيقات تم إيقافها في إصدار AGP تمت الإزالة من إصدار AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
التحوّل 7.2 من نظام التشغيل Android

8.0 جنيه مصري

في ما يلي تحديثات مهمة لواجهة برمجة التطبيقات للإصدار 8.0 من AGP.

تمت إزالة Transform API

بدءًا من الإصدار 8.0 من AGP، تتم إزالة واجهة برمجة التطبيقات Transform. هذا يعني أنّه ستتم إزالة كل الصفوف com.android.build.api.transform في الحزمة.

تتم إزالة Transform API لتحسين أداء الإصدار. والمشاريع التي تستخدم Transform API فرض استخدام AGP لتدفّق أقل تحسينًا للإصدار، ما قد يؤدي إلى تراجع كبير في مدة الإصدار. من الصعب أيضًا استخدام Transform API ودمجها مع ميزات Gradle الأخرى، إذ تهدف واجهات برمجة التطبيقات البديلة إلى تسهيل توسيع نطاق AGP بدون تقديم أداء أو إصلاح مشاكل في الصحة.

واجهات برمجة التطبيقات البديلة

لا يوجد بديل واحد لواجهة Transform API، حيث توجد واجهات برمجة تطبيقات جديدة ومستهدفة لكل حالة استخدام. تتوفّر جميع واجهات برمجة التطبيقات البديلة في مجموعة androidComponents {}. تتوفّر جميع واجهات برمجة التطبيقات هذه بحلول الإصدار 7.2 من AGP.

دعم تحويل رمز البايت

لتحويل رمز بايت، استخدِم واجهة برمجة تطبيقات Hardwareation API. وبالنسبة إلى المكتبات، يمكنك تسجيل الأجهزة لصفوف المشاريع المحلية فقط، أما بالنسبة إلى التطبيقات والاختبارات، فيمكنك اختيار تسجيل الأداة للصفوف المحلية فقط أو لجميع الصفوف، بما في ذلك التبعيات المحلية والبعيدة. لاستخدام واجهة برمجة التطبيقات هذه، يتم تشغيل الأدوات بشكل مستقل في كل فئة، مع إمكانية وصول محدود إلى الفئات الأخرى في مسار الفئة (يُرجى الاطّلاع على createClassVisitor() لمزيد من المعلومات). يعمل هذا التقييد على تحسين أداء كل من الإصدارات الكاملة والتزايدية، ويحافظ على بساطة سطح واجهة برمجة التطبيقات. تتم إضافة الأدوات إلى كل مكتبة بشكل متوازٍ بمجرد أن تصبح جاهزة، وليس بعد اكتمال عملية التجميع. بالإضافة إلى ذلك، يعني التغيير في فئة واحدة أنه يجب إعادة استخدام الفئات المتأثرة فقط في بنية تزايدية. على سبيل المثال حول طريقة استخدام واجهة برمجة تطبيقات Measurement API، اطّلِع على وصفة AGP الخاصة بتحويل الصفوف باستخدام ASM.

إتاحة إضافة الصفوف التي تم إنشاؤها إلى تطبيقك

لإضافة المزيد من الفئات التي تم إنشاؤها إلى التطبيق، استخدِم واجهة برمجة التطبيقات Artifacts مع علامة MultipleArtifact.ALL_CLASSES_DIRS. على وجه التحديد، استخدم

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

مع MultipleArtifact.ALL_CLASSES_DIRS لإلحاق المزيد من الأدلة التي تم إنشاؤها بفئات المشروع. ستحدد Artifacts API تلقائيًا موقعًا فريدًا لإخراج مهمتك المخصصة إليه. يمكنك الاطّلاع على وصفة addToAllClasses للحصول على مثال عن كيفية استخدام واجهة برمجة التطبيقات هذه.

دعم عمليات التحويل استنادًا إلى تحليل البرنامج بأكمله

لتنفيذ عمليات التحويل استنادًا إلى تحليل البرنامج بأكمله، يمكن تحويل جميع الصفوف معًا في مهمة واحدة. يجب استخدام هذه الطريقة بحذر حيث إنها تنطوي على تكلفة أعلى بكثير من أداء الإصدار مقارنةً باستخدام واجهة برمجة تطبيقات الأدوات. إذا كان المكوّن الإضافي يستخدم واجهة برمجة التطبيقات هذه، ننصح بتفعيل التحويل حسب نوع الإصدار، حتى يتمكّن مطوِّر التطبيق من إيقافه في إصدارات التطوير.

لتسجيل مهمة تحول جميع الصفوف معًا، يقدم المكوّن الإضافي Android Gradle 7.4 واجهة برمجة التطبيقات Artifacts.forScope. لتحويل جميع الفئات في المشروع الحالي، استخدِم Artifacts.forScope.PROJECT. لتحويل جميع الفئات في المشروع الحالي والمشروعات المستورَدة وجميع التبعيات الخارجية، يمكنك استخدام Artifacts.forScope.ALL. يوضّح الرمز التالي كيفية استخدام Artifacts.forScope.ALL لتسجيل مهمة تؤدي إلى تحويل جميع الصفوف معًا:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

يمكنك الاطّلاع على وصفة modifyProjectClasses للحصول على مثال عن كيفية استخدام واجهة برمجة التطبيقات هذه، ووصفةcustomizeAgpDsl للحصول على مثال عن كيفية تسجيل إضافات مخصَّصة لأنواع إصدارات Android.

إذا لم تكن حالة استخدامك مشمولة في أي من واجهات برمجة التطبيقات AndroidComponents، يُرجى الإبلاغ عن خطأ.

سبق وتم نقل العديد من المكوّنات الإضافية الشائعة الاستخدام لاستخدام واجهات برمجة التطبيقات الجديدة هذه، بما في ذلك المكوِّن الإضافي لمراقبة أداء Firebase (الإصدار 1.4.1 متوافق مع الإصدار 8.0 من AGP) والمكوِّن الإضافي Hilt Gradle (الإصدار 2.40.1 متوافق مع الإصدار 8.0 من نظام AGP). سيساعد أيضًا مساعد ترقية AGP مطوري المشروعات في ترقية المكونات الإضافية الشائعة حسب الحاجة.

إذا كنت تستخدم Transform API من خلال مكوّن إضافي تابع لجهة خارجية، يُرجى إعلام المؤلف بضرورة تحديث المكوّن الإضافي ليعمل مع واجهات برمجة التطبيقات الجديدة لنظام AGP 8.0.

7.2 جنيه مصري

في ما يلي تحديثات مهمة لواجهة برمجة التطبيقات للإصدار 7.2 من AGP.

تم إيقاف RenderScript نهائيًا

وبدءًا من الإصدار 7.2 من AGP، سيتم إيقاف واجهات برمجة التطبيقات RenderScript نهائيًا. وستستمر هذه الرموز في العمل، إلا أنها تستدعي تحذيرات، وستتم إزالتها تمامًا في الإصدارات المستقبلية من AGP. للحصول على إرشادات حول طريقة إيقاف استخدام RenderScript، يُرجى الاطّلاع على مقالة نقل البيانات من RenderScript.

تم إيقاف Component.transformClassesWith وComponent.setAsmFramesComputationMode نهائيًا.

وبدءًا من الإصدار 7.2 من AGP، سيتم إيقاف واجهات برمجة تطبيقات قياس بايت رمز البايت للفئة Component.transformClassesWith وComponent.setAsmFramesComputationMode نهائيًا. وتم نقلها إلى مجموعة جديدة، وهي Component.instrumentation، التي تحتوي على جميع واجهات برمجة التطبيقات المرتبطة بتهيئة عملية قياس حالة التطبيق. لمواصلة استخدام ميزات قياس حالة التطبيق هذه، استخدِم واجهات برمجة التطبيقات المناسبة في المجموعة الجديدة بدلاً من ذلك، كما هو موضّح في مقتطف الرمز التالي:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }