Phát hành nhiều thư viện Android dưới dạng một thư viện bằng Thư viện hợp nhất

Trong các dự án có nhiều mô-đun, bạn có thể gặp khó khăn khi phân phối Thư viện Android cho người dùng trong khi cố gắng duy trì cấu trúc dự án rõ ràng. Trong nhiều trường hợp, bạn cần xuất bản nhiều thư viện hơn dự kiến.

Trình bổ trợ Fused Library (Thư viện hợp nhất) đi kèm với Trình bổ trợ Android cho Gradle hỗ trợ đóng gói nhiều mô-đun Thư viện Android thành một Thư viện Android có thể xuất bản duy nhất. Điều này cho phép bạn mô-đun hoá mã nguồn và tài nguyên của thư viện trong bản dựng theo ý muốn, đồng thời tránh để lộ cấu trúc dự án sau khi phân phối.

Việc phân phối dưới dạng một thư viện duy nhất có thể mang lại những lợi ích sau:

  • Đơn giản hoá các phần phụ thuộc: thay thế nhiều phần phụ thuộc thư viện bằng một AAR duy nhất, tinh giản quá trình thiết lập dự án và quản lý phiên bản cho người dùng
  • Giảm kích thước thư viện: có thể cải thiện tính năng rút gọn mã, dẫn đến các AAR nhỏ hơn
  • Cải thiện tính bảo mật: có thể giúp bạn kiểm soát tốt hơn các chi tiết triển khai nội bộ của thư viện đã xuất bản

Tạo một thư viện kết hợp

Để tạo một thư viện kết hợp, bạn phải tạo một mô-đun Android mới, thêm các phần phụ thuộc rồi xuất bản thư viện kết hợp.

Thêm mô-đun thư viện kết hợp mới

Để sử dụng trình bổ trợ này, bạn phải thêm một mô-đun Android mới vào dự án của mình:

Trong ví dụ này, mô-đun thư viện kết hợp sẽ có tên là myFusedLibrary.

  1. Bật tính năng hỗ trợ thư viện kết hợp bằng cách thêm android.experimental.fusedLibrarySupport=true vào tệp gradle.properties.
  2. Thêm include(":myFusedLibrary") vào tệp settings.gradle.kts.
  3. Thêm android-fusedlibrary = { id = "com.android.fused-library", version.ref = "agp" } bên dưới mục [plugins] trong tệp gradle/libs.versions.toml.
  4. Thêm alias(libs.plugins.android.fusedlibrary) apply false vào khối trình bổ trợ trong tệp build.gradle.kts cấp cao nhất.
  5. Để tạo mô-đun myFusedLibrary, hãy tạo một thư mục mới có tên là myFusedLibrary (nhấp chuột phải vào "My Application" (Ứng dụng của tôi) > New (Mới) > Directory (Thư mục)).
  6. Tạo một tệp build.gradle.kts trong mô-đun myFusedLibrary (nhấp chuột phải vào mô-đun myFusedLibrary > New > File (Mới > Tệp)).
  7. Dán nội dung sau vào tệp 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 {

}

Thêm phần phụ thuộc

Chức năng cốt lõi của thư viện kết hợp là kết hợp các phần phụ thuộc. Trình bổ trợ này hỗ trợ việc thêm các phần phụ thuộc của dự án cục bộ và các thư viện bên ngoài. Để chỉ định các phần phụ thuộc cần đóng gói, hãy sử dụng cấu hình include. Các phần phụ thuộc bắc cầu không được đóng gói.

Ví dụ:

Kotlin

dependencies {
    include(project(":image-rendering"))
    include("mycoolfonts:font-wingdings:5.0")
}

Groovy

dependencies {
    include project(':image-rendering')
    include 'mycoolfonts:font-wingdings:5.0'
}

Xuất bản thư viện kết hợp

Bạn nên làm quen với việc xuất bản một thư viện Android trước khi xuất bản một thư viện kết hợp. Việc xuất bản một thư viện kết hợp tương tự như việc xuất bản một Thư viện Android, tuy nhiên, có một số điểm khác biệt chính mà bạn phải cân nhắc để xuất bản thư viện kết hợp một cách chính xác:

  • Bạn cũng phải áp dụng Trình bổ trợ phát hành của Maven cho mọi mô-đun đã áp dụng trình bổ trợ FusedLibrary.
  • Ấn phẩm phải kế thừa từ fusedLibraryComponent vì ấn phẩm này cung cấp các phần phụ thuộc cần thiết để biên dịch cấu phần phần mềm thư viện kết hợp.

Dưới đây là ví dụ về cấu hình ấn phẩm:

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
        }
    }
}

Xuất bản thư viện kết hợp để kiểm thử

Bạn nên kiểm thử tuỳ thuộc vào một thư viện kết hợp đã xuất bản từ một ứng dụng Android hoặc thư viện Android. Phương thức được đề xuất là xuất bản vào thư viện kết hợp và các phần phụ thuộc của dự án vào một kho lưu trữ Maven cục bộ.

Để xuất bản các cấu phần phần mềm thư viện kết hợp vào một kho lưu trữ cục bộ, hãy xác định một cấu hình tương tự như sau:

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')
    }
}

Tải thư viện hợp nhất lên

Để phân phối thư viện kết hợp, hãy xem phần Tải thư viện lên.

Hành vi và biện pháp bảo vệ

Việc kết hợp các Thư viện Android có những điểm phức tạp có thể khiến trình bổ trợ khó xác định mức độ ưu tiên. Ví dụ: hai thư viện có cùng đường dẫn lớp sẽ gây ra lỗi khi tạo bản dựng khi hợp nhất thư viện. Việc hợp nhất tài nguyên sẽ xem xét thứ tự của các phần phụ thuộc được chỉ định khi chọn một tài nguyên có cùng tên trong các thư viện khác nhau.

  • Các thư viện kết hợp chỉ có thể được xuất bản dưới dạng một cấu phần phần mềm thư viện Android AAR để được thêm dưới dạng một phần phụ thuộc.
  • Không hỗ trợ hợp nhất các thư viện sử dụng tính năng liên kết dữ liệu.
  • Bạn không thể hợp nhất nhiều loại bản dựng và phiên bản sản phẩm trong một thư viện hợp nhất duy nhất. Tạo các thư viện kết hợp riêng biệt cho các biến thể khác nhau.

Để cân bằng lượng cấu hình cần thiết và mức độ dễ sử dụng, trình bổ trợ sẽ không tạo được bản dựng khi có xung đột không rõ ràng hoặc sử dụng phương pháp phỏng đoán khi hợp nhất các cấu phần phần mềm. Thông tin chi tiết về cách kết hợp các cấu phần phần mềm có trong bảng sau:

Loại Hành vi
Lớp Các thư viện có cùng đường dẫn lớp sẽ gây ra lỗi khi tạo khi hợp nhất thư viện.
Tài nguyên Android Việc hợp nhất tài nguyên sẽ xem xét thứ tự của các phần phụ thuộc được chỉ định khi chọn một tài nguyên có cùng tên trong các phần phụ thuộc khác nhau.
Siêu dữ liệu AAR Các phiên bản siêu dữ liệu AAR được hợp nhất bằng cách ưu tiên giá trị cao nhất từ mỗi thư viện phần phụ thuộc. Có một DSL được cung cấp để ghi đè các giá trị này.

Kotlin

 androidFusedLibrary { aarMetadata { minCompileSdk = 21 minCompileSdkExtension = 1 } }
Tài nguyên Java Không được phép có các tệp tài nguyên Java trong nhiều thư viện có đường dẫn giống nhau và điều này sẽ dẫn đến lỗi bản dựng.

Vấn đề đã biết

Fused Library là một trình bổ trợ mới và có những vấn đề đã biết đang được xử lý để đáp ứng mọi trường hợp sử dụng.

  • Không thể tạo tệp JAR nguồn
  • Thêm phần phụ thuộc tệp vào các tệp .aar khác
  • Không hỗ trợ việc kết hợp các cấu phần phần mềm RenderScript và Prefab

Tìm hiểu các phần phụ thuộc của một thư viện kết hợp

Thư viện kết hợp không có nguồn và chỉ sử dụng các thư viện Android làm nguồn duy nhất. Do đó, bạn cần hiểu rõ những thành phần đến từ đâu. Để liệt kê các phần phụ thuộc được hợp nhất vào cấu phần phần mềm kết quả và các phần phụ thuộc cần thiết để tạo cấu phần phần mềm, hãy chạy tác vụ gradle :report trên thư viện hợp nhất. Tác vụ này tạo ra một báo cáo JSON được lưu trong thư mục build/reports của thư viện kết hợp.

Để biết thêm thông tin liên quan đến các phần phụ thuộc của trình bổ trợ nội bộ, hãy chạy tác vụ gradle :dependencies để xem trạng thái của cấu hình trình bổ trợ.