So sánh chỉ số Compose và Chế độ xem

Jetpack Compose giúp tăng tốc độ phát triển giao diện người dùng và cải thiện quá trình phát triển Android. Tuy nhiên, hãy cân nhắc xem việc thêm Compose vào một ứng dụng hiện có có thể ảnh hưởng như thế nào đến các chỉ số như kích thước APK, bản dựng và hiệu suất thời gian chạy của ứng dụng.

Kích thước APK và thời gian tạo bản dựng

Phần này trình bày tác động đến kích thước APK và thời gian xây dựng bằng cách xem xét ứng dụng mẫu Sunflower – một ứng dụng minh hoạ các phương pháp hay nhất để di chuyển ứng dụng dựa trên Khung hiển thị sang Compose.

Kích thước APK

Việc thêm thư viện vào dự án sẽ làm tăng kích thước APK. Các kết quả sau là dành cho APK phát hành rút gọn của mỗi dự án đã bật tính năng rút gọn mã và tài nguyên, sử dụng chế độ đầy đủ R8 và được đo lường bằng Công cụ phân tích APK.

Chỉ lượt xem Khung hiển thị kết hợp và Compose Chỉ Compose
Kích thước tải xuống 2.252 KB 3.034 KB 2.966 KB

Trong lần đầu thêm Compose vào Sunflower, kích thước APK đã tăng từ 2.252 KB lên 3.034 KB, tức là tăng 782 KB. APK được tạo bao gồm bản dựng giao diện người dùng kết hợp với Khung hiển thị và Compose. Mức tăng này là điều dự kiến vì các phần phụ thuộc bổ sung đã được thêm vào Sunflower.

Ngược lại, khi Sunflower được di chuyển sang một ứng dụng chỉ dành cho Compose, kích thước APK giảm từ 3.034 KB xuống 2.966 KB – giảm 68 KB. Mức giảm này là do việc xoá các phần phụ thuộc Khung hiển thị không dùng đến, chẳng hạn như AppCompatConstraintLayout.

Thời gian tạo bản dựng

Việc thêm Compose làm tăng thời gian xây dựng ứng dụng vì trình biên dịch Compose xử lý các thành phần kết hợp trong ứng dụng. Các kết quả sau đây được thu được bằng cách sử dụng công cụ gradle-profiler độc lập, công cụ này thực thi một bản dựng nhiều lần để có thể lấy thời gian xây dựng trung bình cho thời lượng bản dựng gỡ lỗi của Sunflower:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
Chỉ lượt xem Khung hiển thị kết hợp và Compose Chỉ Compose
Thời gian tạo bản dựng trung bình 299,47 mili giây 399,09 mili giây 342,16 mili giây

Trong lần đầu thêm Compose vào Sunflower, thời gian xây dựng trung bình tăng từ 299 mili giây lên 399 mili giây – tăng 100 mili giây. Khoảng thời gian này là do trình biên dịch Compose thực hiện các tác vụ bổ sung để chuyển đổi mã Compose được xác định trong dự án.

Ngược lại, thời gian xây dựng trung bình giảm xuống còn 342 mili giây, giảm 57 mili giây, khi quá trình di chuyển Sunflower sang Compose hoàn tất. Việc giảm thời gian này có thể là do một số yếu tố cùng nhau làm giảm thời gian xây dựng, chẳng hạn như xoá liên kết dữ liệu, di chuyển các phần phụ thuộc sử dụng kapt sang KSP và cập nhật một số phần phụ thuộc lên phiên bản mới nhất.

Tóm tắt

Việc sử dụng Compose sẽ làm tăng kích thước APK của ứng dụng một cách hiệu quả, đồng thời tăng hiệu suất thời gian xây dựng của ứng dụng do quá trình biên dịch mã Compose. Tuy nhiên, bạn cần cân nhắc những sự đánh đổi này với lợi ích của Compose, đặc biệt là về việc tăng năng suất của nhà phát triển khi sử dụng Compose. Ví dụ: Nhóm Cửa hàng Play nhận thấy rằng việc viết giao diện người dùng cần ít mã hơn nhiều, đôi khi lên đến 50%, nhờ đó tăng năng suất và khả năng bảo trì mã.

Bạn có thể đọc thêm các nghiên cứu điển hình trong bài viết Triển khai Compose cho nhóm.

Hiệu suất thời gian chạy

Phần này trình bày các chủ đề liên quan đến hiệu suất của thời gian chạy trong Jetpack Compose để bạn có thể hiểu cách Jetpack Compose so sánh với hiệu suất của hệ thống Khung hiển thị và cách đo lường hiệu suất đó.

Soạn lại thông minh

Khi các phần của giao diện người dùng không hợp lệ, Compose sẽ cố gắng kết hợp lại các phần cần cập nhật. Hãy đọc thêm về vấn đề này trong tài liệu Vòng đời của thành phần kết hợpCác giai đoạn của Jetpack Compose.

Hồ sơ cơ sở

Hồ sơ cơ sở là một cách tuyệt vời để tăng tốc các hành trình phổ biến của người dùng. Việc đưa Hồ sơ cơ sở vào ứng dụng có thể cải thiện tốc độ thực thi mã khoảng 30% kể từ lần khởi chạy đầu tiên bằng cách tránh các bước diễn giải và biên dịch trong khi thực thi (JIT) cho các đường dẫn mã đi kèm.

Thư viện Jetpack Compose có Hồ sơ cơ sở riêng và bạn sẽ tự động nhận được các tính năng tối ưu hoá này khi sử dụng Compose trong ứng dụng. Tuy nhiên, các tính năng tối ưu hoá này chỉ ảnh hưởng đến các đường dẫn mã trong thư viện Compose. Vì vậy, bạn nên thêm Hồ sơ cơ sở vào ứng dụng để bao gồm các đường dẫn mã bên ngoài Compose.

So sánh với hệ thống Chế độ xem

Jetpack Compose có nhiều điểm cải tiến so với hệ thống Khung hiển thị. Những điểm cải tiến này được mô tả trong các phần sau.

Chế độ xem mở rộng mọi mặt

Mỗi View vẽ trên màn hình, chẳng hạn như TextView, Button hoặc ImageView, đều yêu cầu phân bổ bộ nhớ, theo dõi trạng thái rõ ràng và nhiều lệnh gọi lại để hỗ trợ tất cả trường hợp sử dụng. Ngoài ra, chủ sở hữu View tuỳ chỉnh cần triển khai logic rõ ràng để ngăn chặn thao tác vẽ lại khi không cần thiết, chẳng hạn như để xử lý dữ liệu lặp lại.

Jetpack Compose dùng nhiều cách để giải quyết vấn đề này. Compose không có các đối tượng có thể cập nhật rõ ràng cho khung hiển thị vẽ. Các thành phần trên giao diện người dùng là các hàm có khả năng kết hợp đơn giản. Đây là các hàm có thông tin được ghi vào Composition (Cấu trúc) theo cách có thể phát lại. Điều này giúp giảm bớt lệnh gọi lại, hoạt động phân bổ bộ nhớ và việc theo dõi trạng thái rõ ràng chỉ đối với các thành phần có khả năng kết hợp cần có các tính năng nêu trên thay vì yêu cầu các hoạt động đó bằng tất cả các phần mở rộng thuộc loại View đã cho.

Hơn nữa, Compose cung cấp các lần kết hợp lại thông minh, phát lại kết quả đã vẽ trước đó nếu bạn không cần thực hiện thay đổi nào.

Nhiều thẻ bố cục

ViewGroup truyền thống có rất nhiều biểu thức trong các API đo lường và API bố cục, giúp bạn dễ dàng tạo ra nhiều lượt truyền bố cục. Nhiều lượt truyền bố cục này có thể tạo ra tác dụng theo cấp số nhân nếu được thực hiện tại các điểm lồng nhau cụ thể trong hệ phân cấp khung hiển thị.

Jetpack Compose thực thi một lần truyền bố cục cho tất cả các thành phần kết hợp của bố cục thông qua hợp đồng API. Điều này cho phép Compose xử lý hiệu quả những cây sâu về giao diện người dùng. Nếu cần nhiều hoạt động đo lường, Compose có phép đo lường hàm nội tại.

Xem hiệu suất khi khởi động

Hệ thống khung hiển thị cần tăng cường bố cục XML khi lần đầu hiển thị một bố cục cụ thể. Chi phí này được lưu trong Jetpack Compose vì các bố cục được viết bằng Kotlin và được biên dịch giống như phần còn lại của ứng dụng.

Đo điểm chuẩn Compose

Trong Jetpack Compose 1.0, hiệu suất của một ứng dụng ở chế độ debugrelease có sự khác biệt đáng kể. Để biết thời gian đại diện, hãy luôn sử dụng bản dựng release thay vì debug khi lập hồ sơ ứng dụng.

Để kiểm tra hiệu quả hoạt động của mã Jetpack Compose, bạn có thể sử dụng thư viện Jetpack Macrobenchmark. Để tìm hiểu cách sử dụng thư viện này với Jetpack Compose, hãy xem dự án MacrobenchmarkSample.

Nhóm Jetpack Compose cũng sử dụng Macrobenchmark để phát hiện các lần hồi quy có thể xảy ra. Ví dụ: hãy xem điểm chuẩn cho cột tải lườitrang tổng quan của cột đó để theo dõi số lần hồi quy.

Cài đặt hồ sơ Compose

Vì Jetpack Compose là một thư viện chưa được gói nên thư viện này không được hưởng các lợi ích của Zygote. Zygote sẽ tải trước các lớp và đối tượng có thể vẽ cho Bộ công cụ giao diện người dùng của hệ thống Khung hiển thị. Jetpack Compose 1.0 sử dụng chế độ cài đặt hồ sơ cho các bản dựng phát hành. Trình cài đặt hồ sơ cho phép các ứng dụng chỉ định mã quan trọng cần được biên dịch trước khi thực thi (AOT) tại thời điểm cài đặt. Compose gửi các quy tắc cài đặt hồ sơ để giảm thời gian khởi động và hiện tượng giật trong ứng dụng Compose.