ضبط صيغ جهة النشر

تتيح لك صيغ جهات النشر إنشاء تجربة أكثر تخصيصًا للمستخدمين. يتيح لك ضبط صيغ جهات النشر نشر صيغ مختلفة للإصدار ولكل منها سماتها الخاصة.

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

قبل المتابعة، تأكد من تحضير مكتبتك للإصدارات

استخدام البيانات الوصفية لوحدة Gradle

لنشر نُسخ مختلفة من مكتبتك، عليك استخدام البيانات الوصفية لوحدة Gradle (GMM): تصف خرائط Google للجوّال جهة النشر وتحتفظ إدارة التبعية الواعية للمتغير. يتم نشر خرائط Google للجوّال بواسطة مكتبتك بشكل افتراضي.

تشمل مزايا استخدام "خرائط Google" ما يلي:

  • إذا كنت تستخدم خرائط Google للجوّال مع الإصدار 6.0 من Gradle 6.0 أو الإصدارات الأحدث، فيمكنك نشر جهات نشر متعددة المتغيرات أو العناصر المتعددة — لكل منها سماتها وتبعياتها الخاصة. في حال استخدام ملف POM الخاص بـ Maven يمكنك نشر عنصر واحد فقط بدلاً من خرائط Google للأجهزة الجوّالة (GMM). في حال استخدام ملف POM، عليك يمكنك نشر عناصر إضافية باستخدام المُصنِّفات، لكن يمكن للأدوات الإضافية لا يمكن أن يكون لها تبعياتها الخاصة.
  • تنشئ Gradle تلقائيًا متغيرًا واحدًا للتجميع ومتغيرًا لوقت التشغيل، ولكل منها تبعياته الخاصة. يمكنك نشر صيغة واحدة لتجميعها. والآخر لوقت التشغيل، بحيث يمكن للمستهلك الاختيار بناءً على وقت استخدامه مكتبتك. تتيح خرائط Google للأجهزة الجوّالة (GMM) للمستهلكين مشاهدة تبعيات مختلفة للتجميع بناءً على استخدام المكتبة المنشورة api، أو implementation، أو compileOnly/runtimeOnly عرض إعدادات التبعية للحصول على قائمة كاملة من التبعيات. يتوفر هذا حتى إذا نشرت واحدة جهة النشر
  • عند استخدام تجهيزات اختبار، يمكنك نشر صيغة إضافية مع إطارات خاصة بيانات التعريف أو الإمكانات تسمح للمستهلك بتحديدها. تتوفّر هذه الميزة حتى إذا نشرت نسخة جهة نشر واحدة

فهم خيارات جهة النشر

لكي تفهم طريقة عمل خيارات جهات النشر، من المفيد أن تكون على دراية من غرادل . في ما يلي بعض المفاهيم الأساسية لجهة النشر:

  • إنشاء صيغة: الإعداد الذي تستخدمه منصّة Gradle لإنشاء مكتبتك هو ناتج المنتج المتقاطع لنوع التصميم ونكهة المنتج. لمزيد من المعلومات، يُرجى مراجعة مسرد مصطلحات إصدار Android
  • العناصر: يشير ذلك المصطلح إلى ملف أو دليل تنتجه عملية إنشاء. في سياق النشر المكتبة يكون العنصر عادةً ملف JAR أو AAR.
  • صيغة جهة النشر: يشير ذلك المصطلح إلى عنصر بالسمات والميزات والتبعيات المرتبطة به. ملاحظة التي تطلق عليها Gradle المتغيرات المختلفة في جهات النشر. ومع ذلك، تسمى نُسخ جهة النشر في هذه المستندات لتمييزها عن إنشاء الصيغ
  • السمة: تستخدم منصّة Gradle السمات لتحديد خيارات جهات النشر واختيارها في حال توفُّرها هي خيارات متعددة. على سبيل المثال، org.gradle.usage=java-api و org.gradle.jvm.version=11 هي سمات لخيارات المنتج.
  • مكوِّن البرنامج: يشير هذا المصطلح إلى كائن Gradle الذي يمكن أن يحتوي على صيغة واحدة أو أكثر من صيغ النشر، ويتم نشره. إلى مجموعة واحدة من إحداثيات Maven (groupdId:artifactId:version). من المهم الكشف في DSL لـ Gradle من خلال Project.getComponents()
  • جهة النشر: البيانات التي يتم نشرها في المستودع ويستخدمها المستهلكون تشمل جهات النشر لأحد مكونات البرنامج وبياناته الوصفية، مثل هويته (groupId:artifactId:version).

يقدم الإصدار 7.1 من مكوّن Android Gradle (AGP) 7.1 لغة محددة النطاق (DSL) لتحديد صيغ الإصدار التي يتم استخدامها أثناء جهة النشر وتلك التي يتم تجاهلها. يتيح لك DSL إنشاء مثيلات SoftwareComponent التي تحتوي على أي مما يلي:

  • صيغة واحدة لجهة النشر من نسخة إصدار واحدة
  • عدة متغيرات لجهة النشر من عدة صيغ تصميم

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

أنشِئ مكوّن برنامج بنسخة جهة نشر واحدة.

يضبط المقتطف التالي مكوّن برنامج بجهة نشر واحدة. تم إنشاء الصيغة من نسخة الإصدار release وإضافة العنصر JAR المصدر باعتباره الأداة الثانوية:

Kotlin

android {
  publishing {
    singleVariant("release") {
        withSourcesJar()
    }
  }
}

Groovy

android {
  publishing {
    singleVariant('release') {
        withSourcesJar()
    }
  }
}

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

إنشاء مكون برنامج بصيغ متعددة لجهة النشر

يمكنك اختيار كل صيغ الإصدار أو مجموعة فرعية منها لوضعها في برنامج واحد. المكون. يستخدم AGP تلقائيًا أسماء أنواع التصميم ونكهة المنتج. وأسمائها وأسماء أبعاد نكهة المنتج لإنشاء سمات بحيث واستهلاكك الأساسي يمكنه التمييز بينهما.

لنشر جميع صيغ الإصدار في مكوِّن واحد، حدِّد allVariants(). في الكتلة multipleVariants{} في ملف build.gradle على مستوى الوحدة:

Kotlin

android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}

Groovy

android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}

يؤدي هذا إلى إنشاء مكوّن واحد يسمى default. لتسمية المكون شيء آخر، استخدام multipleVariants({name}). في هذه الحالة، يتم استخدام جميع سمات نوع التصميم ونكهة المنتج ذات الصلة.

يمكنك أيضًا تحديد الأسعار المتغيرة التي تم نشرها باستخدام includeBuildTypeValues() وincludeFlavorDimensionAndValues():

Kotlin

android {
  publishing {
    multipleVariants("custom") {
      includeBuildTypeValues("debug", "release")
      includeFlavorDimensionAndValues(
        dimension = "color",
        values = arrayOf("blue", "pink")
      )
        includeFlavorDimensionAndValues(
          dimension = "shape",
          values = arrayOf("square")
      )
    }
  }
}

Groovy

android {
  publishing {
    multipleVariants('custom') {
      includeBuildTypeValues('debug', 'release')
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'color',
        /*values =*/ 'blue', 'pink'
      )
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'shape',
        /*values =*/ 'square'
      )
    }
  }
}

في هذا المثال، يحتوي المكوِّن المخصص على جميع مجموعات (debug، release) لنوع الإصدار (blue، pink) للسمة color، و (square) للبُعد shape .

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

يسرد الجدول التالي صيغ جهات النشر الناتجة و والسمات المرتبطة بها.

الصيغة السمات
blueSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug" com.android.build.api.attributes.ProductFlavorAttr:color="blue"
blueSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="blue"
pinkSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"
pinkSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"

من الناحية العملية، يتم نشر المزيد من الصيغ. على سبيل المثال: تم نشر كل من الصيغ المذكورة أعلاه مرتين، مرة للتجميع ومرة للتجميع مع تبعيات مختلفة (استنادًا إلى ما إذا كانت التبعيات المعلنة استخدام implementation أو api) مع قيمة مختلفة للسمة org.gradle.Usage ومع ذلك، فإن العناصر (ملف AAR) لهذين المتغيرين تكون الشيء نفسه.

لمزيد من المعلومات، يُرجى الاطّلاع على publishing وثائق واجهة برمجة التطبيقات.

مشكلة التوافق عند نشر مكتبات متعددة النكهات

لا يمكن لمشروع يستخدم AGP 7.0 أو أقل استهلاك مكتبات متعددة النكهات منشورة مع AGP 7.1 أو أعلى. هذه مشكلة معروفة ناتجة عن تغيير في السمة. اسم لبُعد نكهة المنتج من dimensionName إلى com.android.build.api.attributes.ProductFlavor:dimensionName في الإصدار 7.1 من AGP بناءً على إعداد مشروعك، يمكنك استخدام missingDimensionStrategy في واجهة برمجة التطبيقات للخيارات القديمة للعمل بشأن هذه المشكلة.

على سبيل المثال، لنفترض أن مشروع تطبيقك لا يتضمن سوى منتج إصدار سمة النكهة:

Kotlin

android {
    applicationVariants.forEach { variant ->
        val flavor = variant.productFlavors[0].name
        val attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        val dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}

Groovy

android {
    applicationVariants.forEach { variant ->
        def flavor = variant.getProductFlavors()[0].name
        def attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        def dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}