Nghiên cứu điển hình

Cách Reddit sử dụng trình tối ưu hoá R8 để cải thiện hiệu suất một cách hiệu quả

Đọc trong 4 phút
Ben Weiss
Kỹ sư quan hệ với nhà phát triển

Trong thế giới ứng dụng di động ngày nay, trải nghiệm người dùng liền mạch không chỉ là một tính năng mà còn là một yếu tố cần thiết. Thời gian tải chậm, giao diện không phản hồi và tính bất ổn có thể là những rào cản đáng kể đối với mức độ tương tác của người dùng và tỷ lệ giữ chân người dùng. Trong quá trình làm việc với nhóm Quan hệ với nhà phát triển Android, nhóm kỹ thuật tại Reddit đã sử dụng Điểm hiệu suất ứng dụng để đánh giá ứng dụng của họ. Sau khi đánh giá hiệu suất, họ nhận thấy tiềm năng cải thiện đáng kể và quyết định thực hiện các bước để tận dụng toàn bộ sức mạnh của R8, trình tối ưu hoá ứng dụng Android. Sáng kiến tập trung này đã giúp cải thiện đáng kể thời gian khởi động, giảm số khung hình chậm hoặc bị treo và lỗi ANR, đồng thời tăng điểm xếp hạng tổng thể trên Cửa hàng Play. Nghiên cứu điển hình này sẽ phân tích cách Reddit đạt được những kết quả ấn tượng này.

Cách trình tối ưu hoá R8 giúp Reddit

Trình tối ưu hoá R8 là một công cụ cơ bản để tối ưu hoá hiệu suất trên Android. Công cụ này thực hiện nhiều bước để cải thiện hiệu suất của ứng dụng.Hãy xem nhanh những bước có tác động lớn nhất.

  • Lắc cây là bước quan trọng nhất để giảm kích thước của ứng dụng. Tại đây, mã không dùng đến từ các phần phụ thuộc của ứng dụng và chính ứng dụng sẽ bị xoá.
  • Nội tuyến phương thức thay thế các lệnh gọi phương thức bằng mã thực tế, giúp ứng dụng hoạt động hiệu quả hơn.
  • Hợp nhất lớp và các chiến lược khác được áp dụng để làm cho mã nguồn trở nên gọn gàng hơn. Tại thời điểm này, vấn đề không còn là khả năng đọc mã nguồn của con người nữa mà là làm cho mã đã biên dịch hoạt động nhanh chóng. Vì vậy, các lớp trừu tượng, chẳng hạn như giao diện hoặc hệ thống phân cấp lớp, không quan trọng ở đây và sẽ bị xoá.
  • Giảm thiểu giá trị nhận dạng thay đổi tên của các lớp, trường và phương thức thành tên ngắn hơn, vô nghĩa. Vì vậy, thay vì MyDataModel, bạn có thể kết thúc bằng một lớp có tên là a.
  • Rút gọn tài nguyên  xoá các tài nguyên không dùng đến, chẳng hạn như tệp xml và tài nguyên có thể vẽ để giảm thêm kích thước ứng dụng.
image.png

Các giai đoạn chính của hoạt động tối ưu hoá R8

Từ dữ liệu thực tế đến sự hài lòng của người dùng: Xác định thành công trong quá trình sản xuất

Reddit nhận thấy kết quả hiệu suất được cải thiện ngay sau khi một phiên bản mới của ứng dụng được triển khai cho người dùng.Bằng cách sử dụng Android VitalsCrashlytics, Reddit có thể thu thập các chỉ số hiệu suất trên các thiết bị thực tế có người dùng thực tế, cho phép họ so sánh bản phát hành mới với các phiên bản trước.

image.png

Cách R8 cải thiện hiệu suất của ứng dụng Reddit

Nhóm đã quan sát thấy thời gian khởi động nguội nhanh hơn 40% , giảm 30% lỗi "Ứng dụng không phản hồi" (ANR), cải thiện 25% khả năng kết xuất khung hìnhgiảm 14% kích thước ứng dụng.

Những cải tiến này rất quan trọng để người dùng hài lòng. Thời gian khởi động nhanh hơn có nghĩa là thời gian chờ ít hơn và truy cập nội dung nhanh hơn. Ít lỗi ANR hơn giúp ứng dụng ổn định và đáng tin cậy hơn, giảm sự thất vọng của người dùng. Khả năng kết xuất khung hình mượt mà hơn giúp loại bỏ hiện tượng giật lag trên giao diện người dùng, giúp thao tác cuộn và ảnh động trở nên mượt mà và phản hồi nhanh. Tác động kỹ thuật tích cực này cũng được thể hiện rõ ràng trong cảm xúc của người dùng.

Các chỉ số về mức độ hài lòng của người dùng đối với sự thành công của hoạt động tối ưu hoá được hiển thị trực tiếp trên Cửa hàng Google Play. Sau khi phát hành phiên bản được tối ưu hoá bằng R8, nhóm đã nhận thấy sự thay đổi đáng kể và tích cực trong cảm xúc và mức độ gắn bó của người dùng.

image.png

Drew Heavner: "Bật công cụ có tiềm năng đầy đủ của R8 trong vòng chưa đầy 2 tuần"

Ấn tượng nhất là điều này đã được thực hiện bằng một nỗ lực tập trung. Drew Heavner, Kỹ sư phần mềm cấp cao tại Reddit, người đã làm việc trong sáng kiến này, lưu ý rằng việc triển khai các thay đổi để bật toàn bộ tiềm năng của R8 mất chưa đến 2 tuần.

Xác nhận mức tăng: Nghiên cứu chuyên sâu bằng điểm chuẩn macro

Sau khi quan sát thấy những cải tiến đáng kể trong thế giới thực, nhóm kỹ thuật của Reddit và nhóm Quan hệ với nhà phát triển Android tại Google đã tiến hành đo điểm chuẩn chi tiết để xác nhận một cách khoa học mức tăng và thử nghiệm các hoạt động tối ưu hoá khác. Để phân tích này, nhóm kỹ thuật của Reddit đã cung cấp 2 phiên bản ứng dụng: một phiên bản không có hoạt động tối ưu hoá và một phiên bản áp dụng R8 cùng 2 công cụ tối ưu hoá hiệu suất cơ bản khác: Hồ sơ cơ sở và Hồ sơ khởi động.

Hồ sơ cơ sở di chuyển hiệu quả các bước biên dịch Đúng thời điểm (JIT) khỏi thiết bị của người dùng và sang máy của nhà phát triển. Mã đã biên dịch Trước thời gian (AOT) được tạo đã chứng minh là giúp giảm thời gian khởi động và các vấn đề về kết xuất.

Khi một ứng dụng được đóng gói, trình tạo tệp dex d8 sẽ lấy các lớp và phương thức rồi tạo các tệp classes.dex của ứng dụng. Khi người dùng mở ứng dụng, các tệp dex này sẽ được tải lần lượt cho đến khi ứng dụng có thể bắt đầu. Bằng cách cung cấp Hồ sơ khởi động, bạn cho d8 biết những lớp và phương thức cần đóng gói trong các tệp classes.dex đầu tiên. Cấu trúc này cho phép ứng dụng tải ít tệp hơn, từ đó cải thiện tốc độ khởi động.

Jetpack Macrobenchmark là công cụ cốt lõi cho giai đoạn này, cho phép đo lường chính xác các tương tác của người dùng trong một môi trường được kiểm soát. Để mô phỏng hành trình điển hình của người dùng, họ đã sử dụng API UIAutomator để tạo một bài kiểm tra mở ứng dụng, cuộn xuống 3 lần rồi cuộn lên.

Cuối cùng, tất cả những gì cần thiết để viết điểm chuẩn là:

  uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Dữ liệu điểm chuẩn xác nhận các quan sát thực tế và cung cấp thông tin chi tiết hơn. Ứng dụng được tối ưu hoá hoàn toàn bắt đầu nhanh hơn 55% và người dùng có thể bắt đầu duyệt sớm hơn 18% . Ứng dụng được tối ưu hoá cũng cho thấy giảm 2/3 số lần biên dịch Đúng thời điểm (JIT)giảm 1/3 thời gian biên dịch JIT. Khả năng kết xuất khung hình được cải thiện, dẫn đến tăng 19% số khung hình được kết xuất trong hành trình của người dùng được đo điểm chuẩn. Cuối cùng, kích thước của ứng dụng đã giảm hơn 1/3.

image.png

Những cải tiến hiệu suất tổng thể của Reddit

Bạn có thể đo lường thời gian biên dịch JIT bằng một chỉ số tuỳ chỉnh về phần dấu vết Macrobenchmark như sau:

  val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Bật công nghệ đằng sau quá trình chuyển đổi: R8

Để bật R8 ở chế độ đầy đủ, bạn hãy định cấu hình tệp app/build.gradle.kts bằng cách đặt minifyEnabledshrinkResources thành true trong loại bản dựng phát hành.

  android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

Bạn phải thực hiện bước này bằng cách kiểm thử toàn diện từ đầu đến cuối, vì hoạt động tối ưu hoá hiệu suất có thể dẫn đến hành vi không mong muốn. Bạn nên phát hiện hành vi này trước khi người dùng phát hiện.

Như đã trình bày trước đó trong bài viết này, R8 thực hiện các hoạt động tối ưu hoá mở rộng để tối đa hoá lợi ích về hiệu suất. R8 thực hiện các sửa đổi đáng kể đối với mã, bao gồm đổi tên, di chuyển và xoá các lớp, trường và phương thức. Nếu nhận thấy các sửa đổi này gây ra lỗi, bạn cần chỉ định những phần nào của mã mà R8 không được sửa đổi bằng cách khai báo những phần đó trong các quy tắc giữ lại.

Làm theo ví dụ của Reddit trong ứng dụng của bạn

Thành công của Reddit với R8 là một nghiên cứu điển hình hiệu quả cho bất kỳ nhóm phát triển nào muốn tạo ra tác động đáng kể với ít nỗ lực đối với hiệu suất của ứng dụng. Mối tương quan trực tiếp giữa những cải tiến kỹ thuật và sự gia tăng sau đó về mức độ hài lòng của người dùng nhấn mạnh giá trị của hoạt động tối ưu hoá hiệu suất.

Bằng cách làm theo bản thiết kế được trình bày trong nghiên cứu điển hình này – sử dụng các công cụ như Điểm hiệu suất ứng dụng để xác định cơ hội, bật toàn bộ tiềm năng tối ưu hoá của R8, theo dõi dữ liệu thực tế và sử dụng điểm chuẩn để xác nhận và hiểu sâu hơn – các nhà phát triển khác có thể đạt được những lợi ích tương tự.

Để bắt đầu sử dụng R8 trong ứng dụng của riêng bạn, hãy tham khảo tài liệu và hướng dẫn chính thức mới được cập nhật về cách bật, định cấu hình và khắc phục sự cố trình tối ưu hoá R8.

Tác giả:

Tiếp tục đọc