Công thái học dành cho nhà phát triển trong Compose

Jetpack Compose giúp tăng tốc độ phát triển giao diện người dùng và giúp các kỹ sư Android làm việc hiệu quả hơn. Tuy nhiên, việc thêm một công cụ mới vào dự án cần phải được xem xét vì việc này có thể ảnh hưởng đến APK, cũng như hiệu suất của bản dựng và thời gian chạy.

Kích thước APK và thời gian xây dựng

Trong phần này, chúng tôi so sánh mức độ chịu ảnh hưởng của 2 ứng dụng khi thêm hoặc di chuyển vào Jetpack Compose:

  • Tivi đã chuyển hoàn toàn sang ứng dụng Compose, xoá các thư viện Thành phần Material Design và AppCompat.
  • Sunflower (nhánh compose_recyclerview) thêm Compose chỉ sử dụng công cụ này cho các mục của RecyclerView. Tất cả các phần phụ thuộc khác đều giống nhau.

Kích thước APK

Việc thêm thư viện vào dự án sẽ ảnh hưởng đến kích thước APK. Hãy xem cách Compose ảnh hưởng đến quy mô của các dự án nêu trên. 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.

Tivi giảm 46% kích thước APK, từ 4,49 MB xuống còn 2,39 MB. Số lượng phương thức cũng giảm đi 17% sau khi chuyển hoàn toàn sang Compose. Số dòng mã trong tệp XML giảm 76%.

Kích thước APK của Sunflower tăng 575 KB từ 2.407 KB lên 2.982 KB khi thêm Compose vào dự án. Vì Compose hầu như không được dùng trong nhánh Sunflower đó, nên dự án không được hưởng lợi từ các lợi ích về kích thước APK chỉ dành cho Compose, chẳng hạn như việc xoá phần phụ thuộc AppCompat khỏi dự án.

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

Sử dụng cùng một dự án, hãy đo lường mức độ ảnh hưởng của Compose đến hiệu suất của bản dựng.

Thao tác này sẽ xem xét thời gian xây dựng bản gỡ lỗi. Đây là thời gian bạn cần chú ý hơn trong quá trình phát triển.

Thời gian xây dựng trung bình của Tivi trước khi chuyển sang Compose là 108,71 giây. Sau khi chuyển hoàn toàn sang Compose, thời gian xây dựng trung bình giảm xuống còn 76,96 giây! Thời gian xây dựng giảm 29%. Việc giảm thời gian này chủ yếu chịu ảnh hưởng bởi việc có thể xoá liên kết dữ liệuEpoxy khỏi dự án có sử dụng trình xử lý chú giải kaptHilt nhanh hơn trong AGP 7.0.

Tuy nhiên, Sunflower đã tăng 7,6% thời gian xây dựng trung bình, từ 11,57 giây lên 12,45 giây.

Những chỉnh sửa cuối

Khi bắt đầu sử dụng Compose trong ứng dụng, bạn có thể thấy kích thước APK và thời gian xây dựng tăng lên. Kích thước/thời gian này sẽ giảm và vượt chỉ số ban đầu khi dự án được chuyển hoàn toàn sang Compose.

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 đó.

Lần kết hợp 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 hết sức để kết hợp lại các phần cần cập nhật. Hãy đọc thêm về chủ đề này trong hướng dẫn Chu kỳ hoạt động của các thành phần tương ứng.

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

Nhờ có thiết kế và bài học từ hệ thống Khung hiển thị, Jetpack Compose mang lại hiệu quả cao hơn.

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 ngay từ đầu, phát lại kết quả đã vẽ trước đó nếu không cần thực hiện thay đổi nào.

Nhiều lượt truyền 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. Việc 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ó một hệ thống đặc biệt đó là đo lường nội tại.

Hiệu suất khởi động khung hiển thị

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.

Compose Điểm chuẩn

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 — xem dự án MacrobenchmarkSample để biết cách sử dụng nó bằng Jetpack Compose. Nhóm Jetpack Compose cũng sử dụng nó này để phát hiện các lần hồi quy có thể xảy ra. Chẳng hạn, hãy xem điểm chuẩn cho cột tải lười này và trang tổng quan của nó để 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 AOT (trước khi thực thi) 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.