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ể
4 phút đọc
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à không ổn định có thể là những rào cản lớn đối với việc thu hút và giữ chân người dùng. Trong quá trình làm việc với nhóm Quan hệ nhà phát triển Android, nhóm kỹ thuật tại Reddit đã sử dụng Điểm hiệu suất của ứng dụng để đánh giá ứng dụng của họ. Sau khi đánh giá hiệu suất của ứng dụng, 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 để khai thác 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ố 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 ích cho 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 của ứng dụng.Hãy cùng xem nhanh những bước có tác động lớn nhất.
- Tree shaking 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 trong các phần phụ thuộc của ứng dụng và chính ứng dụng đó sẽ bị xoá.
- Phương thức cùng dòng 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ã 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ã được 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ệ phân cấp lớp, không quan trọng ở đây và sẽ bị xoá.
- Tính năng rút gọn 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, không có ý nghĩa. Vì vậy, thay vì
MyDataModel, bạn có thể nhận được một lớp có tên là a. - Tính năng 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à đối tượng có thể vẽ, để giảm thêm kích thước ứng dụng.
Các giai đoạn chính của quá trình tối ưu hoá R8
Từ dữ liệu thực tế đế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ải thiện ngay sau khi phát hành phiên bản mới của ứng dụng cho người dùng. Bằng cách sử dụng Android vitals và Crashlytics, Reddit có thể thu thập các chỉ số hiệu suất trên thiết bị thực tế của người dùng thực, từ đó so sánh bản phát hành mới với các phiên bản trước.
Cách R8 cải thiện hiệu suất ứng dụng của Reddit
Nhóm nhận thấy tốc độ 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% hiệu suất kết xuất khung hình và giả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. Thời gian khởi động nhanh hơn đồng nghĩa với việc người dùng ít phải chờ đợi hơn và có thể truy cập vào nội dung nhanh hơn. Việc giảm số lỗi ANR giúp ứng dụng ổn định và đáng tin cậy hơn, từ đó giảm bớt sự thất vọng của người dùng. Quá trình kết xuất khung hình mượt mà hơn giúp 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à thích ứng nhanh. Tác động tích cực về mặt kỹ thuật này cũng thể hiện rõ trong cảm nhận của người dùng.
Các chỉ báo 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 thể hiện trực tiếp trên Cửa hàng Google Play. Sau khi ra mắt phiên bản 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 nhận cũng như mức độ tương tác của người dùng.
Drew Heavner: "Khai thác toàn bộ tiềm năng của R8 chỉ trong chưa đầy 2 tuần"
Điều ấn tượng nhất là họ đạt được kết quả này nhờ nỗ lực tập trung. Drew Heavner, Kỹ sư phần mềm chính tại Reddit, người đã thực hiện sáng kiến này, cho biết 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 đầy hai tuần.
Xác nhận mức tăng: Tìm hiểu sâu về 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 đo điểm chuẩn chi tiết để xác nhận một cách khoa học về những lợi ích và thử nghiệm các biện pháp tối ưu hoá khác. Để thực hiện phân tích này, đội ngũ kỹ thuật của Reddit đã cung cấp hai phiên bản ứng dụng: một phiên bản không có tính năng tối ưu hoá và một phiên bản áp dụng R8 cùng hai 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) khỏi thiết bị của người dùng và sang máy của nhà phát triển. Mã được biên dịch trước (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 biên dịch d8 dexer 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 Hồ sơ khởi động, bạn cho d8 biết lớp và phương thức nào 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, giú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 thông thường của người dùng, họ đã sử dụng API UIAutomator để tạo một chương trình kiểm thử 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 kết quả 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 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/3 và thời gian biên dịch JIT giảm 1/3. Khả năng kết xuất khung hình được cải thiện, giúp kết xuất thêm 19% 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.
Cải thiệ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ố phần theo dõi Macrobenchmark tuỳ chỉnh như sau:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")Kích hoạt công nghệ đằng sau quá trình chuyển đổi: R8
Để bật R8 ở chế độ đầy đủ, bạn cần định cấu hình tệp app/build.gradle.kts bằng cách đặt minifyEnabled và shrinkResources 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ì 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 gặp phải.
Như đã trình bày ở phần trước trong bài viết này, R8 thực hiện các hoạt động tối ưu hoá sâu 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 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 hữu ích cho mọi nhóm phát triển muốn cải thiện đáng kể hiệu suất của ứng dụng mà không tốn nhiều công sức. Mối tương quan trực tiếp giữa các điểm cải tiến về kỹ thuật và mức 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 chi tiết đượ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, khai thác 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 rõ 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ố cho trình tối ưu hoá R8.
-
Nghiên cứu điển hìnhMonzo là một ngân hàng số tại Vương quốc Anh với 15 triệu khách hàng và đang tiếp tục tăng trưởng. Khi ứng dụng mở rộng quy mô, nhóm kỹ thuật nhận thấy thời gian khởi động ứng dụng là một khía cạnh quan trọng cần cải thiện, nhưng lo ngại rằng việc này sẽ đòi hỏi những thay đổi đáng kể đối với cơ sở mã.
Ben Weiss, Tracy Agyemang • Thời gian đọc: 2 phút -
Nghiên cứu điển hìnhGrab là siêu ứng dụng hàng đầu Đông Nam Á, cung cấp dịch vụ giao hàng, di chuyển và dịch vụ tài chính cho hàng triệu người dùng tại 8 quốc gia thông qua một ứng dụng duy nhất.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • Thời gian đọc: 5 phút -
Nghiên cứu điển hìnhNhóm đã xây dựng một toàn bộ mã nguồn giao diện người dùng dựa trên AI, nhỏ hơn 50% so với phiên bản triển khai ban đầu, đồng thời giảm 35% thời gian thực thi của tác nhân AI, giảm 32% số lần trao đổi giữa kỹ sư và tác nhân, và giảm 33% chi phí mã thông báo.
Pavlo Stavytskyi, Rebecca Franks • Thời gian đọc: 11 phút
Nhận thông tin chi tiết mới nhất về hoạt động phát triển Android trong hộp thư đến của bạn hằng tuần.