+3

Phần 5 - Performance

Trong bài viết này chúng ta sẽ cũng nói đến một số cách để cải thiện được Performance khi chạy Gradle, đặc biệt trong dự án Android. Ở đây chúng ta nói về performance khi build source code Android chứ không phải performance của ứng dụng Android, mọi người lưu ý nhé 😄 . Sau đây sẽ là một số cách để chúng ta có thể cải thiện performance khi build source code Android.

The Gradle daemon

The Gradle daemon là một tiến trình chạy nền được giữ tồn tại giữa việc builds, caching cả dữ liệu lẫn source code. Hầu hết các phiên bản của Gradle đều tự động start một Gradle daemon bất cứ khi nào chúng ta chạy gradle từ command prompt. Mặc định, Android Studio đã start một Gradle daemon trong project của chúng ta với timeout là 3 giờ, thời gian đủ dài để phát triển tasks. Do một số nguyên nhân nào đó mà Gradle daemon không được khởi chạy thì để chắc chắn Gradle daemon được start, chúng ta sẽ thêm dòng lệnh này trong file gradle.properties

org.gradle.daemon=true

Ngoài ra chúng ta cũng có thể start Gradle daemon bằng command line bằng từ khóa --daemon và --no-daemon để stop. Nếu daemon đang được chạy, để stop chúng ta sẽ dùng từ khóa --stop. Các bạn nên lưu ý là nên stop Gradle daemon nếu bạn muốn debug hoặc lo lắng về vấn đề caching làm dữ liệu không đúng.

Parallel compilation

Chúng ta có thể thực hiện compile song song cách task bằng cách thêm dòng lệnh sau vào gradle.properties

org.gradle.parallel=true

Tuy nhiên cách này không cải thiện performance được nhiều. Hầu hết các task trong Android project đều có liên quan đến nhau nên rất khó có thể tách rời va chạy một cách độc lập song song.

Configuration on demand

Thông thường Gradle cấu hình tất cả các task trong project trước khi thực thi chúng. Đối với một project có số lượng subproject và có rất nhiều task, điều này sẽ dẫn đến sự chậm chạp và không hiệu quả. Do đó, chúng ta sẽ cố gắng chỉ cấu hình những project có liên quan đến yêu cầu của task. Để làm được điều đó, chúng ta sẽ sử dụng "configure on demand" setting trong gradle.properties

org.gradle.configureondemand=true

Các project Android thông thường chỉ có số lượng nhỏ subprojects nên cách này cũng không cải thiện được nhiều.

Exclude unneeded tasks

Khi chạy gradle chúng ta nên sử dụng option -x để loại bỏ một số task không cần thiết, ví dụ như lint là một task không nhất thiết lần build nào chúng ta cũng cần thực thi.

Change the JVM settings

Cuối cùng Gradle luôn chạy trên một tiến trình Java, do đó option sau sẽ ảnh hưởng đến JVM dẫn đến cũng ảnh hưởng đến performance của Gradle. Dưới đây là một ví dụ về điều này

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
-XX:+HeapDumpOnOutOfMemoryError

Option -Xmx được sử dụng để giới hạn tối đa của memory dành cho tiến trình Java. Ví dụ trên thể hiện việc thay đổi kích thước của "permanent generation" và dump heap khi một ngoại lệ java.lang.OutOfMemoryError xảy ra. Để xem các option khác, các bạn có thể tham khảo thêm ở link sau: http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html.

Use only the dependencies you need

Cách này được đề cập chủ yếu đến Google Play services, đây là một thư viện lớn bao gồm rất nhiều module. Ví dụ, để sử dụng Google Maps, bạn có thể add vào app/build.gradle như sau

dependencies {
    implementation  'com.google.android.gms:play-service:11.8.0'
}

Tuy nhiên đây là một thư viện lớn, bao gồm rất nhiều các dependencies. Với giới hạn Android’s 65K method name, việc add tất cả các module trên là không cần thiết. Để sử dụng tốt nhất, chúng ta chỉ cần add đúng Google Maps như sau

dependencies {
    implementation 'com.google.android.gms:play-service-maps:11.8.0'
}

Use dex options

Trong khối android {} (trong file app/build.gradle), chúng ta có thể chỉ định option cho tiến trình dex (tiến trình chuyển đổi Java byte codes thành Dalvik executables ). Khối dexOptiondexOptions bào gồm các option sau

dexOptions {
    incremental true
    javaMaxHeapSize '2g'
    jumboMode = true
    preDexLibraries = true
}
  • incremental được sử dụng để enable hoặc disable incremental mode.
  • javaMaxHeapSize là một option thay thế cho việc sử dụng Xmx trong gradle.properties
  • jumbo mode cho phép một lượn lớn chuỗi trong dex files.
  • preDexLibraries sẽ làm tiến trình dx chạy đầu tiên, option này làm tăng khả năng build nhưng khi clean sẽ lâu hơn. Lưu ý là tất cả các option trên đều có thể làm cải thiện performance hoặc có thể làm giảm performance, do đó chúng ta nên thử và tìm hiểu kỹ trước khi sử dụng trong project của mình.

Profiling your build

Cách cuối cùng trong bài viết hôm nay là chúng ta sử dụng flag --profile để sinh ra thông tin build. Kết quả sẽ được viết trong một HTML form (build/reports/profile). Tên file thường có dạng "profile-YYYY-MM-dd-hh-mm-ss.html". Cách này có hữu hiệu khi sử dụng với cách project có số lượng module lớn, nó sẽ giúp chúng ta dễ dàng tìm được các chỗ gây tắc nghẽn trong tiến trình.

Trên đây là một số cách để chúng ta có thể tìm hiểu và cải thiện performance khí sử dụng Gradle trong Android. Đây cũng là bài viết cuối cùng trong loạt bài về Gradle cơ bản trong Android. Cảm ơn các bạn đã quan tâm. Thank you!

Cảm ơn các bạn đã đọc bài viết. Happy coding!!!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.