Chế độ bỏ qua mạnh

Bỏ qua ở mức độ mạnh là một chế độ có trong trình biên dịch Compose. Khi được bật, thay đổi hành vi của trình biên dịch theo hai cách:

Bật chế độ bỏ qua hữu hiệu

Để bật chế độ bỏ qua rõ ràng cho mô-đun Gradle, hãy thêm tuỳ chọn sau vào khối composeCompiler của cấu hình Gradle:

android { ... }

composeCompiler {
   enableStrongSkippingMode = true
}

Khả năng bỏ qua thành phần kết hợp

Chế độ bỏ qua ở mức cao sẽ giúp giảm bớt một số quy tắc về độ ổn định thường được áp dụng của trình biên dịch Compose khi nói đến việc bỏ qua và các hàm có khả năng kết hợp. Theo mặc định, trình biên dịch Compose sẽ đánh dấu một hàm có khả năng kết hợp là có thể bỏ qua nếu tất cả đối số của nó có giá trị ổn định. Chế độ bỏ qua mạnh sẽ thay đổi điều này.

Khi bật chế độ bỏ qua mạnh, tất cả hàm có khả năng kết hợp có thể khởi động lại sẽ trở thành có thể bỏ qua. Điều này áp dụng cho dù các biến này có thông số không ổn định hay không. Các hàm có khả năng kết hợp không khởi động lại được vẫn không thể bỏ qua.

Thời điểm bỏ qua

Để xác định xem có bỏ qua một thành phần kết hợp trong quá trình kết hợp lại hay không, Compose sẽ so sánh giá trị của mỗi thông số với các giá trị trước đó của chúng. Loại thông tin so sánh phụ thuộc vào độ ổn định của thông số.

  • Các tham số không ổn định được so sánh bằng cách sử dụng đẳng thức thực thể (===)
  • Các tham số ổn định được so sánh bằng cách sử dụng đẳng thức đối tượng (Object.equals())

Nếu tất cả tham số đều đáp ứng các yêu cầu này, thì Compose sẽ bỏ qua thành phần kết hợp trong khoảng thời gian kết hợp lại.

Bạn nên một thành phần kết hợp chọn không sử dụng tính năng bỏ qua mạnh mẽ. Tức là bạn có thể muốn một thành phần kết hợp có thể khởi động lại nhưng không thể bỏ qua. Trong trường hợp này, hãy sử dụng phương thức Chú giải @NonSkippableComposable.

@NonSkippableComposable
@Composable
fun MyNonSkippableComposable {}

Chú giải các lớp là lớp ổn định

Nếu bạn muốn một đối tượng sử dụng đẳng thức đối tượng thay vì đẳng thức thực thể, tiếp tục chú thích lớp đã cho bằng @Stable. Ví dụ về trường hợp Đó là khi bạn quan sát toàn bộ danh sách đối tượng, các nguồn dữ liệu như vì Room sẽ phân bổ đối tượng mới cho mọi mục trong danh sách bất kỳ lúc nào một trong chúng sẽ thay đổi.

Ghi nhớ lambda

Chế độ bỏ qua rõ ràng cũng cho phép ghi nhớ các hàm lambda nhiều hơn bên trong thành phần kết hợp. Khi bật chế độ bỏ qua rõ ràng, mọi lambda bên trong một hàm có khả năng kết hợp sẽ được tự động ghi nhớ.

Ví dụ

Để ghi nhớ lambda bên trong các thành phần kết hợp khi sử dụng thao tác bỏ qua mạnh mẽ, trình biên dịch gói lambda của bạn bằng lệnh gọi remember. Khoá học này đi kèm với ảnh chụp lambda.

Hãy xem xét trường hợp bạn có lambda như trong ví dụ sau:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = {
        use(unstableObject)
        use(stableObject)
    }
}

Khi bật tính năng bỏ qua mạnh mẽ, trình biên dịch ghi nhớ lambda bằng cách gói nó vào cuộc gọi remember:

@Composable
fun MyComposable(unstableObject: Unstable, stableObject: Stable) {
    val lambda = remember(unstableObject, stableObject) {
        {
            use(unstableObject)
            use(stableObject)
        }
    }
}

Các khoá này tuân theo quy tắc so sánh giống như những hàm có khả năng kết hợp. Môi trường thời gian chạy so sánh các khoá không ổn định bằng cách sử dụng đẳng thức thực thể. Công cụ này so sánh các khoá ổn định sử dụng đẳng thức đối tượng.

Ghi nhớ và kết hợp lại

Tính năng tối ưu hoá này làm tăng đáng kể số lượng thành phần kết hợp mà môi trường thời gian chạy bỏ qua trong quá trình kết hợp lại. Nếu không ghi nhớ, thời gian chạy có nhiều khả năng để phân bổ một lambda mới cho bất kỳ thành phần kết hợp nào nhận tham số lambda trong kết hợp lại. Do đó, hàm lambda mới có các tham số không bằng bản sáng tác cuối cùng. Điều này dẫn đến quá trình kết hợp lại.

Tránh ghi nhớ

Nếu bạn có một hàm lambda mà bạn không muốn ghi nhớ, hãy dùng @DontMemoize của bạn.

val lambda = @DontMemoize {
    ...
}

Kích thước APK

Khi được biên dịch, các Thành phần kết hợp có thể bỏ qua sẽ dẫn đến nhiều mã được tạo hơn so với không thể bỏ qua. Khi bật chế độ bỏ qua mạnh, trình biên dịch đánh dấu hầu hết tất cả các thành phần kết hợp là có thể bỏ qua và gói tất cả lambda trong một remember{...}. Do đó, việc bật chế độ bỏ qua mạnh có tỷ lệ ảnh hưởng đến kích thước APK của ứng dụng.

Bật tính năng bỏ qua mạnh trong Now In Android đã làm tăng APK tăng 4kB. Sự khác biệt về quy mô phần lớn phụ thuộc vào số lượng các thành phần kết hợp không thể bỏ qua đã có trong ứng dụng cho sẵn nhưng đáng lẽ phải tương đối nhỏ.