Phần 5 - Performance
This post hasn't been updated for 6 years
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ụngXmx
trong gradle.propertiesjumbo mode
cho phép một lượn lớn chuỗi trongdex
files.preDexLibraries
sẽ làm tiến trìnhdx
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