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

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

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

การเผยแพร่เป็นไลบรารีเดียวอาจให้ประโยชน์ดังต่อไปนี้

  • ทรัพยากร Dependency ที่เรียบง่าย: ใช้ AAR รายการเดียวแทนทรัพยากร Dependency ของไลบรารีหลายรายการ ซึ่งจะช่วยลดความซับซ้อนของการตั้งค่าโปรเจ็กต์และการจัดการเวอร์ชันสำหรับผู้ใช้
  • ขนาดคลังลดลง: อาจปรับปรุงการลดขนาดโค้ด ซึ่งส่งผลให้ 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 ในบล็อก plugins ในไฟล์ 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

ฟังก์ชันหลักของไลบรารีที่ผสานคือการสร้าง 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 ที่ให้ไว้เพื่อลบล้างค่าเหล่านี้

Kotlin

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

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

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

  • ไฟล์ lint.jar จะไม่รวมอยู่ใน AAR ที่ผสาน
  • การเพิ่มไฟล์ที่ต้องพึ่งพาในไฟล์ .aar อื่นๆ
  • ไม่รองรับการผสานอาร์ติแฟกต์ RenderScript กับ Prefab

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

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

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