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 đáng kể

Đọ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à sự không ổn định có thể là những rào cản đáng kể đối với mức độ tương tác và khả năng 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 có thể cải thiện đáng kể và quyết định thực hiện các bước để khai thác tối đa 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ố lượng khung hình bị 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 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ó nhiều bước để cải thiện hiệu suất ứng dụng.Hãy xem nhanh những bước có tác động lớn nhất.

  • Loại bỏ mã không dùng đến 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 sẽ 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ã nhỏ gọn 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á.
  • Tính năng rút gọn mã nhận dạng sẽ 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à 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à các thành phầ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 cứng đến mức độ 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 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 Vitals và Crashlytics, Reddit đã có thể ghi lại các chỉ số hiệu suất trên các thiết bị thực tế với 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 ứng dụng của Reddit

Nhóm này nhận 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 điểm cải tiến này đóng vai trò quan trọng trong việc mang lại sự hài lòng cho người dùng. Khởi động nhanh hơn có nghĩa là bạn sẽ tốn ít thời gian chờ đợi hơn và truy cập vào nội dung nhanh hơn. Ít lỗi ANR hơn sẽ giúp ứng dụng ổn định và đáng tin cậy hơn, giảm sự khó chịu cho người dùng. Việc kết xuất khung hình mượt mà hơn sẽ loại bỏ hiện tượng giật 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 tích cực về mặt kỹ thuật này cũng 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 mức độ thành công của hoạt động tối ưu hoá có thể thấy rõ trên Cửa hàng Google Play. Sau khi phát hành phiên bản được tối ưu hoá R8, nhóm nhận thấy có sự thay đổi đáng kể và tích cực về mức độ hài lòng và mức độ gắn bó của người dùng.

image.png

Drew Heavner: "Công cụ khai thác toàn bộ tiềm năng của R8 trong vòng chưa đầy 2 tuần"

Điều ấn tượng nhất là việc 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 tại Reddit, người đã tham gia sáng kiến này, cho biết rằng việc triển khai các thay đổi để khai thác toàn bộ tiềm năng của R8 chỉ mất chưa đến hai tuần.

Xác nhận mức tăng: Nghiên cứu chuyên sâu bằng macrobenchmark

Sau khi nhận thấy những cải tiến đáng kể trong thực tế, 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 các điểm chuẩn chi tiết để xác nhận một cách khoa học những lợi ích đạt được và thử nghiệm các hoạt động tối ưu hoá khác. Để phân tích, nhóm kỹ thuật của Reddit đã cung cấp 2 phiên bản ứng dụng của họ: một phiên bản không có các hoạt động tối ưu hoá và một phiên bản áp dụng R8 và 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 Trong khi thực thi (JIT) ra khỏi thiết bị của người dùng và vào máy của nhà phát triển. Mã được biên dịch Trước thời gian chạy (AOT) đã được 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 chuyển đổi 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ể khởi động. Bằng cách cung cấp một 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, nhờ đó 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 hoạt động 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 UIAutomator API để tạo một quy trình kiểm thử mở ứng dụng, cuộn xuống 3 lần rồi cuộn lên lại.

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 chuyên sâu hơn. Ứng dụng được tối ưu hoá hoàn toàn khởi động nhanh hơn 55% và người dùng có thể bắt đầu duyệt xem sớm hơn 18% . Ứng dụng được tối ưu hoá cũng cho thấy số lần biên dịch Đúng thời điểm (JIT) giảm 2/3thời gian biên dịch JIT giảm 1/3. Hiệu suất kết xuất khung hình được cải thiện, dẫn đến việc kết xuất thêm 19% số khung hình 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

Cải thiện hiệu suất tổng thể của Reddit

Bạn có thể đo 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 đị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ước này phải đi kèm với kiểm thử toàn diện từ đầu đến cuối, vì việc tối ưu hoá hiệu suất có thể dẫn đến hành vi không mong muốn mà bạn nên phát hiện 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 nhiều bước tối ưu hoá để tối đa hoá lợi ích về hiệu suất cho bạn. R8 sửa đổi đáng kể mã, bao gồm cả việc đổ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 những nội dung sửa đổi này gây ra lỗi, bạn cần chỉ định những phần mã mà R8 không được sửa đổi bằng cách khai báo những phần đó trong quy tắc lưu giữ.

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 mọi nhóm phát triển 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 điểm cải tiến về kỹ thuật và sự gia tăng sau đó về mức độ hài lòng của người dùng cho thấy giá trị của việc tối ưu hoá hiệu suất.

Bằng cách làm theo kế hoạch đượ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 của ứng dụng để xác định cơ hội, khai thác tối đa tiềm năng tối ưu hoá của R8, giám sát dữ liệu thực tế và sử dụng điểm chuẩn để xác nhận cũng như hiểu rõ hơn), các nhà phát triển khác cũng 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ậ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