Tối ưu tốc độ Gradle Build trong Android Studio

Gradle cung cấp các công cụ tự động hóa build tốt nhất trong Android Studio. Nó được sử dụng để build, kiểm tra và đóng gói các ứng dụng Android. Tuy nhiên, thời gian Gradle build có thể khá chậm, đặc biệt khi bạn phát triển các dự án lớn. Điều này ảnh hưởng đến năng suất của các nhà phát triển Android.

Để tăng tốc thời gian build của Gradle, có nhiều cách chúng ta có thể tối ưu hóa các giai đoạn: khởi tạo, cấu hình và thực thi cuối cùng.

Trước khi chúng ta đi sâu vào cách tối ưu hóa tốc độ build của Gradle trong Android Studio, hãy cùng tìm hiểu những kiến thức cơ bản về hệ thống Gradle build.

Tối ưu tốc độ Gradle Build trong Android Studio

Gradle build là gì?

Gradle là một bộ công cụ tự động hóa build mã nguồn mở giúp xây dựng bất kỳ loại phần mềm nào với tính linh hoạt, sử dụng các giải pháp như Android, các ngôn ngữ JVM, Scala, Java và Groovy.

Gradle build là một quy trình để tạo các dự án Gradle. Quá trình build của Gradle bao gồm việc biên dịch, liên kết, kiểm tra và đóng gói mã nguồn.

Làm cách nào để cài đặt Gradle Build?

Dưới đây là các bước để thiết lập Gradle build trên hệ thống của bạn.

Bước 1: Kiểm tra xem Java đã được cài đặt trong hệ thống của bạn hay chưa

Để kiểm tra, mở dấu nhắc lệnh và gõ phiên bản Java. Nếu Java đã được cài đặt, bạn có thể tiếp tục cài đặt Gradle. Nếu chưa, tải Java tại đây.

Bước 2: Tải Gradle tại đây nếu bạn chưa cài đặt.

Bước 3: Thiết lập biến môi trường

Bạn có thể thực hiện điều này bằng cách giải nén file phân phối và sao chép vào vị trí mong muốn.

Bước 4: Xác minh cài đặt Gradle

Mở dấu nhắc lệnh lại, gõ phiên bản Gradle, và nó sẽ hiển thị phiên bản hiện tại của Gradle trên màn hình.

Làm thế nào để chạy Gradle build?

Bạn có thể chạy các tác vụ Gradle theo nhiều cách khác nhau. Ví dụ, bạn có thể thêm tham số vào tác vụ và cấu hình nó. Dưới đây là các bước để chạy cấu hình Gradle trong dự án của bạn.

Bước 1: Mở cửa sổ công cụ Gradle

Bước 2: Nhấp chuột phải vào tác vụ mà bạn muốn tạo cấu hình chạy

Bước 3: Từ menu ngữ cảnh, chọn Modify Run Configuration

Bước 4: Trong Create Run Configuration: 'tên tác vụ', bạn có thể cấu hình các tùy chọn bổ sung hoặc sử dụng các thiết lập mặc định và nhấp OK.

Làm thế nào để build Gradle trong Android Studio?

Plugin Gradle Android đi kèm với nhiều tính năng để tăng tốc việc build ứng dụng Android.

Điều quan trọng cần lưu ý là Gradle và các plugin Android Gradle hoạt động độc lập với Android Studio. Điều này có nghĩa là bạn có thể phát triển ứng dụng trong Studio hoặc trên máy tính nơi nó được cài đặt.

Cả plugin Android Gradle và Gradle đều giúp bạn cấu hình một số khía cạnh này trong build của Android Studio.

  • Product flavors: Các phiên bản khác nhau của ứng dụng của bạn, như phiên bản miễn phí và trả phí.
  • Dependencies: Cho phép quản lý hệ thống build dễ dàng từ các kho lưu trữ từ xa hoặc hệ thống file cục bộ của bạn.
  • Multiple APK support: Hệ thống build cho phép bạn tự động thêm các APK khác nhau.
  • Build types: Định nghĩa các thuộc tính mà Gradle sử dụng khi build và đóng gói ứng dụng của bạn.

Làm thế nào để tăng tốc độ Gradle Build?

Kiểm tra build của bạn

Điều đầu tiên là kiểm tra build Gradle trước khi bạn thực hiện bất kỳ thay đổi nào. Bạn có thể sử dụng build scan hoặc báo cáo profile.

Build scan cung cấp một cái nhìn tổng quan về quá trình build để xác định bất kỳ vấn đề nào trước khi tiếp tục. Các lần kiểm tra liên tục rất quan trọng để phát hiện các vấn đề về hiệu suất build.

Một quá trình kiểm tra build kỹ lưỡng giúp bạn hiểu được các yếu tố sau:

  • Thời gian để build dự án
  • Các phần của build bị chậm và cần tối ưu hóa

Trong quá trình kiểm tra, bạn cũng có thể cập nhật các phiên bản công cụ của mình, bao gồm:

  • Gradle: Luôn cập nhật với phiên bản mới nhất của Gradle để theo dõi hiệu suất build.
  • Java: Gradle chạy trên Java Virtual Machine (JVM), nên việc nâng cấp Java mới nhất sẽ giúp Gradle đạt hiệu suất tốt nhất.
  • Plugins: Các plugin quan trọng như Android, Java, và Kotlin liên tục được nâng cấp. Để có hiệu suất build tốt hơn, hãy sử dụng các phiên bản mới nhất.

Kích hoạt song song hóa (parallel execution)

Song song hóa là việc chia nhỏ một tác vụ để thực thi nhiều quá trình cùng lúc. Mặc định, Gradle chỉ chạy một tác vụ. Để kích hoạt thực thi song song cho các dự án phụ, sử dụng cờ parallel.

$ gradle <tác vụ> --parallel

Bạn cũng có thể kích hoạt song song hóa bằng cách thêm cài đặt sau vào file gradle.properties trong thư mục gốc của dự án hoặc thư mục Gradle.

org.gradle.parallel=true

Song song hóa cải thiện thời gian build đáng kể. Tuy nhiên, điều kiện là dự án không thể chỉ có một tác vụ và không có các phụ thuộc giữa các dự án phụ.

Kích hoạt song song hóa (parallel execution)

Kích hoạt Gradle Daemon

Daemon là một chương trình máy tính chạy dưới dạng một quá trình nền mà không cần sự điều khiển trực tiếp của người dùng.

Gradle Daemon giảm thời gian build bằng cách:

  • Chạy nền nên mỗi lần build không cần đợi khởi động JVM.
  • Lưu trữ thông tin dự án giữa các lần build.
  • Tính toán chính xác những gì cần build lại trước khi chạy.

Kể từ Gradle 3.0, Daemon được kích hoạt mặc định. Tuy nhiên, nếu build Gradle của bạn không có Daemon, bạn có thể kích hoạt lại với cờ daemon.

$ gradle <tác vụ> --daemon

Kích hoạt build cache

Build cache là một cơ chế lưu trữ nhằm tiết kiệm thời gian bằng cách tái sử dụng các đầu ra từ các lần build trước.

Bạn có thể kích hoạt cache khi build bằng cách sử dụng cờ build-cache.

$ gradle <tác vụ> --build-cache

Hoặc thêm cài đặt sau vào file gradle.properties:

org.gradle.caching=true

Kích hoạt cấu hình cache

Mặc dù cache cấu hình không hỗ trợ tất cả các plugin và tính năng cốt lõi của Gradle, bạn vẫn có thể kích hoạt cache cấu hình trong giai đoạn cấu hình. Các đầu vào cấu hình build bao gồm:

  • Build scripts (kịch bản build)
  • Init scripts (kịch bản khởi tạo)
  • Setting scripts (kịch bản cài đặt)
  • Các biến môi trường sử dụng trong giai đoạn cấu hình
  • Các thuộc tính hệ thống sử dụng trong giai đoạn cấu hình
  • Các thuộc tính Gradle sử dụng trong giai đoạn cấu hình
  • Các đầu vào buildScr, bao gồm các đầu vào cấu hình build và các file mã nguồn.
  • Các file cấu hình được truy cập thông qua các nhà cung cấp giá trị như providers.

Điều quan trọng cần lưu ý là hiện tại Gradle không tự động sử dụng cache cấu hình. Bạn có thể kích hoạt nó trong lúc build bằng cách sử dụng cờ configuration_cache.

$ gradle <tác vụ> --configuration-cache

Kích hoạt build gia tăng cho các tác vụ tùy chỉnh

Build gia tăng (incremental builds) là các build được tối ưu hóa để giữ cho các file đầu ra cập nhật so với các file đầu vào tương ứng mà không cần thực thi lại. Kỹ thuật tối ưu hóa Gradle này bỏ qua các tác vụ đã được thực thi trước đó với cùng đầu vào.

Kích hoạt build gia tăng cho các tác vụ tùy chỉnh

Vì hầu hết các tác vụ tích hợp sẵn của Gradle sử dụng build gia tăng, bạn có thể làm cho các tác vụ tùy chỉnh tương thích với nó bằng cách chỉ định các đầu vào và đầu ra.

build.gradle.kts

tasks.register("processTemplatesAdHoc") {
    inputs.property("engine", TemplateEngineType.FREEMARKER)
    inputs.files(fileTree("src/templates"))
        .withPropertyName("sourceFiles")
        .withPathSensitivity(PathSensitivity.RELATIVE)
    inputs.property("templateData.name", "docs")
    inputs.property("templateData.variables", mapOf("year" to "2013"))
    outputs.dir(layout.buildDirectory.dir("genOutput2"))
        .withPropertyName("outputDir")

    doLast {
        // Xử lý các templates ở đây
    }
}

Ngoài ra, bạn có thể tối ưu hóa tốc độ build Gradle bằng cách tạo các build phù hợp với quy trình làm việc của các nhà phát triển cụ thể. Điều này cũng giúp giảm thời gian build cho các nhóm làm việc trên các dự án phụ không liên quan.

Để kích hoạt các quy trình làm việc cho các nhà phát triển cụ thể, hãy tạo các tác vụ phù hợp với nhu cầu của họ. Gradle cung cấp nhiều tính năng để tạo ra những quy trình làm việc này:

  • Gán tác vụ vào các nhóm phù hợp
  • Tạo các tác vụ tổng hợp: các tác vụ không có hành động chỉ phụ thuộc vào các tác vụ khác, chẳng hạn như assemble
  • Hoãn cấu hình thông qua gradle.taskGraph.whenReady() và các phương pháp khác, để chỉ thực hiện xác minh khi cần thiết.

Tăng kích thước heap

Mặc định, Gradle dành 512MB heap cho build. Tuy nhiên, các dự án lớn có thể cần nhiều bộ nhớ hơn. Bạn có thể chỉ định kích thước heap lớn hơn bằng cách thêm thuộc tính sau vào gradle.properties:

org.gradle.jvmargs=-Xmx2048M

Tối ưu hóa xử lý phụ thuộc (dependency resolution)

Xử lý phụ thuộc là quá trình bao gồm hai giai đoạn được thực hiện lặp lại cho đến khi đồ thị phụ thuộc hoàn chỉnh. Bạn có thể tối ưu hóa cách tham chiếu các phụ thuộc để giảm thời gian build bằng cách:

  • Tối ưu hóa thứ tự kho lưu trữ
  • Giới hạn số lượng kho lưu trữ
  • Giảm phiên bản động và snapshot

Tối ưu hóa xử lý phụ thuộc (dependency resolution)

Tối ưu hóa cấu hình

Gradle build có ba giai đoạn: Khởi tạo, Cấu hình, và Thực thi. Cấu hình càng lâu sẽ làm chậm thời gian build. Bạn có thể giảm thời gian cấu hình bằng cách:

  • Tránh công việc bị chặn.
  • Chỉ sử dụng plugin khi cần thiết.

Tóm lại

Hiệu suất build là yếu tố quan trọng đối với năng suất của nhà phát triển Android. Thời gian dành ít hơn để tối ưu hóa Gradle build sẽ giúp bạn có thêm thời gian để phát triển tính năng, thử nghiệm và hoàn thành các yêu cầu đặt ra.

Hãy sử dụng những giải pháp tối ưu này để cải thiện tốc độ build Gradle và hiệu suất làm việc của bạn.