เผยแพร่ไลบรารี Android หลายรายการเป็นไลบรารีเดียวด้วย Fused Library

ในโปรเจ็กต์ที่มีหลายโมดูล การเผยแพร่ไลบรารี 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

  1. เพิ่ม include(":myFusedLibrary") ต่อท้ายไฟล์ settings.gradle.kts
  2. เพิ่ม android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } ใต้ส่วน [plugins] ในไฟล์ gradle/libs.versions.toml
  3. เพิ่ม alias(libs.plugins.android.fusedlibrary) apply false ในบล็อกปลั๊กอินในไฟล์ build.gradle.kts ระดับบนสุด
  4. หากต้องการสร้างโมดูล myFusedLibrary ให้สร้างไดเรกทอรีใหม่ชื่อ myFusedLibrary (คลิกขวาที่ "My Application" > New > Directory)
  5. สร้างไฟล์ build.gradle.kts ในโมดูล myFusedLibrary (คลิกขวาที่โมดูล myFusedLibrary > ใหม่ > ไฟล์)
  6. วางโค้ดต่อไปนี้ลงในไฟล์ 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 เพื่อดูสถานะของการกำหนดค่าปลั๊กอิน