12 mẹo tối ưu tốc độ xây dựng trong Android Studio

Quá trình xây dựng ứng dụng đôi khi có thể làm chậm tiến độ của dự án. Tuy nhiên, vì không có một mẫu nào cho việc xây dựng ứng dụng, nên có một số mẹo giúp tối ưu tốc độ xây dựng của bạn.

Là một lập trình viên Android sử dụng Android Studio, có nhiều cách để cải thiện tốc độ xây dựng ngoài hệ sinh thái Android nhằm phát triển ứng dụng chất lượng:

  • Kiểm tra ứng dụng liên tục trong quá trình xây dựng: Điều này cho phép bạn phát hiện bất kỳ lỗi nào trước khi ứng dụng của bạn dừng hoạt động đột ngột.
  • Xem xét kỹ lưỡng các hướng dẫn của nhà phát triển Android trước khi nộp ứng dụng lên Google Play Store để tránh bị từ chối.
  • Đừng bỏ qua phần cứng của bạn: Đảm bảo rằng ứng dụng của bạn có thể chạy trên tất cả các thiết bị liên quan. Điều này có nghĩa là đôi khi bạn cần tránh sử dụng các tính năng tiên tiến để đảm bảo tính tương thích rộng rãi cho ứng dụng.

Trong Android Studio, dưới đây là hai cách tổng quát để tối ưu tốc độ xây dựng mà chúng tôi sẽ đề cập trong bài viết này: phân tích quá trình xây dựng của bạn và tối ưu cấu hình xây dựng của bạn.

12 mẹo tối ưu tốc độ xây dựng trong Android Studio

Phân tích quá trình xây dựng

Đối với những người xây dựng các dự án lớn hoặc thực hiện bất kỳ logic xây dựng tùy chỉnh nào, bạn sẽ cần đi sâu hơn để tối ưu tốc độ xây dựng bằng cách phân tích thời gian mà Gradle mất để thực hiện các nhiệm vụ xây dựng.

Có hai tùy chọn để phân tích quá trình xây dựng của bạn bên ngoài Android Studio:

Sử dụng công cụ gradle-profiler

Đây là một công cụ mạnh mẽ để phân tích quá trình xây dựng một cách sâu sắc. Nó cho phép bạn tạo các kịch bản xây dựng và chạy chúng nhiều lần để đảm bảo rằng các kết quả là như mong muốn.

Trước khi bạn có thể sử dụng Gradle profiler, bạn cần đáp ứng một số yêu cầu về dự án. Những yêu cầu này bao gồm:

  • Phiên bản Gradle
  • Phiên bản Plugin
  • Các tùy chọn theo từng plugin để tối ưu hóa hiệu suất
  • Cài đặt JVM (kích thước heap, garbage collection, v.v.)
  • Số lượng worker của Gradle (org.gradle.workers.max)

Để bắt đầu với công cụ Gradle profiler, bạn cần cài đặt nó theo hướng dẫn này, chạy lệnh:

gradle-profiler --benchmark --project-dir _<root-project>_ :app:assembleDebug

Có một số kịch bản bạn có thể muốn benchmark ngoài báo cáo HTML được tạo ra, bao gồm:

  • Sửa đổi chuỗi để mô phỏng việc xử lý công việc dịch thuật
  • Thay đổi API trong một module được sử dụng trên toàn dự án của bạn
  • Xây dựng sạch để mô phỏng thay đổi trong bản xây dựng
  • Sửa đổi bố cục để mô phỏng việc lặp lại công việc UI
  • Thay đổi mã trong thân phương thức trong một lớp mà bạn thực hiện nhiều công việc nhất.

Sử dụng tùy chọn --profile

Bạn sẽ cần một báo cáo phân tích xây dựng để kiểm tra các cơ hội tối ưu hóa. Để tạo và xem hồ sơ xây dựng từ dòng lệnh Gradle, hãy làm theo các bước sau:

Bước 1: Mở terminal dòng lệnh tại dự án gốc của bạn.

Bước 2: Thực hiện một bản xây dựng sạch giữa mỗi bản xây dựng vì Gradle sẽ bỏ qua một số nhiệm vụ khi đầu vào của những nhiệm vụ này không thay đổi. Chạy lệnh dòng lệnh clean để đảm bảo rằng bạn phân tích toàn bộ quá trình xây dựng.

Bước 3: Thực hiện một bản xây dựng debug cho một trong các biến thể sản phẩm của bạn với các cờ sau:

gradlew --profile --offline --rerun-tasks assembleFlavorDebug

Bước 4: Sau khi xây dựng hoàn tất, hãy điều hướng đến thư mục project-root/build/reports/profile/ trong cửa sổ Dự án.

Sử dụng tùy chọn --profile

Bước 5: Để nhận báo cáo, nhấp chuột phải vào tệp profile-timestamp.html và chọn "Open in Browser > Default".

Sử dụng tùy chọn --profile

Tối ưu cấu hình xây dựng

Một tùy chọn khác để cải thiện tốc độ xây dựng cho dự án Android Studio của bạn là tối ưu hóa cấu hình xây dựng. Dưới đây là một số cách để tối ưu hóa tốc độ xây dựng:

Cập nhật liên tục các công cụ Android

Nếu bạn đang sử dụng các công cụ Android cũ, bước đầu tiên là cập nhật lên phiên bản mới nhất. Đây là hai công cụ cần được cập nhật thường xuyên:

  • Android Studio và công cụ SDK
  • Plugin Android Gradle

Thử nghiệm đặt Plugin Gradle cuối cùng

Nếu bạn cần một plugin bên thứ ba được giải quyết bởi gradlePluginPortal, bạn có thể thử nghiệm, hãy cân nhắc đặt chúng cuối cùng trong khối kho lưu trữ trong tệp settings.gradle. Điều này sẽ giảm thiểu số lượng tìm kiếm plugin thừa và cải thiện tốc độ xây dựng của bạn.

Tạo các Module thư viện

Chia nhỏ mã của bạn cho phép hệ thống xây dựng chỉ biên dịch các module bạn đã sửa đổi cho các bản xây dựng trong tương lai.

Tuy nhiên, trước tiên bạn cần tạo một thư viện Android. Điều này bao gồm tất cả những gì bạn cần để xây dựng một ứng dụng Android bao gồm các tệp tài nguyên, manifest Android, và mã nguồn.

Tạo các Module thư viện

Module thư viện có lợi ích như sau:

  • Giảm sự lặp lại khi xây dựng một ứng dụng tương tự; bạn có thể sử dụng cùng một hoạt động, bố cục UI, và nhiều thứ khác.
  • Tiết kiệm thời gian cho cấu hình khi xây dựng một ứng dụng tồn tại ở nhiều biến thể APK khác nhau như phiên bản trả phí hoặc miễn phí.

Vô hiệu hóa PNG Crunching

Nếu bạn không chuyển đổi các hình ảnh PNG của mình thành WebP, bạn vẫn có thể tăng tốc quá trình xây dựng ứng dụng bằng cách vô hiệu hóa PNG crunching. Đối với những người sử dụng plugin Android Gradle 3.0 và phiên bản mới hơn, PNG crunching được vô hiệu hóa theo mặc định. Để vô hiệu hóa, hãy thêm đoạn mã sau vào tệp gradle.build của bạn:

android {
    buildTypes {
        getByName("release") {
            // Vô hiệu hóa PNG crunching cho loại bản xây dựng "release".
            isCrunchPngs = false
        }
    }
}

Sử dụng Cache cấu hình thí điểm

Cache cấu hình là một tính năng giúp cải thiện hiệu suất xây dựng một cách đáng kể bằng cách lưu trữ kết quả của giai đoạn cấu hình.

Với điều này, Gradle có thể bỏ qua giai đoạn này hoàn toàn mà không ảnh hưởng đến cấu hình xây dựng.

Tuy nhiên, trước khi chạy cache cấu hình, Gradle kiểm tra rằng không có đầu vào cấu hình xây dựng nào đã thay đổi. Những đầu vào này bao gồm:

  • Tập lệnh xây dựng
  • Tập lệnh cài đặt
  • Tệp cấu hình được truy cập bằng các nhà cung cấp giá trị như providers
  • Các thuộc tính Gradle được sử dụng trong giai đoạn cấu hình
  • Tập lệnh khởi tạo
  • Các đầu vào xây dựng bao gồm buildSrc và plugin, bao gồm các đầu vào cấu hình xây dựng và tệp nguồn.
  • Các biến môi trường được sử dụng trong giai đoạn cấu hình
  • Các thuộc tính hệ thống được sử dụng trong giai đoạn cấu hình

Để bật cache cấu hình, hãy làm theo các bước sau:

  • Kiểm tra xem tất cả các plugin dự án có tương thích hay không bằng cách sử dụng công cụ phân tích xây dựng.
  • Thêm đoạn mã này vào tệp gradle.properties:
org.gradle.unsafe.configuration-cache=true
# Sử dụng cờ này một cách cẩn thận, trong trường hợp một số plugin không hoàn toàn tương thích.
org.gradle.unsafe.configuration-cache-problems=warn

Xem xét các lớp R không chuyển tiến

Sử dụng các lớp R để cải thiện tốc độ xây dựng ứng dụng khi làm việc với nhiều module. Nếu bạn đang sử dụng Android Gradle 8.0 hoặc cao hơn, các lớp R không chuyển tiến được đặt theo mặc định.

Ngoài ra, việc áp dụng các lớp R giúp ngăn ngừa sự trùng lặp tài nguyên. Điều này đảm bảo mỗi module R chứa các tham chiếu từ tài nguyên của nó mà không kéo chúng từ các phụ thuộc của nó.

Tạo các nhiệm vụ cho Logic xây dựng tùy chỉnh

Bạn có thể di chuyển một số logic xây dựng vào một nhiệm vụ để đảm bảo chúng chỉ chạy khi cần thiết.

Các kết quả này có thể được lưu vào bộ nhớ cache cho các bản xây dựng tiếp theo, giúp logic xây dựng chạy song song nếu bạn bật thực thi dự án song song. Kết quả là, việc thực thi song song sẽ cải thiện tốc độ xây dựng.

Sử dụng phiên bản phụ thuộc tĩnh

Tránh sử dụng các phiên bản phụ thuộc động khi khai báo các phụ thuộc trong build.gradle. Các nhược điểm của việc sử dụng phiên bản phụ thuộc động bao gồm:

  • Các bản xây dựng chậm hơn do Gradle liên tục kiểm tra các bản cập nhật.
  • Khó khăn trong việc giải quyết các khác biệt về phiên bản.
  • Cập nhật phiên bản không mong muốn.

Tăng kích thước Heap JVM

Tăng kích thước heap của Java Virtual Machine (JVM) sẽ tối ưu tốc độ xây dựng. Dưới đây là các bước để tăng kích thước heap của máy chủ ứng dụng:

  1. Đăng nhập vào máy chủ quản trị máy chủ ứng dụng.
  2. Điều hướng đến các tùy chọn JVM.
  3. Chỉnh sửa tùy chọn -Xmx256m.
  4. Tùy chọn này thiết lập kích thước heap của JVM.
  5. Đặt tùy chọn -Xmx256m thành giá trị cao hơn, chẳng hạn như Xmx1024m.
  6. Lưu cài đặt mới.

Vô hiệu hóa cờ Jetifier

Công cụ Jetifier cho phép bạn di chuyển một thư viện cá nhân trực tiếp thay vì sử dụng plugin Android Gradle được gói kèm với Android Studio.

Tuy nhiên, vì hầu hết các dự án sử dụng các thư viện AndroidX trực tiếp, bạn có thể gỡ bỏ cờ Jetifier để cải thiện hiệu suất xây dựng.

Dưới đây là cách vô hiệu hóa cờ Jetifier: đặt

android.enableJetifier=false

trong tệp gradle.properties của bạn.

Chuyển đổi hình ảnh sang WebP

WebP là định dạng hình ảnh cho web. Hình ảnh WebP không nén nhỏ hơn 26% so với PNG và hơn 25% so với JPEG.

Bạn có thể cải thiện tốc độ xây dựng bằng cách giảm kích thước tệp hình ảnh. Tuy nhiên, nhược điểm là việc tăng cường sử dụng CPU khi giải nén hình ảnh WebP.

Chuyển đổi hình ảnh sang WebP

Thử nghiệm trình thu gom rác song song JVM

Vai trò của trình thu gom rác song song JVM là tìm và xóa bất kỳ rác nào khỏi không gian bộ nhớ. Nó thực hiện nhiệm vụ này theo hai bước:

  1. Đánh dấu bằng cách xác định các không gian nào của bộ nhớ đang được sử dụng và những không gian nào không.
  2. Quét bằng cách xóa các rác được xác định trong bộ nhớ.

Ngoài việc tối ưu tốc độ xây dựng ứng dụng, những lợi ích khác của việc thử nghiệm với trình thu gom rác song song JVM bao gồm:

  • Tránh việc phân bổ bộ nhớ thủ công.
  • Tự động quản lý rò rỉ bộ nhớ.
  • Giảm tải trong việc xử lý con trỏ lơ lửng.

Tối ưu hóa tốc độ xây dựng trong Android Studio là một yếu tố quan trọng giúp nâng cao hiệu suất phát triển ứng dụng và tiết kiệm thời gian cho lập trình viên.

Bằng cách áp dụng các mẹo và kỹ thuật đã đề cập trong bài viết này, bạn có thể cải thiện đáng kể tốc độ xây dựng, từ việc sử dụng công cụ phân tích như Gradle profiler cho đến việc điều chỉnh cấu hình xây dựng và sử dụng các định dạng hình ảnh tối ưu.

Hãy thường xuyên kiểm tra và cập nhật công cụ cũng như thư viện của bạn để đảm bảo rằng ứng dụng luôn hoạt động mượt mà và hiệu quả trên nhiều thiết bị khác nhau.

Việc đầu tư thời gian vào tối ưu hóa sẽ mang lại những lợi ích lâu dài trong quá trình phát triển ứng dụng của bạn.