ในโปรเจ็กต์ที่มีหลายโมดูล การเผยแพร่ Android Libraries ให้แก่ผู้ใช้ขณะพยายามรักษาโครงสร้างโปรเจ็กต์ที่ชัดเจนอาจเป็นเรื่องยาก ในหลายกรณี คุณอาจต้องเผยแพร่ห้องสมุดมากกว่าที่ตั้งใจไว้
ปลั๊กอิน Fused Library ที่มาพร้อมกับปลั๊กอิน Android Gradle จะช่วยในการ แพ็กเกจโมดูล Android Library หลายโมดูลลงใน Android Library เดียวที่เผยแพร่ได้ ซึ่งจะช่วยให้คุณแยกซอร์สโค้ดและทรัพยากรของไลบรารีออกเป็นโมดูลได้ภายในบิลด์ตามที่ต้องการ ขณะเดียวกันก็หลีกเลี่ยงการเปิดเผยโครงสร้างของโปรเจ็กต์เมื่อมีการเผยแพร่
การเผยแพร่เป็นไลบรารีเดียวมีข้อดีดังนี้
- ทรัพยากร Dependency ที่ง่ายขึ้น: แทนที่ทรัพยากร Dependency ของไลบรารีหลายรายการด้วย AAR รายการเดียว ซึ่งจะช่วยปรับปรุงการตั้งค่าโปรเจ็กต์และการจัดการเวอร์ชันสำหรับผู้ใช้
- ขนาดไลบรารีที่ลดลง: อาจปรับปรุงการลดขนาดโค้ด ซึ่งจะทำให้ 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
ในบล็อกปลั๊กอิน ในไฟล์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
ฟังก์ชันหลักของไลบรารีที่ผสานรวมคือการจัดกลุ่มทรัพยากร 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
เนื่องจาก จะให้การอ้างอิงที่จำเป็นต่อการคอมไพล์อาร์ติแฟกต์ของไลบรารีที่ผสานรวม
ตัวอย่างการกำหนดค่าสิ่งพิมพ์มีดังนี้
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 ในเครื่อง
หากต้องการเผยแพร่ Artifact ของไลบรารีที่ผสานรวมไปยังที่เก็บในเครื่อง ให้กำหนดค่าที่คล้ายกับค่าต่อไปนี้
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 ที่ระบุเมื่อเลือกทรัพยากร ที่มีชื่อเดียวกันในไลบรารีต่างๆ
- ไลบรารีที่ผสานรวมจะเผยแพร่ได้เฉพาะในรูปแบบของอาร์ติแฟกต์ไลบรารี Android (AAR) เพื่อเพิ่มเป็นทรัพยากร Dependency
- ระบบไม่รองรับการรวมไลบรารีที่ใช้การเชื่อมโยงข้อมูล
- คุณไม่สามารถผสานรวมประเภทบิลด์และ Product Flavor หลายรายการภายในไลบรารีที่ผสานรวมรายการเดียว สร้างไลบรารีที่ผสานแยกต่างหากสำหรับตัวแปรต่างๆ
เพื่อสร้างสมดุลระหว่างจำนวนการกำหนดค่าที่จำเป็นและความสะดวกในการใช้งาน ปลั๊กอินจะสร้างไม่สำเร็จเมื่อเกิดความขัดแย้งที่ไม่ชัดเจน หรือใช้ฮิวริสติกเมื่อรวมอาร์ติแฟกต์ ดูรายละเอียดวิธีผสานอาร์ติแฟกต์ได้ในตารางต่อไปนี้
ประเภท | ลักษณะการทำงาน |
---|---|
ชั้นเรียน | ไลบรารีที่มี Classpath เดียวกันจะทำให้การบิลด์ล้มเหลวเมื่อผสานไลบรารี |
ทรัพยากรของแอนดรอยด์ | การผสานทรัพยากรจะพิจารณาลำดับของทรัพยากรที่ระบุเมื่อเลือกทรัพยากรที่มีชื่อเดียวกันในที่ต่างๆ |
ข้อมูลเมตา AAR | ระบบจะผสานเวอร์ชันข้อมูลเมตา AAR โดยจัดลำดับความสำคัญของค่าสูงสุดจากไลบรารีการอ้างอิงแต่ละรายการ เรามี DSL ไว้สำหรับลบล้างค่าเหล่านี้ KotlinandroidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
แหล่งข้อมูล Java | ไม่อนุญาตให้ใช้ไฟล์ทรัพยากร Java ในไลบรารีหลายรายการที่มีเส้นทางเหมือนกัน และจะทำให้การสร้างล้มเหลว |
ปัญหาที่ทราบแล้ว
Fused Library เป็นปลั๊กอินใหม่และมีปัญหาที่ทราบซึ่งกำลังดำเนินการแก้ไข เพื่อรองรับกรณีการใช้งานทั้งหมด
- สร้างไฟล์ JAR ต้นฉบับไม่ได้
- การเพิ่มการอ้างอิงไฟล์ในไฟล์ .aar อื่นๆ
- ไม่รองรับการผสานอาร์ติแฟกต์ RenderScript และ Prefab
ทำความเข้าใจทรัพยากร Dependency ของไลบรารีที่ผสานรวม
เนื่องจากไลบรารีที่ผสานไม่มีแหล่งที่มาและใช้ไลบรารี Android เป็นแหล่งที่มาเดียว จึงควรทำความเข้าใจว่าอะไรมาจากไหน หากต้องการแสดงรายการทรัพยากร Dependency ที่ผสานรวมเข้ากับอาร์ติแฟกต์ผลลัพธ์และทรัพยากร Dependency ที่จำเป็นในการสร้างอาร์ติแฟกต์ ให้เรียกใช้ทาสก์ gradle :report
ในไลบรารีที่ผสานรวม โดยงานจะสร้างรายงาน JSON ที่บันทึกไว้ในไดเรกทอรี
build/reports
ของไลบรารีที่ผสาน
ดูข้อมูลเพิ่มเติมที่เกี่ยวข้องกับการขึ้นต่อกันของปลั๊กอินภายในได้โดยเรียกใช้
gradle :dependencies
เพื่อดูสถานะของการกำหนดค่าปลั๊กอิน