กําหนดค่าตัวแปรสื่อเผยแพร่

เวอร์ชันต่างๆ ของสื่อเผยแพร่ช่วยให้คุณสร้างประสบการณ์ที่เหมาะกับผู้ใช้ได้มากขึ้น การกำหนดค่าตัวแปรสื่อเผยแพร่ ช่วยให้คุณเผยแพร่ตัวแปรของบิลด์ต่างๆ ได้ โดยแต่ละแบบต่างก็มีแอตทริบิวต์ของตัวเอง

การเผยแพร่เวอร์ชันต่างๆ ของบิลด์ในไลบรารีจะช่วยให้ผู้ใช้เลือก ฟีเจอร์ที่เหมาะสมกับความต้องการ เช่น คุณสามารถเผยแพร่ สำหรับ แก้ไขข้อบกพร่องกับรุ่น ประเภทบิลด์ อาร์ติแฟกต์การเผยแพร่การแก้ไขข้อบกพร่องอาจมีโค้ดการบันทึกเพิ่มเติมและ ทรัพยากร Dependency ที่แตกต่างกัน เพื่อเปิดใช้การบันทึกเพิ่มเติมนี้

ก่อนดำเนินการต่อ โปรดตรวจสอบว่า เตรียมคลังให้พร้อมสำหรับการเผยแพร่

ใช้ข้อมูลเมตาของโมดูล Gradle

ในการเผยแพร่เวอร์ชันต่างๆ ของคลัง คุณต้องใช้ ข้อมูลเมตาของโมดูล Gradle (GMM) GMM อธิบายสิ่งตีพิมพ์ของคุณและดูแลรักษา การจัดการทรัพยากร Dependency แบบอิงตามตัวแปร GMM จะเผยแพร่พร้อมกับไลบรารีของคุณโดยค่าเริ่มต้น

ประโยชน์ของการใช้ GMM ได้แก่

  • หากใช้ GMM ที่มี Gradle 6.0 ขึ้นไป คุณจะเผยแพร่สื่อเผยแพร่หลายรายการได้ หรืออาร์ติแฟกต์หลายรายการ ซึ่งแต่ละรายการจะมีแอตทริบิวต์และการอ้างอิงของตัวเอง หากคุณใช้ไฟล์ POM ของ Maven แทนที่จะเป็น GMM คุณสามารถเผยแพร่อาร์ติแฟกต์ได้เพียง 1 รายการเท่านั้น ถ้าคุณใช้ไฟล์ POM คุณสามารถ สามารถเผยแพร่อาร์ติแฟกต์เพิ่มเติมโดยใช้ตัวแยกประเภทได้ แต่อาร์ติแฟกต์เพิ่มเติม จะมีทรัพยากร Dependency ของตัวเองไม่ได้
  • Gradle สร้างตัวแปร 1 ตัวแปร สำหรับการคอมไพล์ อีกตัว สำหรับรันไทม์ โดยแต่ละรายการจะมีทรัพยากร Dependency ของตนเอง คุณอาจเผยแพร่ตัวแปร 1 รายการเพื่อการคอมไพล์ และอีกแคมเปญหนึ่งสำหรับรันไทม์ ผู้บริโภคจึงสามารถเลือกตามเวลาที่ใช้ คลังของคุณ GMM ทำให้ผู้บริโภคเห็นทรัพยากร Dependency ต่างๆ สำหรับการคอมไพล์และ ตามการใช้งานไลบรารีที่เผยแพร่ api, implementation หรือ compileOnly/runtimeOnly โปรดดู การกำหนดค่าการขึ้นต่อกัน เพื่อดูรายการทรัพยากร Dependency ทั้งหมด ซึ่งคุณเลือกใช้ได้แม้ว่าคุณจะเผยแพร่ ตัวแปรของสื่อเผยแพร่
  • เมื่อใช้อุปกรณ์ทดสอบ คุณจะเผยแพร่ตัวแปรเพิ่มเติมที่มีการตั้งค่าพิเศษได้ ข้อมูลเมตาหรือ ความสามารถ ที่ผู้บริโภคเลือกได้ ซึ่งจะพร้อมใช้งานแม้ว่าคุณจะเผยแพร่ ตัวแปรสื่อเผยแพร่เดียว

ทําความเข้าใจรูปแบบต่างๆ ของสื่อเผยแพร่

หากต้องการทําความเข้าใจวิธีการทํางานของรูปแบบต่างๆ ของสื่อเผยแพร่ คุณควรทําความคุ้นเคยกับ สำหรับ Gradle ขั้นตอนการเผยแพร่พื้นฐาน แนวคิดหลักของการเผยแพร่มีดังนี้

  • ตัวแปรบิลด์: Gradle การกำหนดค่าใช้ในการสร้างไลบรารีของคุณ คือการผสมผสานระหว่างผลิตภัณฑ์ประเภทต่างๆ ของประเภทบิลด์และรสชาติของผลิตภัณฑ์ ดูข้อมูลเพิ่มเติมได้ที่ อภิธานศัพท์บิลด์ของ Android
  • อาร์ติแฟกต์: ไฟล์หรือไดเรกทอรีที่บิลด์สร้างขึ้น ในบริบทของการเผยแพร่ห้องสมุด อาร์ติแฟกต์มักจะเป็นไฟล์ JAR หรือ AAR
  • รูปแบบของสื่อเผยแพร่ อาร์ติแฟกต์ที่มีแอตทริบิวต์ ฟีเจอร์ และทรัพยากร Dependency ที่เกี่ยวข้อง หมายเหตุ ซึ่ง Gradle เรียกตัวแปรของสื่อเผยแพร่ว่า variants อย่างไรก็ตาม คำขอเหล่านี้เรียกว่า ตัวแปรของสื่อเผยแพร่ในเอกสารเหล่านี้เพื่อแยกความแตกต่างจาก สร้างตัวแปร
  • แอตทริบิวต์: Gradle ใช้แอตทริบิวต์เพื่อระบุและเลือกตัวแปรสื่อเผยแพร่ หากมี คือหลายตัวเลือก เช่น org.gradle.usage=java-api และ org.gradle.jvm.version=11 เป็นแอตทริบิวต์รายละเอียดปลีกย่อย
  • คอมโพเนนต์ซอฟต์แวร์: ออบเจ็กต์ Gradle ที่สามารถเก็บตัวแปรสื่อเผยแพร่ได้อย่างน้อย 1 รายการและมีการเผยแพร่แล้ว ไปยังพิกัด Maven ชุดเดียว (groupdId:artifactId:version) ใช่เลย ใน DSL ของ Gradle Project.getComponents()
  • สื่อเผยแพร่: ข้อมูลที่เผยแพร่ไปยังที่เก็บและผู้บริโภคใช้ สื่อเผยแพร่ต่างๆ ประกอบด้วย ของคอมโพเนนต์ซอฟต์แวร์หนึ่งและข้อมูลเมตา เช่น ข้อมูลระบุตัวตนของคอมโพเนนต์ซอฟต์แวร์นั้น (groupId:artifactId:version)

ปลั๊กอิน Android Gradle (AGP) 7.1 เปิดตัว ภาษาเฉพาะโดเมน (DSL) เพื่อควบคุมเวอร์ชันที่ใช้ระหว่างบิลด์ สื่อเผยแพร่ และแหล่งที่มาที่ละเว้น DSL ช่วยให้คุณสามารถสร้างอินสแตนซ์ของ SoftwareComponent ที่มีรายการใดรายการหนึ่งต่อไปนี้

  • ตัวแปรสื่อเผยแพร่ 1 รายการจากตัวแปรบิลด์ 1 รายการ
  • ตัวแปรสื่อเผยแพร่หลายรายการจากตัวแปรบิลด์ต่างๆ

เมื่อสร้างคอมโพเนนต์ซอฟต์แวร์ที่มีตัวแปรของสื่อเผยแพร่หลายรายการ ชุด AGP ขึ้นในแต่ละผลิตภัณฑ์ย่อย เพื่อให้ผู้บริโภคเลือก ตัวแปรที่เหมาะสมที่ต้องการ แอตทริบิวต์เหล่านี้มาจากบิลด์โดยตรง ประเภทและเวอร์ชันที่ใช้สร้างตัวแปรบิลด์ กำลังสร้าง คอมโพเนนต์ที่มีตัวแปรการเผยแพร่เดียวไม่จำเป็นต้องมีแอตทริบิวต์เนื่องจาก ไม่จำเป็นต้องแยกความแตกต่าง

สร้างคอมโพเนนต์ซอฟต์แวร์ที่มีตัวแปรของสื่อเผยแพร่รายการเดียว

ข้อมูลโค้ดต่อไปนี้กำหนดค่าคอมโพเนนต์ซอฟต์แวร์ด้วยสื่อเผยแพร่เดียว ตัวแปรที่สร้างขึ้นจากตัวแปรบิลด์ release และเพิ่ม JAR ต้นทางเป็น อาร์ติแฟกต์รอง:

Kotlin

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

ดึงดูด

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

คุณจะสร้างคอมโพเนนต์ได้หลายรายการ โดยให้แต่ละคอมโพเนนต์มีรูปแบบสื่อเผยแพร่เดียว และ ให้กระจายภายใต้พิกัด Maven ต่างๆ ในกรณีนี้ แอตทริบิวต์ ไม่ได้ตั้งค่าไว้ในตัวแปรของสื่อเผยแพร่ คุณบอกไม่ได้ว่าสื่อเผยแพร่นี้ ตัวแปรมาจากตัวแปรบิลด์ release โดยพิจารณาจากสื่อเผยแพร่ ข้อมูลเมตา เนื่องจากมีเพียงรูปแบบสื่อเผยแพร่ที่เกี่ยวข้องเพียงรูปแบบเดียว จึงไม่จำเป็นต้องใช้ เพื่อชี้แจงให้ชัดเจน

สร้างคอมโพเนนต์ซอฟต์แวร์ที่มีตัวแปรของสื่อเผยแพร่หลายรายการ

คุณเลือกตัวแปรของบิลด์ทั้งหมดหรือบางส่วนเพื่อใส่ในซอฟต์แวร์เดียวได้ คอมโพเนนต์ AGP จะใช้ชื่อประเภทบิลด์และเวอร์ชันผลิตภัณฑ์โดยอัตโนมัติ และชื่อมิติข้อมูลเวอร์ชันผลิตภัณฑ์เพื่อสร้างแอตทริบิวต์เพื่อให้แอตทริบิวต์ โปรเจ็กต์ที่กำลังใช้งานอยู่จะแยกความแตกต่างระหว่างโปรเจ็กต์ได้

หากต้องการเผยแพร่ตัวแปรของบิลด์ทั้งหมดในคอมโพเนนต์เดียว ให้ระบุ allVariants() ในบล็อก multipleVariants{} ในไฟล์ build.gradle ระดับโมดูล

Kotlin

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

ดึงดูด

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")
      )
    }
  }
}

ดึงดูด

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"

ในทางปฏิบัติมีการเผยแพร่ตัวแปรมากขึ้น ตัวอย่างเช่น ตัวแปรแต่ละตัวข้างต้นได้รับการเผยแพร่ 2 ครั้ง ครั้งแรกสำหรับการรวบรวม และอีกครั้งสำหรับ ที่มีทรัพยากร Dependency ต่างๆ กัน (ขึ้นอยู่กับว่าทรัพยากร Dependency ที่ประกาศหรือไม่) ใช้ implementation หรือ api) และระบุค่าที่แตกต่างกันสำหรับแอตทริบิวต์ org.gradle.Usage อย่างไรก็ตาม อาร์ติแฟกต์ (ไฟล์ AAR) สำหรับ 2 ตัวแปรนี้ แบบเดียวกัน

สำหรับข้อมูลเพิ่มเติม โปรดดู publishing เอกสารประกอบของ API

ปัญหาความเข้ากันได้สำหรับการเผยแพร่ไลบรารีหลายเวอร์ชัน

โปรเจ็กต์ที่ใช้ AGP 7.0 หรือต่ำกว่าไม่สามารถใช้ไลบรารีหลากหลายเวอร์ชันที่เผยแพร่แล้ว ที่มี AGP 7.1 ขึ้นไป กรณีนี้เป็นปัญหาที่ทราบอยู่แล้วซึ่งเกิดจากการเปลี่ยนแปลงแอตทริบิวต์ ชื่อสำหรับมิติข้อมูลรสชาติของผลิตภัณฑ์จาก dimensionName ถึง com.android.build.api.attributes.ProductFlavor:dimensionName ใน AGP 7.1 คุณสามารถใช้ missingDimensionStrategy ใน API เวอร์ชันเดิมจะใช้งานได้ เกี่ยวกับปัญหานี้

ตัวอย่างเช่น สมมติว่าโปรเจ็กต์แอปพลิเคชันของคุณมีผลิตภัณฑ์เวอร์ชันเท่านั้น มิติข้อมูลของเวอร์ชัน:

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)
    }
}

ดึงดูด

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)
    }
}