เวอร์ชันต่างๆ ของสื่อเผยแพร่ช่วยให้คุณสร้างประสบการณ์ที่เหมาะกับผู้ใช้ได้มากขึ้น การกำหนดค่าตัวแปรสื่อเผยแพร่ ช่วยให้คุณเผยแพร่ตัวแปรของบิลด์ต่างๆ ได้ โดยแต่ละแบบต่างก็มีแอตทริบิวต์ของตัวเอง
การเผยแพร่เวอร์ชันต่างๆ ของบิลด์ในไลบรารีจะช่วยให้ผู้ใช้เลือก ฟีเจอร์ที่เหมาะสมกับความต้องการ เช่น คุณสามารถเผยแพร่ สำหรับ แก้ไขข้อบกพร่องกับรุ่น ประเภทบิลด์ อาร์ติแฟกต์การเผยแพร่การแก้ไขข้อบกพร่องอาจมีโค้ดการบันทึกเพิ่มเติมและ ทรัพยากร 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 ของ GradleProject.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"
|
pinkSquareDebug |
com.android.build.api.attributes.BuildTypeAttr="debug"
|
pinkSquareRelease |
com.android.build.api.attributes.BuildTypeAttr="release"
|
ในทางปฏิบัติมีการเผยแพร่ตัวแปรมากขึ้น ตัวอย่างเช่น
ตัวแปรแต่ละตัวข้างต้นได้รับการเผยแพร่ 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)
}
}