Để mang lại trải nghiệm tốt nhất cho người dùng, bạn nên tối ưu hoá ứng dụng để ứng dụng có kích thước nhỏ và chạy nhanh nhất có thể. Trình tối ưu hoá ứng dụng của chúng tôi, có tên là R8, giúp đơn giản hoá ứng dụng bằng cách xoá mã và tài nguyên không dùng đến, viết lại mã để tối ưu hoá hiệu suất thời gian chạy và nhiều việc khác. Đối với người dùng, điều này có nghĩa là:
- Thời gian khởi động nhanh hơn
- Giảm mức sử dụng bộ nhớ
- Cải thiện hiệu suất hiển thị và thời gian chạy
- Giảm số lỗi ứng dụng không phản hồi (ANR)
Tổng quan về tính năng tối ưu hoá R8
R8 sử dụng quy trình nhiều giai đoạn để tối ưu hoá ứng dụng về kích thước và tốc độ. Các thao tác chính bao gồm:
Rút gọn mã (còn được gọi là rung cây (tree shaking)): R8 xác định và xoá mã không thể truy cập khỏi ứng dụng và các phần phụ thuộc thư viện của ứng dụng. Bằng cách phân tích các điểm nhập của ứng dụng (chẳng hạn như
ActivitieshoặcServicesđược xác định trong tệp kê khai), R8 sẽ tạo một biểu đồ mã được tham chiếu và xoá mọi mã không được tham chiếu.Tối ưu hoá logic: R8 viết lại mã để cải thiện hiệu quả thực thi và giảm chi phí phát sinh. Các kỹ thuật chính bao gồm:
Nội tuyến phương thức: R8 thay thế lệnh gọi phương thức bằng nội dung thực tế của phương thức được gọi. Điều này giúp loại bỏ chi phí phát sinh của lệnh gọi hàm và cho phép R8 thực hiện các hoạt động tối ưu hoá khác.
Hợp nhất lớp: R8 kết hợp các tập hợp lớp và giao diện thành một lớp duy nhất. Điều này giúp giảm số lượng lớp trong ứng dụng, giảm áp lực bộ nhớ và cải thiện tốc độ khởi động.
Làm rối mã nguồn (còn được gọi là giảm thiểu kích thước): Để giảm kích thước tệp DEX , R8 rút ngắn tên của các lớp, trường và phương thức (ví dụ:
com.example.MyActivitycó thể trở thànha.b.a).
Kể từ phiên bản 8.12.0 của Trình bổ trợ Android cho Gradle (AGP), R8 cũng tối ưu hoá tài nguyên như một phần của các giai đoạn tối ưu hoá. Để biết thêm thông tin, hãy xem bài viết Rút gọn tài nguyên được tối ưu hoá.
Bật tính năng tối ưu hoá
Để bật tính năng tối ưu hoá ứng dụng, hãy đặt isMinifyEnabled = true (để tối ưu hoá mã)
và isShrinkResources = true (để tối ưu hoá tài nguyên) trong tập lệnh bản dựng cấp ứng dụng của bản dựng phát hành
như minh hoạ trong mã sau. Bạn nên luôn bật cả hai chế độ cài đặt. Bạn cũng nên chỉ bật tính năng tối ưu hoá ứng dụng trong phiên bản cuối cùng của ứng dụng mà bạn kiểm thử trước khi phát hành (thường là bản phát hành) vì các hoạt động tối ưu hoá sẽ làm tăng thời gian xây dựng của dự án và có thể khiến việc gỡ lỗi trở nên khó khăn hơn do cách sửa đổi mã.
Kotlin
android { buildTypes { release { // Enables code-related app optimization. isMinifyEnabled = true // Enables resource shrinking. isShrinkResources = true proguardFiles( // Default file with automatically generated optimization rules. getDefaultProguardFile("proguard-android-optimize.txt"), ... ) ... } } ... }
Groovy
android { buildTypes { release { // Enables code-related app optimization. minifyEnabled = true // Enables resource shrinking. shrinkResources = true // Default file with automatically generated optimization rules. proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') ... } } }
Tối ưu hoá tính năng rút gọn tài nguyên để có các ứng dụng nhỏ hơn nữa
Phiên bản 8.12.0 của Trình bổ trợ Android cho Gradle (AGP) giới thiệu tính năng rút gọn tài nguyên được tối ưu hoá nhằm tích hợp tính năng tối ưu hoá tài nguyên và mã để tạo ra các ứng dụng nhỏ hơn và nhanh hơn nữa.
Trước khi có tính năng rút gọn tài nguyên được tối ưu hoá, Công cụ đóng gói tài nguyên Android (AAPT2) đã tạo ra các quy tắc giữ lại, giúp xử lý hiệu quả tính năng rút gọn tài nguyên tách biệt với mã, thường giữ lại mã hoặc tài nguyên không thể truy cập được tham chiếu lẫn nhau.
Với tính năng rút gọn tài nguyên được tối ưu hoá, tài nguyên được coi như một phần của mã chương trình, tạo thành biểu đồ tham chiếu. Khi một tập hợp mã hoặc tài nguyên không được tham chiếu, tập hợp đó sẽ không được bảo vệ bằng quy tắc giữ lại và có thể bị xoá.
Bật tính năng rút gọn tài nguyên được tối ưu hoá
Để bật quy trình rút gọn tài nguyên được tối ưu hoá mới cho AGP 8.12 hoặc 8.13, hãy thêm nội dung sau vào tệp gradle.properties của dự án:
android.r8.optimizedResourceShrinking=true
Nếu đang sử dụng AGP 9.0.0 hoặc phiên bản mới hơn, bạn không cần đặt android.r8.optimizedResourceShrinking=true. Tính năng rút gọn tài nguyên được tối ưu hoá sẽ tự động được áp dụng khi bạn bật isShrinkResources = true trong cấu hình bản dựng.
Xác minh và định cấu hình chế độ cài đặt tối ưu hoá R8
Để cho phép R8 sử dụng đầy đủ các khả năng tối ưu hoá, hãy xoá
dòng sau khỏi tệp gradle.properties của dự án (nếu có):
android.enableR8.fullMode=false # Remove this line from your codebase.
Xin lưu ý rằng việc bật tính năng tối ưu hoá ứng dụng sẽ khiến dấu vết ngăn xếp khó hiểu, đặc biệt là nếu R8 đổi tên lớp hoặc tên phương thức. Để nhận dấu vết ngăn xếp tương ứng chính xác với mã nguồn, hãy xem bài viết Khôi phục dấu vết ngăn xếp ban đầu.
Nếu đã bật R8, bạn cũng nên tạo Hồ sơ khởi động để có hiệu suất khởi động tốt hơn nữa.
Nếu bạn bật tính năng tối ưu hoá ứng dụng và tính năng này gây ra lỗi, thì sau đây là một số chiến lược để khắc phục:
- Thêm quy tắc giữ lại để giữ nguyên một số mã.
- Từng bước áp dụng các hoạt động tối ưu hoá.
- Cập nhật mã để sử dụng các thư viện phù hợp hơn cho việc tối ưu hoá.
Nếu bạn muốn tối ưu hoá tốc độ bản dựng, hãy xem bài viết Định cấu hình cách R8 chạy để biết thông tin về cách định cấu hình R8 dựa trên môi trường của bạn.
Các thay đổi về hành vi của phiên bản AGP và R8
Bảng sau đây trình bày các tính năng chính được giới thiệu trong nhiều phiên bản của Trình bổ trợ Android cho Gradle (AGP) và trình biên dịch R8.
| Phiên bản AGP | Các tính năng được giới thiệu |
|---|---|
| 9.1 |
Các lớp được đóng gói lại theo mặc định: R8 đóng gói lại các lớp (di chuyển các lớp đó đến gói không tên ở cấp cao nhất) để nén DEX hơn nữa, loại bỏ nhu cầu chỉ định tuỳ chọn -repackageclasses. Để biết thông tin về cách hoạt động của tính năng này và cách chọn không tham gia, hãy xem các tuỳ chọn chung.
|
| 9.0 |
Rút gọn tài nguyên được tối ưu hoá: Bật theo mặc định (được kiểm soát bằng android.r8.optimizedResourceShrinking). Tính năng rút gọn tài nguyên được tối ưu hoá giúp tích hợp tính năng rút gọn tài nguyên với quy trình tối ưu hoá mã, giúp tạo ra các ứng dụng nhỏ hơn và nhanh hơn. Bằng cách tối ưu hoá đồng thời cả mã và tham chiếu tài nguyên, tính năng này sẽ xác định và xoá các tài nguyên chỉ được tham chiếu từ mã không dùng đến. Đây là một cải tiến đáng kể so với các quy trình tối ưu hoá riêng biệt trước đây.Điều này đặc biệt hữu ích đối với các ứng dụng chia sẻ nhiều tài nguyên và mã trên nhiều ngành dọc có hệ số hình dạng, với mức cải thiện đo được là hơn 50% về kích thước ứng dụng. Việc giảm kích thước dẫn đến quá trình tải xuống nhỏ hơn, cài đặt nhanh hơn và trải nghiệm người dùng tốt hơn với thời gian khởi động nhanh hơn, cải thiện khả năng hiển thị và giảm số lỗi ANR. Lọc quy tắc thư viện: Chúng tôi đã ngừng hỗ trợ các tuỳ chọn chung (ví dụ: -dontobfuscate) trong các quy tắc của trình tiêu thụ thư viện và các ứng dụng sẽ lọc các tuỳ chọn này. Để biết thêm thông tin, hãy xem bài viết Thêm các tuỳ chọn chung.Kiểm tra giá trị rỗng của Kotlin: Được tối ưu hoá theo mặc định (được kiểm soát bằng -processkotlinnullchecks). Phiên bản này cũng giới thiệu những cải tiến đáng kể về tốc độ bản dựng. Để biết thêm thông tin, hãy xem bài viết Các tuỳ chọn chung để tối ưu hoá thêm.Tối ưu hoá các gói cụ thể: Bạn có thể sử dụng packageScope để tối ưu hoá các gói cụ thể. Tính năng này đang trong giai đoạn hỗ trợ thử nghiệm. Để biết thêm thông tin, hãy xem Tối ưu hoá các gói được chỉ định bằng packageScope.Tối ưu hoá theo mặc định: Chúng tôi đã ngừng hỗ trợ getDefaultProguardFile("proguard-android.txt") vì tuỳ chọn này bao gồm -dontoptimize mà bạn nên tránh. Thay vào đó, hãy sử dụng "proguard-android-optimize.txt". Nếu cần tắt tính năng tối ưu hoá trên toàn cầu trong ứng dụng, hãy thêm cờ theo cách thủ công vào tệp ProGuard.
|
| 8.12 |
Rút gọn tài nguyên được tối ưu hoá: Đã thêm tính năng hỗ trợ ban đầu (được kiểm soát bằng android.r8.optimizedResourceShrinking). Tính năng rút gọn tài nguyên được tối ưu hoá giúp tích hợp tính năng rút gọn tài nguyên với quy trình tối ưu hoá mã. Bạn phải bật tính năng này theo cách thủ công trong phiên bản AGP này.Truy vết ngược Logcat: Hỗ trợ tính năng truy vết ngược tự động trong cửa sổ Logcat của Android Studio. |
| 8.6 |
Cải thiện tính năng truy vết ngược: Bao gồm tính năng truy vết ngược tên tệp và số dòng theo mặc định cho tất cả các cấp minSdk (trước đây yêu cầu minSdk 26+ trong phiên bản 8.2).Việc cập nhật R8 giúp đảm bảo rằng dấu vết ngăn xếp từ các bản dựng đã làm rối mã nguồn có thể đọc được một cách dễ dàng và rõ ràng. Phiên bản này cải thiện cách ánh xạ số dòng và tệp nguồn, giúp các công cụ như Logcat của Android Studio dễ dàng truy vết ngược các sự cố đến mã nguồn ban đầu một cách tự động. |
| 8.0 |
Chế độ đầy đủ theo mặc định: Chế độ đầy đủ của R8 cung cấp khả năng tối ưu hoá mạnh mẽ hơn đáng kể. Chế độ này được bật theo mặc định. Bạn có thể chọn không tham gia bằng cách sử dụng android.enableR8.fullMode=false.
|
| 7.0 |
Chế độ đầy đủ hiện có: Được giới thiệu dưới dạng một tính năng chọn tham gia bằng cách sử dụng android.enableR8.fullMode=true. Chế độ đầy đủ áp dụng các hoạt động tối ưu hoá mạnh mẽ hơn bằng cách đưa ra các giả định nghiêm ngặt hơn về cách mã của bạn sử dụng tính năng phản chiếu và các tính năng động khác. Mặc dù chế độ này giúp giảm kích thước ứng dụng và cải thiện hiệu suất, nhưng có thể bạn cần thêm các quy tắc giữ lại để ngăn chặn việc loại bỏ mã cần thiết.
|