Trình bổ trợ Android cho Gradle 3.0.0 (tháng 10 năm 2017)

Trình bổ trợ Android cho Gradle 3.0.0 tích hợp nhiều thay đổi nhằm giải quyết các vấn đề hiệu suất của các dự án lớn.

Ví dụ: trên một dự án mẫu cơ bản có khoảng 130 mô-đun và một số lượng lớn các phần phụ thuộc từ bên ngoài (nhưng không có mã hoặc tài nguyên), bạn có thể trải nghiệm các điểm cải thiện hiệu suất tương tự như sau:

Phiên bản trình bổ trợ Android + phiên bản Gradle Trình bổ trợ Android 2.2.0 + Gradle 2.14.1 Trình bổ trợ Android 2.3.0 + Gradle 3.3 Trình bổ trợ Android 3.0.0 + Gradle 4.1
Cấu hình (ví dụ: chạy ./gradlew --help) ~2 phút ~9 giây ~2,5 giây
Thay đổi Java 1 dòng (thay đổi triển khai) ~2 phút 15 giây ~29 giây ~6,4 giây

Một số thay đổi trong số này sẽ làm hỏng các bản dựng hiện tại. Vì vậy, bạn nên cân nhắc việc
di chuyển dự án trước khi sử dụng trình bổ trợ mới.

Nếu bạn không thấy các điểm cải thiện hiệu suất được mô tả ở trên, vui lòng gửi báo lỗi và đính kèm dấu vết bản dựng bằng Gradle Profiler (Trình phân tích tài nguyên Gradle).

Phiên bản trình bổ trợ Android này yêu cầu:

Phiên bản tối thiểu Phiên bản mặc định Lưu ý
Gradle 4.1 4.1 Để tìm hiểu thêm, hãy xem phần cập nhật Gradle.
Công cụ tạo SDK 26.0.2 26.0.2 Cài đặt hoặc định cấu hình Công cụ tạo SDK. Với bản cập nhật này, bạn không cần chỉ định phiên bản cho công cụ tạo bản dựng. Theo mặc định, trình bổ trợ sẽ sử dụng phiên bản tối thiểu cần thiết. Do đó, giờ đây, bạn có thể xoá thuộc tính android.buildToolsVersion.

Phiên bản 3.0.1 (Tháng 11 năm 2017)

Đây là bản cập nhật nhỏ nhằm hỗ trợ Android Studio 3.0.1, bao gồm các bản sửa lỗi chung cùng các điểm cải thiện hiệu suất.

Tối ưu hoá

  • Cải thiện tính năng tải song song cho các dự án nhiều mô-đun thông qua biểu đồ tác vụ chi tiết.
  • Khi thực hiện thay đổi với phần phụ thuộc, Gradle sẽ tạo bản dựng nhanh hơn bằng cách không biên dịch lại những mô-đun không có quyền truy cập vào API của phần phụ thuộc đó. Bạn nên hạn chế những phần phụ thuộc làm rò rỉ API đến các mô-đun khác bằng cách sử dụng cấu hình phần phụ thuộc mới của Gradle: implementation, api, compileOnlyruntimeOnly.
  • Tốc độ bản dựng gia tăng nhanh hơn do tạo tệp DEX cho mỗi lớp. Giờ đây, mỗi lớp được biên dịch thành các tệp DEX riêng biệt và chỉ các lớp đã được sửa đổi mới được tạo lại tệp DEX. Bạn cũng nên cải thiện tốc độ bản dựng cho các ứng dụng thiết lập minSdkVersion từ 20 trở xuống và sử dụng multidex cũ.
  • Cải thiện tốc độ bản dựng bằng cách tối ưu hoá một số tác vụ để sử dụng đầu ra lưu tại bộ nhớ đệm. Để tận dụng tính năng tối ưu hoá này, trước tiên bạn cần bật bộ nhớ đệm của bản dựng Gradle.
  • Cải thiện tính năng xử lý tài nguyên gia tăng bằng AAPT2 (nay được bật theo mặc định). Nếu bạn gặp vấn đề khi sử dụng AAPT2, vui lòng báo cáo lỗi. Bạn cũng có thể vô hiệu hoá AAPT2 bằng cách thiết lập android.enableAapt2=false trong tệp gradle.properties và khởi động lại trình nền Gradle bằng cách chạy ./gradlew --stop qua dòng lệnh.

Tính năng mới

  • Quản lý phần phụ thuộc nhận biết được biến thể. Khi tạo một biến thể nhất định của một mô-đun, trình bổ trợ nay tự động kết nối biến thể của các phần phụ thuộc mô-đun thư viện cục bộ với biến thể của mô-đun đang được tạo.
  • Tích hợp một trình bổ trợ mô-đun Tính năng (Feature) mới để hỗ trợ Ứng dụng Android tức thì và SDK Ứng dụng Android tức thì (bạn có thể tải xuống bằng trình quản lý SDK). Để tìm hiểu thêm về cách tạo mô-đun Tính năng bằng trình bổ trợ mới, hãy đọc Cấu trúc của một ứng dụng tức thì có nhiều tính năng.
  • Tích hợp tính năng hỗ trợ sử dụng các tính năng ngôn ngữ và thư viện Java 8 nhất định. Nay ngừng sử dụng Jack và không còn bắt buộc người dùng phải sử dụng Jack. Trước tiên, bạn nên vô hiệu hoá Jack để sử dụng dịch vụ hỗ trợ Java 8 được cải thiện tích hợp sẵn trong chuỗi công cụ mặc định. Để biết thêm thông tin, hãy đọc bài viết Sử dụng các tính năng ngôn ngữ Java 8.
  • Hỗ trợ thêm tính năng chạy kiểm thử bằng Android Test Orchestrator. Chương trình này cho phép bạn chạy từng bài kiểm thử của ứng dụng ngay trong lệnh gọi đo lường riêng. Vì mỗi bài kiểm thử chạy trong thực thể đo lường riêng, nên mọi trạng thái dùng chung giữa các bài kiểm thử sẽ không tích luỹ vào CPU hoặc bộ nhớ của thiết bị. Đồng thời, ngay cả khi một bài kiểm thử gặp sự cố, chỉ có thực thể đo lường của bài kiểm thử này bị gỡ bỏ. Do đó, các bài kiểm thử khác vẫn sẽ chạy.

    • Thêm testOptions.execution để xác định việc sử dụng tính năng điều phối kiểm thử trên thiết bị hay không. Nếu muốn sử dụng Android Test Orchestrator, bạn cần chỉ định ANDROID_TEST_ORCHESTRATOR như sau. Theo mặc định, việc thuộc tính này được thiết lập thành HOST sẽ vô hiệu hoá tính năng điều phối trên thiết bị và là phương thức chuẩn để chạy kiểm thử.

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • Cấu hình phần phụ thuộc androidTestUtil mới cho phép bạn cài đặt một tệp APK trình trợ giúp kiểm thử khác trước khi chạy kiểm thử đo lường, chẳng hạn như Android Test Orchestrator:

    Groovy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            dependencies {
              androidTestUtil("com.android.support.test:orchestrator:1.0.0")
              ...
            }
            
  • Thêm testOptions.unitTests.includeAndroidResources để hỗ trợ chương trình kiểm thử đơn vị yêu cầu tài nguyên Android, chẳng hạn như Roboelectric. Khi bạn thiết lập thuộc tính này thành true, trình bổ trợ sẽ thực hiện hợp nhất tài nguyên, tài sản và tệp kê khai trước khi chạy kiểm thử đơn vị. Sau đó, chương trình kiểm thử có thể kiểm tra com/android/tools/test_config.properties trên classpath cho các khoá sau:

    • android_merged_assets: đường dẫn tuyệt đối đến thư mục tài sản hợp nhất.

      Lưu ý: Đối với các mô-đun thư viện, tài sản hợp nhất không chứa tài sản của các phần phụ thuộc (xem Vấn đề #65550419).

    • android_merged_manifest: đường dẫn tuyệt đối đến tệp kê khai hợp nhất.

    • android_merged_resources: đường dẫn tuyệt đối đến thư mục tài nguyên hợp nhất, chứa tất cả tài nguyên và phần phụ thuộc của mô-đun.

    • android_custom_package: tên gói của lớp R cuối cùng. Nếu bạn sửa đổi mã ứng dụng một cách linh động, thì tên gói này có thể không khớp với thuộc tính package trong tệp kê khai của ứng dụng.

  • Hỗ trợ dành cho phông chữ dưới dạng tài nguyên – tính năng mới được giới thiệu trong Android 8.0 (API cấp 26).
  • Hỗ trợ tệp APK theo ngôn ngữ cụ thể bằng SDK Ứng dụng Android tức thì 1.1 trở lên.
  • Hiện bạn có thể thay đổi thư mục đầu ra cho dự án hệ thống bản dựng gốc bên ngoài như sau:

    Groovy

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory "./outputs/cmake"
                    }
                }
            }
            

    Kotlin

            android {
                ...
                externalNativeBuild {
                    // For ndk-build, instead use the ndkBuild block.
                    cmake {
                        ...
                        // Specifies a relative path for outputs from external native
                        // builds. You can specify any path that's not a subdirectory
                        // of your project's temporary build/ directory.
                        buildStagingDirectory = "./outputs/cmake"
                    }
                }
            }
            
  • Hiện bạn có thể sử dụng CMake 3.7 trở lên khi tạo các dự án gốc trong Android Studio.
  • Cấu hình phần phụ thuộc lintChecks mới cho phép bạn tạo tệp JAR xác định các quy tắc tìm lỗi mã nguồn tuỳ chỉnh và đóng gói tệp này vào các dự án AAR và APK.

    Các quy tắc tìm lỗi mã nguồn tuỳ chỉnh phải thuộc về một dự án riêng xuất ra một tệp JAR duy nhất và chỉ bao gồm các phần phụ thuộc compileOnly. Các mô-đun thư viện và ứng dụng khác sau đó có thể phụ thuộc vào dự án tìm lỗi mã nguồn bằng cách sử dụng cấu hình lintChecks:

    Groovy

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks project(':lint-checks')
            }
            

    Kotlin

            dependencies {
                // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
                // and package it with your module. If the module is an Android library,
                // other projects that depend on it automatically use the lint checks.
                // If the module is an app, lint includes these rules when analyzing the app.
                lintChecks(project(":lint-checks"))
            }
            

Thay đổi về hành vi

  • Trình bổ trợ Android 3.0.0 sẽ xoá một số API nhất định và bản dựng sẽ bị hỏng nếu bạn sử dụng các API này. Ví dụ: bạn không thể dùng Variants API để truy cập vào các đối tượng outputFile() hoặc dùng processManifest.manifestOutputFile() để lấy tệp kê khai cho từng biến thể. Để tìm hiểu thêm, hãy đọc bài viết Các thay đổi về API.
  • Bạn không cần chỉ định phiên bản cho công cụ bản dựng (do đó, bạn có thể xoá thuộc tính android.buildToolsVersion). Theo mặc định, trình bổ trợ này tự động dùng phiên bản công cụ bản dựng tối thiểu bắt buộc cho phiên bản trình bổ trợ Android mà bạn đang dùng.
  • Hiện bạn có thể bật/tắt tính năng nén tệp PNG trong khối buildTypes như sau. Theo mặc định, tính năng nén tệp PNG được bật cho tất cả bản dựng ngoại trừ các bản gỡ lỗi vì các bản này sẽ tăng thời gian tạo bản dựng cho các dự án chứa nhiều tệp PNG. Vì vậy, để cải thiện thời gian tạo bản dựng cho các loại bản dựng khác, bạn nên vô hiệu hoá tính năng tự động nén PNG hoặc chuyển đổi hình ảnh thành WebP.

    Groovy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • Trình bổ trợ Android nay tự động tạo các mục tiêu thực thi mà bạn định cấu hình trong các dự án CMake bên ngoài.
  • Nay bạn phải thêm trình xử lý chú giải vào classpath của trình xử lý bằng cách dùng cấu hình phần phụ thuộc annotationProcessor.
  • Việc sử dụng ndkCompile không dùng nữa hiện đã bị hạn chế hơn. Thay vào đó, bạn nên chuyển sang dùng CMake hoặc ndk-build để biên dịch mã gốc mà bạn muốn đóng gói vào tệp APK. Để tìm hiểu thêm, hãy đọc nội dung Di chuyển từ ndkcompile.