Áp dụng logic bản dựng tuỳ chỉnh

Phần này mô tả các chủ đề nâng cao hữu ích khi bạn muốn mở rộng Trình bổ trợ Android cho Gradle hoặc tự viết trình bổ trợ của riêng mình.

Xuất bản các phần phụ thuộc biến thể vào logic tuỳ chỉnh

Thư viện có thể có các chức năng mà các dự án hoặc dự án phụ khác có thể cần sử dụng. Xuất bản một thư viện là quá trình cung cấp đó thư viện cho các đối tượng sử dụng. Các thư viện có thể kiểm soát các phần phụ thuộc mà đối tượng sử dụng sẽ có quyền truy cập tại thời điểm biên dịch và trong thời gian chạy.

Có hai cấu hình riêng biệt chứa các phần phụ thuộc bắc cầu của mỗi đường dẫn lớp mà đối tượng sử dụng sẽ phải cần đến trong quá trình sử dụng thư viện như mô tả dưới đây:

  • variant_nameApiElements: Cấu hình này chứa các phần phụ thuộc bắc cầu có sẵn cho đối tượng sử dụng tại thời điểm biên dịch.
  • variant_nameRuntimeElements: Cấu hình này chứa các phần phụ thuộc bắc cầu có sẵn cho đối tượng sử dụng trong thời gian chạy.

Để tìm hiểu thêm về mối quan hệ giữa các cấu hình khác nhau, hãy truy cập Cấu hình trình bổ trợ Thư viện Java.

Chiến lược giải quyết phần phụ thuộc tuỳ chỉnh

Một dự án có thể chứa một phần phụ thuộc trên hai phiên bản khác nhau của cùng một thư viện, điều này có thể dẫn đến xung đột phần phụ thuộc. Chẳng hạn, nếu dự án của bạn phụ thuộc vào phiên bản 1 của mô-đun A và phiên bản 2 của mô-đun B, và mô-đun A phụ thuộc bắc cầu vào phiên bản 3 của mô-đun B, thì sẽ xảy ra xung đột phiên bản phần phụ thuộc.

Để giải quyết xung đột này, Trình bổ trợ Android cho Gradle sử dụng chiến lược phân giải phần phụ thuộc sau đây: khi trình bổ trợ phát hiện thấy các phiên bản khác nhau của cùng một mô-đun nằm trong biểu đồ phần phụ thuộc thì theo mặc định sẽ chọn mô-đun có số phiên bản cao nhất.

Tuy nhiên, chiến lược này không phải lúc nào cũng hoạt động suôn sẻ như dự kiến. Để tuỳ chỉnh chiến lược phân giải của phần phụ thuộc, hãy sử dụng các cấu hình sau để giải quyết các phần phụ thuộc cụ thể của biến thể cần thiết cho nhiệm vụ của bạn:

  • variant_nameCompileClasspath: Cấu hình này chứa chiến lược phân giải dành cho đường dẫn lớp biên dịch của một biến thể nhất định.
  • variant_nameRuntimeClasspath: Cấu hình này chứa chiến lược phân giải dành cho đường dẫn lớp thời gian chạy của một biến thể nhất định.

Trình bổ trợ Android cho Gradle sẽ chứa đựng những phương thức getter mà bạn có thể sử dụng để truy cập vào các đối tượng cấu hình của từng biến thể. Do đó, bạn có thể sử dụng API biến thể để truy vấn cách phân giải phần phụ thuộc như trong ví dụ dưới đây:

Kotlin

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

Groovy

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}