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

ในโปรเจ็กต์ที่มีหลายโมดูล การเผยแพร่ Android Libraries ให้แก่ผู้ใช้ขณะพยายามรักษาโครงสร้างโปรเจ็กต์ที่ชัดเจนอาจเป็นเรื่องยาก ในหลายกรณี คุณอาจต้องเผยแพร่ห้องสมุดมากกว่าที่ตั้งใจไว้

ปลั๊กอิน Fused Library ที่มาพร้อมกับปลั๊กอิน Android Gradle จะช่วยในการ แพ็กเกจโมดูล Android Library หลายโมดูลลงใน Android Library เดียวที่เผยแพร่ได้ ซึ่งจะช่วยให้คุณแยกซอร์สโค้ดและทรัพยากรของไลบรารีออกเป็นโมดูลได้ภายในบิลด์ตามที่ต้องการ ขณะเดียวกันก็หลีกเลี่ยงการเปิดเผยโครงสร้างของโปรเจ็กต์เมื่อมีการเผยแพร่

การเผยแพร่เป็นไลบรารีเดียวมีข้อดีดังนี้

  • ทรัพยากร Dependency ที่ง่ายขึ้น: แทนที่ทรัพยากร Dependency ของไลบรารีหลายรายการด้วย AAR รายการเดียว ซึ่งจะช่วยปรับปรุงการตั้งค่าโปรเจ็กต์และการจัดการเวอร์ชันสำหรับผู้ใช้
  • ขนาดไลบรารีที่ลดลง: อาจปรับปรุงการลดขนาดโค้ด ซึ่งจะทำให้ AAR มีขนาดเล็กลง
  • การรักษาความปลอดภัยที่ดียิ่งขึ้น: สามารถควบคุมรายละเอียดการติดตั้งใช้งานภายในของไลบรารีที่เผยแพร่ได้ดียิ่งขึ้น

สร้างคลังที่ผสานรวม

หากต้องการสร้างไลบรารีที่ผสานรวม คุณต้องสร้างโมดูล Android ใหม่ เพิ่ม การอ้างอิง แล้วเผยแพร่ไลบรารีที่ผสานรวม

เพิ่มโมดูลไลบรารีที่ผสานรวมใหม่

หากต้องการใช้ปลั๊กอิน คุณต้องเพิ่มโมดูล Android ใหม่ลงในโปรเจ็กต์โดยทำดังนี้

ในตัวอย่างนี้ โมดูลไลบรารีที่ผสานรวมจะเรียกว่า myFusedLibrary

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

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
แหล่งข้อมูล Java ไม่อนุญาตให้ใช้ไฟล์ทรัพยากร Java ในไลบรารีหลายรายการที่มีเส้นทางเหมือนกัน และจะทำให้การสร้างล้มเหลว

ปัญหาที่ทราบแล้ว

Fused Library เป็นปลั๊กอินใหม่และมีปัญหาที่ทราบซึ่งกำลังดำเนินการแก้ไข เพื่อรองรับกรณีการใช้งานทั้งหมด

  • สร้างไฟล์ JAR ต้นฉบับไม่ได้
  • การเพิ่มการอ้างอิงไฟล์ในไฟล์ .aar อื่นๆ
  • ไม่รองรับการผสานอาร์ติแฟกต์ RenderScript และ Prefab

ทำความเข้าใจทรัพยากร Dependency ของไลบรารีที่ผสานรวม

เนื่องจากไลบรารีที่ผสานไม่มีแหล่งที่มาและใช้ไลบรารี Android เป็นแหล่งที่มาเดียว จึงควรทำความเข้าใจว่าอะไรมาจากไหน หากต้องการแสดงรายการทรัพยากร Dependency ที่ผสานรวมเข้ากับอาร์ติแฟกต์ผลลัพธ์และทรัพยากร Dependency ที่จำเป็นในการสร้างอาร์ติแฟกต์ ให้เรียกใช้ทาสก์ gradle :report ในไลบรารีที่ผสานรวม โดยงานจะสร้างรายงาน JSON ที่บันทึกไว้ในไดเรกทอรี build/reports ของไลบรารีที่ผสาน

ดูข้อมูลเพิ่มเติมที่เกี่ยวข้องกับการขึ้นต่อกันของปลั๊กอินภายในได้โดยเรียกใช้ gradle :dependencies เพื่อดูสถานะของการกำหนดค่าปลั๊กอิน