ในโปรเจ็กต์ที่มีโมดูลจำนวนมาก การเผยแพร่ Android Library ให้แก่ผู้ใช้ขณะพยายามรักษาโครงสร้างโปรเจ็กต์ให้ชัดเจนอาจเป็นเรื่องยาก ในหลายกรณี จำเป็นต้องเผยแพร่ห้องสมุดมากกว่าที่ตั้งใจไว้
ปลั๊กอินไลบรารีแบบรวมที่มาพร้อมกับปลั๊กอิน Android Gradle ช่วยในการแพ็กเกจโมดูลไลบรารี Android หลายรายการไว้ในไลบรารี Android ที่เผยแพร่ได้รายการเดียว ซึ่งจะช่วยให้คุณแยกโมดูลซอร์สโค้ดและทรัพยากรของไลบรารีภายในบิลด์ได้ตามต้องการ ทั้งยังหลีกเลี่ยงการเปิดเผยโครงสร้างโปรเจ็กต์เมื่อเผยแพร่
การเผยแพร่เป็นไลบรารีเดียวอาจให้ประโยชน์ดังต่อไปนี้
- ทรัพยากร Dependency ที่เรียบง่าย: ใช้ AAR รายการเดียวแทนทรัพยากร Dependency ของไลบรารีหลายรายการ ซึ่งจะช่วยลดความซับซ้อนของการตั้งค่าโปรเจ็กต์และการจัดการเวอร์ชันสำหรับผู้ใช้
- ขนาดคลังลดลง: อาจปรับปรุงการลดขนาดโค้ด ซึ่งส่งผลให้ AAR ลดลง
- การรักษาความปลอดภัยที่ดีขึ้น: ควบคุมรายละเอียดการใช้งานภายในของไลบรารีที่เผยแพร่ได้ดีขึ้น
สร้างคลังแบบรวม
หากต้องการสร้างไลบรารีที่ผสานแล้ว คุณต้องสร้างโมดูล Android ใหม่ เพิ่มข้อกําหนด จากนั้นเผยแพร่ไลบรารีที่ผสานแล้ว
เพิ่มโมดูลคลังแบบรวมใหม่
หากต้องการใช้ปลั๊กอิน คุณต้องเพิ่มโมดูล Android ใหม่ลงในโปรเจ็กต์ โดยทำดังนี้
ในตัวอย่างนี้ โมดูลไลบรารีที่ผสานจะเรียกว่า myFusedLibrary
- เปิดใช้การรองรับคลังแบบรวมโดยเพิ่ม
android.experimental.fusedLibrarySupport=true
ลงในไฟล์gradle.properties
- เพิ่ม
include(":myFusedLibrary")
ต่อท้ายไฟล์settings.gradle.kts
- เพิ่ม
android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" }
ในส่วน[plugins]
ในไฟล์gradle/libs.versions.toml
- เพิ่ม
alias(libs.plugins.android.fusedlibrary) apply false
ในบล็อก plugins ในไฟล์build.gradle.kts
ระดับบนสุด - หากต้องการสร้างโมดูล
myFusedLibrary
ให้สร้างไดเรกทอรีใหม่ชื่อmyFusedLibrary
(คลิกขวาที่ "แอปพลิเคชันของฉัน" > ใหม่ > ไดเรกทอรี) - สร้างไฟล์
build.gradle.kts
ในโมดูลmyFusedLibrary
(คลิกขวาที่โมดูลmyFusedLibrary
> ใหม่ > ไฟล์) - วางข้อมูลต่อไปนี้ลงในไฟล์
myFusedLibrary/build.gradle.kts
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { namespace = "com.example.myFusedLibrary" minSdk = 21 } dependencies { }
Groovy
plugins { id 'fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
เพิ่มทรัพยากร Dependency
ฟังก์ชันหลักของไลบรารีที่ผสานคือการสร้าง Bundle ของ Dependency ปลั๊กอินรองรับการเพิ่มทรัพยากร Dependency ของโปรเจ็กต์ในเครื่องและไลบรารีภายนอก
หากต้องการระบุ Dependency ที่จะรวมไว้ในแพ็กเกจ ให้ใช้การกําหนดค่า include
ระบบจะไม่รวมแพ็กเกจของข้อกําหนดเบื้องต้นแบบทรานซิทีฟ
เช่น
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
Groovy
dependencies { include project(':image-rendering') include 'mycoolfonts:font-wingdings:5.0' }
เผยแพร่คลังแบบผสาน
คุณควรทำความเข้าใจการเผยแพร่ไลบรารี Android ก่อนเผยแพร่ไลบรารีที่ผสาน การเผยแพร่คลังแบบผสานจะคล้ายกับการเผยแพร่คลัง Android แต่มีข้อแตกต่างที่สำคัญบางอย่างที่คุณต้องพิจารณาเพื่อเผยแพร่คลังแบบผสานอย่างถูกต้อง ดังนี้
- นอกจากนี้ คุณยังต้องใช้ปลั๊กอิน Maven Publish กับโมดูลที่ใช้ปลั๊กอิน Fused Library ด้วย
- การเผยแพร่ต้องรับค่าจาก
fusedLibraryComponent
เนื่องจากจะระบุทรัพยากร Dependency ที่จําเป็นต่อการจัดทําอาร์ติแฟกต์คลังแบบผสาน
ตัวอย่างการกำหนดค่าสิ่งพิมพ์มีดังนี้
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } androidFusedLibrary { … } dependencies { … } publishing { publications { register<MavenPublication>("release") { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" from(components["fusedLibraryComponent"]) } } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } androidFusedLibrary { … } dependencies { … } publishing { publications { release(MavenPublication) { groupId = "my-company" artifactId = "my-fused-library" version = "1.0" afterEvaluate { from components.fusedLibraryComponent } } }
เผยแพร่ไลบรารีที่ผสานแล้วสำหรับการทดสอบ
คุณควรทดสอบโดยอิงตามไลบรารีที่ผสานซึ่งเผยแพร่แล้วจากแอป Android หรือไลบรารี Android วิธีที่เราแนะนำคือการเผยแพร่ไปยังไลบรารีที่ผสานและประกาศพึ่งพาโปรเจ็กต์ไปยังที่เก็บ Maven ในพื้นที่
หากต้องการเผยแพร่อาร์ติแฟกต์ไลบรารีที่ผสานไปยังที่เก็บข้อมูลในเครื่อง ให้กําหนดค่าที่คล้ายกับตัวอย่างต่อไปนี้
Kotlin
plugins { alias(libs.plugins.android.fusedlibrary) `maven-publish` } repositories { maven { name = "myLocalRepo" url = uri(layout.buildDirectory.dir("myLocalRepo")) } }
Groovy
plugins { id 'fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
อัปโหลดคลังแบบผสาน
หากต้องการเผยแพร่คลังแบบผสาน โปรดดูอัปโหลดคลัง
ลักษณะการทํางานและมาตรการป้องกัน
การรวมไลบรารี Android มีความซับซ้อนที่อาจทําให้ปลั๊กอินพิจารณาลําดับความสําคัญได้ยาก ตัวอย่างเช่น ไลบรารี 2 รายการที่มี classpath เดียวกันจะทำให้การบิลด์ไม่สําเร็จเมื่อผสานไลบรารี การผสานทรัพยากรจะพิจารณาลำดับของทรัพยากร Dependency ที่ระบุเมื่อเลือกทรัพยากรที่มีชื่อเดียวกันในไลบรารีต่างๆ
- ไลบรารีที่ผสานจะเผยแพร่ได้เฉพาะในรูปแบบอาร์ติแฟกต์ AAR ของไลบรารี Android เพื่อเพิ่มเป็น Dependency
- ไม่รองรับการผสานคลังที่ใช้การเชื่อมโยงข้อมูล
- คุณไม่สามารถผสานประเภทบิลด์และตัวแปรผลิตภัณฑ์หลายรายการภายในคลังแบบผสานเดียว สร้างคลังแบบรวมแยกต่างหากสำหรับตัวแปรต่างๆ
เพื่อรักษาสมดุลระหว่างปริมาณการกําหนดค่าที่จําเป็นและความสะดวกในการใช้งาน ปลั๊กอินจะสร้างไม่สําเร็จเมื่อเกิดข้อขัดแย้งที่ไม่ชัดเจน หรือจะใช้วิธีการเฮิวริสติกเมื่อผสานอาร์ติแฟกต์ ดูรายละเอียดวิธีผสานอาร์ติแฟกต์ได้ในตารางต่อไปนี้
ประเภท | ลักษณะการทำงาน |
---|---|
ชั้นเรียน | ไลบรารีที่มี classpath เดียวกันจะทำให้การบิลด์ไม่สําเร็จเมื่อผสานไลบรารี |
ทรัพยากรของแอนดรอยด์ | การผสานทรัพยากรจะพิจารณาลำดับของทรัพยากรที่ต้องพึ่งพาซึ่งระบุไว้เมื่อเลือกทรัพยากรที่มีชื่อเดียวกันในโปรเจ็กต์อื่น |
ข้อมูลเมตา AAR | ระบบจะผสานเวอร์ชันข้อมูลเมตา AAR โดยให้ความสำคัญกับค่าสูงสุดจากไลบรารี Dependency แต่ละรายการ มี DSL ที่ให้ไว้เพื่อลบล้างค่าเหล่านี้ KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
แหล่งข้อมูล Java | ระบบไม่อนุญาตให้มีไฟล์ทรัพยากร Java ในไลบรารีหลายรายการที่มีเส้นทางเหมือนกัน ซึ่งจะส่งผลให้การบิลด์ไม่สําเร็จ |
ปัญหาที่ทราบแล้ว
ไลบรารีแบบรวมเป็นปลั๊กอินใหม่และมีปัญหาที่ทราบซึ่งกําลังแก้ไขเพื่อรองรับกรณีการใช้งานทั้งหมด
- ไฟล์
lint.jar
จะไม่รวมอยู่ใน AAR ที่ผสาน - การเพิ่มไฟล์ที่ต้องพึ่งพาในไฟล์ .aar อื่นๆ
- ไม่รองรับการผสานอาร์ติแฟกต์ RenderScript กับ Prefab
ทําความเข้าใจทรัพยากร Dependency ของไลบรารีที่ผสาน
ไลบรารีที่ผสานจะไม่มีแหล่งที่มาและใช้ไลบรารี Android อย่างมีประสิทธิภาพเป็นแหล่งที่มาเพียงแหล่งเดียว คุณจึงต้องเข้าใจว่าอะไรมาจากที่ใด หากต้องการแสดงรายการ Dependency ที่ผสานรวมไว้ในอาร์ติแฟกต์ที่ได้และ Dependency ที่จําเป็นสําหรับการสร้างอาร์ติแฟกต์ ให้เรียกใช้งาน gradle :report
ในไลบรารีที่ผสาน งานจะสร้างรายงาน JSON ที่บันทึกไว้ในไดเรกทอรี build/reports
ของคลังแบบผสาน
ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกำหนดของปลั๊กอินภายในได้ด้วยการเรียกใช้งาน gradle :dependencies
เพื่อดูสถานะการกำหนดค่าปลั๊กอิน