ในโปรเจ็กต์ที่มีหลายโมดูล การเผยแพร่ไลบรารี Android ให้กับผู้ใช้อาจเป็นเรื่องท้าทายในขณะที่พยายามรักษาโครงสร้างโปรเจ็กต์ที่ชัดเจน ในหลายกรณี คุณอาจต้องเผยแพร่ไลบรารีมากกว่าที่ตั้งใจไว้
ปลั๊กอิน Fused Library ที่รวมมากับปลั๊กอิน Android Gradle จะช่วยในการแพ็กเกจโมดูล Android Library หลายโมดูลเป็น Android Library ที่เผยแพร่ได้รายการเดียว ซึ่งจะช่วยให้คุณแยกซอร์สโค้ดและทรัพยากรของไลบรารีภายในบิลด์เป็นโมดูลได้ตามที่เห็นสมควร โดยไม่ต้องเปิดเผยโครงสร้างของโปรเจ็กต์เมื่อเผยแพร่
การเผยแพร่เป็นไลบรารีเดียวมีประโยชน์ดังนี้
- การอ้างอิงที่ง่ายขึ้น: แทนที่การอ้างอิงไลบรารีหลายรายการด้วย AAR รายการเดียว ซึ่งจะช่วยปรับปรุงการตั้งค่าโปรเจ็กต์และการจัดการเวอร์ชันสำหรับผู้ใช้
- ขนาดไลบรารีที่ลดลง: อาจปรับปรุงการลดขนาดโค้ด ซึ่งส่งผลให้ AAR มีขนาดเล็กลง
- ความปลอดภัยที่ได้รับการปรับปรุง: สามารถควบคุมรายละเอียดการใช้งานภายในของไลบรารีที่เผยแพร่ได้ดียิ่งขึ้น
สร้างไลบรารีแบบรวม
หากต้องการสร้างไลบรารีแบบรวม คุณต้องสร้างโมดูล Android ใหม่ เพิ่มทรัพยากร Dependency แล้วเผยแพร่ไลบรารีแบบรวม
สิ่งที่ต้องมีก่อน
หากต้องการใช้ปลั๊กอิน Fused Library ให้ใช้ AGP 9.0 ขึ้นไป ปลั๊กอิน Fused Library เวอร์ชันก่อนหน้ามีลักษณะการทำงานและปัญหาที่แตกต่างกันซึ่งได้รับการแก้ไขแล้วใน AGP 9.0
เพิ่มโมดูลไลบรารีแบบรวมใหม่
หากต้องการใช้ปลั๊กอิน คุณต้องเพิ่มโมดูล Android ใหม่ลงในโปรเจ็กต์ โดยทำดังนี้
ในตัวอย่างนี้ โมดูลไลบรารีที่รวมเข้าด้วยกันจะเรียกว่า myFusedLibrary
- เพิ่ม
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(คลิกขวาที่ "My Application" > New > Directory) - สร้างไฟล์
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 { }
ดึงดูด
plugins { id 'com.android.fused-library' } androidFusedLibrary { namespace 'com.example.myFusedLibrary' minSdk 21 } dependencies { }
เพิ่มทรัพยากร Dependency
ฟังก์ชันหลักของไลบรารีแบบรวมคือการรวมทรัพยากร Dependency ปลั๊กอินรองรับการเพิ่มทรัพยากร Dependency ของโปรเจ็กต์ที่อยู่ในเครื่องและไลบรารีภายนอก
หากต้องการระบุทรัพยากร Dependency ที่จะรวมเป็นแพ็กเกจ ให้ใช้การกำหนดค่า include
ระบบจะไม่จัดแพ็กเกจทรัพยากร Dependency แบบทรานซิทีฟ
เช่น
Kotlin
dependencies { include(project(":image-rendering")) include("mycoolfonts:font-wingdings:5.0") }
ดึงดูด
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"]) } } }
ดึงดูด
plugins { id 'com.android.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")) } }
ดึงดูด
plugins { id 'com.android.fused-library' id 'maven-publish' } repositories { maven { name 'myLocalRepo' url layout.buildDirectory.dir('myLocalRepo') } }
อัปโหลดไลบรารีที่รวมแล้ว
หากต้องการเผยแพร่ไลบรารีที่รวมแล้ว โปรดดูหัวข้ออัปโหลดไลบรารี
ลักษณะการทำงานและการป้องกัน
การรวมไลบรารี Android มีความซับซ้อนซึ่งอาจทำให้ปลั๊กอินพิจารณาลำดับความสำคัญได้ยาก ตัวอย่างเช่น ไลบรารี 2 รายการที่มี classpath เดียวกันจะทำให้การบิลด์ล้มเหลวเมื่อรวมไลบรารี การผสานทรัพยากรจะพิจารณาลำดับของทรัพยากร Dependency ที่ระบุเมื่อเลือกทรัพยากรที่มีชื่อเดียวกันในไลบรารีต่างๆ
- ไลบรารีที่รวมกันจะเผยแพร่ได้เป็นอาร์ติแฟกต์ไลบรารี Android AAR เท่านั้น เพื่อให้เพิ่มเป็นทรัพยากร Dependency ได้
- ระบบไม่รองรับการรวมไลบรารีที่ใช้การเชื่อมโยงข้อมูล
- คุณไม่สามารถรวมประเภทบิลด์และเวอร์ชันผลิตภัณฑ์หลายรายการไว้ในไลบรารีที่รวมแล้วรายการเดียว สร้างคลังภาพที่รวมกันแยกต่างหากสำหรับตัวแปรต่างๆ
เพื่อสร้างสมดุลระหว่างจำนวนการกำหนดค่าที่จำเป็นและความสะดวกในการใช้งาน ปลั๊กอินจะทำให้บิลด์ล้มเหลวเมื่อเกิดความขัดแย้งที่คลุมเครือ หรือใช้การวิเคราะห์พฤติกรรมเมื่อรวมอาร์ติแฟกต์ ดูรายละเอียดเกี่ยวกับวิธีรวมอาร์ติแฟกต์ได้ในตารางต่อไปนี้
| ประเภท | ลักษณะการทำงาน |
|---|---|
| ชั้นเรียน | ไลบรารีที่มี classpath เดียวกันจะทำให้การบิลด์ล้มเหลวเมื่อรวมไลบรารี |
| ทรัพยากรของแอนดรอยด์ | การรวมทรัพยากรจะพิจารณาลำดับของทรัพยากร Dependency ที่ระบุเมื่อเลือกทรัพยากรที่มีชื่อเดียวกันในตำแหน่งที่ต่างกัน |
| ข้อมูลเมตา AAR | ระบบจะผสานเวอร์ชันข้อมูลเมตาของ AAR โดยจัดลำดับความสำคัญของค่าสูงสุดจากไลบรารีทรัพยากร Dependency แต่ละรายการ มี DSL ที่ให้ไว้เพื่อลบล้างค่าเหล่านี้ Kotlin androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } } |
| แหล่งข้อมูล Java | ไม่อนุญาตให้ใช้ไฟล์ทรัพยากร Java ในไลบรารีหลายรายการที่มีเส้นทางเหมือนกัน และจะส่งผลให้การบิลด์ไม่สำเร็จ |
ปัญหาที่ทราบ
Fused Library เป็นปลั๊กอินใหม่และมีปัญหาที่ทราบซึ่งกำลังดำเนินการแก้ไขเพื่อตอบสนอง Use Case ทั้งหมด คุณสามารถรายงานข้อบกพร่องสำหรับปัญหาที่พบได้
- ปัญหา #454305444: ไลบรารีที่มีกฎ ProGuard ของผู้ใช้ซึ่งไม่ได้ชื่อ "proguard.txt" จะทำให้การบิลด์ไม่สำเร็จ แก้ไขแล้วใน AGP 9.1 ขึ้นไป
- ปัญหา #374982739: การเพิ่มทรัพยากร Dependency ของไฟล์ในไฟล์ .aar อื่นๆ
- ปัญหา #231433225: ไม่รองรับการรวมอาร์ติแฟกต์ RenderScript และ Prefab
ทำความเข้าใจทรัพยากร Dependency ของไลบรารีที่รวมกัน
ไลบรารีแบบรวมไม่มีแหล่งที่มาและใช้ไลบรารี Android เป็นแหล่งที่มาเพียงแหล่งเดียวอย่างมีประสิทธิภาพ คุณจึงควรทำความเข้าใจว่าสิ่งใดมาจากที่ใด หากต้องการแสดงรายการทรัพยากร Dependency ที่ผสานรวมเข้ากับอาร์ติแฟกต์ผลลัพธ์และทรัพยากร Dependency ที่จำเป็นในการสร้างอาร์ติแฟกต์ ให้เรียกใช้งาน gradle :report ในไลบรารีที่รวมเข้าด้วยกัน งานจะสร้างรายงาน JSON ที่บันทึกไว้ในไดเรกทอรี build/reports ของไลบรารีที่รวมแล้ว
หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการขึ้นต่อกันของปลั๊กอินภายใน ให้เรียกใช้งาน gradle :dependencies เพื่อดูสถานะของการกำหนดค่าปลั๊กอิน