Trình bổ trợ Android cho Gradle 3.6.0 (tháng 2 năm 2020)

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

Tính năng mới

Phiên bản Trình bổ trợ Android cho Gradle này có các tính năng mới sau đây.

Liên kết thành phần hiển thị

Tính năng Liên kết khung hiển thị đảm bảo an toàn về thời gian biên dịch khi tham chiếu các khung hiển thị trong mã. Bây giờ, bạn có thể thay thế findViewById() bằng tệp tham chiếu lớp liên kết tạo tự động. Để bắt đầu sử dụng tính năng Liên kết khung hiển thị, hãy đưa nội dung sau vào tệp build.gradle của mỗi mô-đun:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Để tìm hiểu thêm, hãy đọc tài liệu về Liên kết khung hiển thị.

Hỗ trợ trình bổ trợ phát hành của Maven

Trình bổ trợ Android cho Gradle cung cấp tính năng hỗ trợ cho Trình bổ trợ phát hành của Maven cho Gradle, cho phép bạn phát hành các cấu phần phần mềm bản dựng lên một kho lưu trữ Apache Maven. Trình bổ trợ Android cho Gradle sẽ tạo một thành phần cho mỗi cấu phần phần mềm biến thể bản dựng trong ứng dụng hoặc mô-đun thư viện mà bạn có thể dùng để tuỳ chỉnh ấn bản cho kho lưu trữ Maven.

Để tìm hiểu thêm, hãy truy cập trang về cách sử dụng Trình bổ trợ phát hành của Maven.

Công cụ đóng gói mặc định mới

Khi xây dựng phiên bản gỡ lỗi của ứng dụng, trình bổ trợ sẽ sử dụng một công cụ đóng gói mới có tên zipflinger để xây dựng APK. Công cụ mới này sẽ giúp cải thiện tốc độ tạo bản dựng. Nếu công cụ đóng gói mới không hoạt động như mong đợi, vui lòng báo cáo lỗi. Bạn có thể quay lại sử dụng công cụ đóng gói cũ bằng cách đưa nội dung sau vào tệp gradle.properties:

        android.useNewApkCreator=false
      

Thuộc tính bản dựng gốc

Hiện bạn có thể xác định khoảng thời gian cần thiết để Clang xây dựng và liên kết mỗi tệp C/C++ trong dự án. Gradle có thể xuất một dấu vết Chrome chứa dấu thời gian cho những sự kiện biên dịch này, giúp bạn hiểu rõ hơn về thời gian cần thiết để xây dựng dự án. Để xuất tệp thuộc tính bản dựng này, hãy làm như sau:

  1. Bổ sung cờ -Pandroid.enableProfileJson=true khi chạy bản dựng Gradle. Ví dụ:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Mở trình duyệt Chrome và nhập chrome://tracing vào thanh tìm kiếm.

  3. Nhấp vào nút Tải (Load) và chuyển đến <var>project-root</var>/build/android-profile để tìm tệp. Tệp này có tên là profile-<var>timestamp</var>.json.gz.

Bạn có thể xem dữ liệu thuộc tính bản dựng gốc ở gần đầu trình xem:

Theo dõi thuộc tính bản dựng gốc trong Chrome

Thay đổi về hành vi

Khi sử dụng phiên bản trình bổ trợ này, bạn có thể gặp phải các thay đổi sau về hành vi.

Thư viện gốc đóng gói không nén theo mặc định

Khi bạn xây dựng ứng dụng, theo mặc định, trình bổ trợ hiện sẽ thiết lập extractNativeLibs thành "false". Điều đó nghĩa là các thư viện gốc của bạn được căn chỉnh theo trang và đóng gói không nén. Mặc dù tính năng này làm tăng kích thước tải lên, nhưng người dùng sẽ có được các lợi ích sau:

  • Giảm dung lượng cài đặt ứng dụng vì nền tảng có thể truy cập vào các thư viện gốc trực tiếp từ APK đã cài đặt mà không cần tạo bản sao của thư viện.
  • Giảm kích thước tải xuống vì tệp nén ở Cửa hàng Play thường tốt hơn khi bạn đưa thư viện gốc không nén vào APK hoặc Android App Bundle.

Ngược lại, nếu bạn muốn Trình bổ trợ Android cho Gradle đóng gói các thư viện gốc được nén, hãy đưa nội dung sau vào tệp kê khai của ứng dụng:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Lưu ý: Thuộc tính tệp kê khai extractNativeLibs đã được thay thế bằng tuỳ chọn DSL useLegacyPackaging. Để biết thêm thông tin, hãy xem ghi chú phát hành Sử dụng DSL để đóng gói các thư viện gốc nén.

Phiên bản NDK mặc định

Nếu bạn tải nhiều phiên bản của NDK thì hiện Trình bổ trợ Android cho Gradle sẽ chọn một phiên bản mặc định dùng khi biên dịch các tệp mã nguồn. Trước đây, trình bổ trợ này đã chọn phiên bản đã tải xuống mới nhất của NDK. Sử dụng thuộc tính android.ndkVersion trong tệp build.gradle của mô-đun để ghi đè phiên bản mặc định do trình bổ trợ chọn.

Đơn giản hoá tính năng tạo lớp R

Trình đơn Android cho Gradle đơn giản hoá classpath biên dịch bằng cách chỉ tạo một lớp R cho từng mô-đun thư viện trong dự án và chia sẻ các lớp R đó với các phần phụ thuộc khác của mô-đun. Quá trình tối ưu hoá này sẽ tạo ra các bản dựng nhanh hơn, nhưng bạn cần lưu ý những điều sau:

  • Vì trình biên dịch chia sẻ các lớp R có phần phụ thuộc mô-đun ngược dòng, nên điều quan trọng là mỗi mô-đun trong dự án phải sử dụng một tên gói duy nhất.
  • Chế độ hiển thị lớp R của một thư viện đối với các phần phụ thuộc khác của dự án được xác định bằng cấu hình dùng để đưa thư viện vào dưới dạng phần phụ thuộc. Ví dụ: nếu Thư viện A tích hợp Thư viện B vào dưới dạng phần phụ thuộc "api", thì Thư viện A và các thư viện khác phụ thuộc vào Thư viện A có quyền truy cập vào lớp R của Thư viện B. Tuy nhiên, các thư viện khác có thể không có quyền truy cập vào lớp R của Thư viện B. Nếu Thư viện A sử dụng cấu hình phần phụ thuộc implementation. Để tìm hiểu thêm, hãy đọc bài viết về cấu hình phần phụ thuộc.

Xoá tài nguyên bị thiếu khỏi cấu hình mặc định

Đối với các mô-đun Thư viện, nếu bạn bổ sung một tài nguyên cho ngôn ngữ mà bạn không đưa vào nhóm tài nguyên mặc định (ví dụ: nếu bạn bổ sung hello_world dưới dạng tài nguyên chuỗi trong /values-es/strings.xml nhưng không xác định tài nguyên đó trong /values/strings.xml), thì Trình bổ trợ Android cho Gradle sẽ không còn đưa tài nguyên đó vào khi biên dịch dự án. Sự thay đổi này về hành vi sẽ giúp giảm số trường hợp ngoại lệ Resource Not Found đối với thời gian chạy và cải thiện tốc độ bản dựng.

D8 hiện tuân thủ chính sách giữ lại dữ liệu CLASS dành cho chú giải

Khi biên dịch ứng dụng, D8 hiện tuân thủ việc các chú giải áp dụng chính sách giữ lại dữ liệu CLASS và các chú giải đó sẽ không còn xuất hiện trong thời gian chạy. Hành vi này cũng tồn tại khi thiết lập SDK mục tiêu của ứng dụng thành API cấp 23. Trước đó, SDK đã cho phép truy cập vào các chú giải này trong thời gian chạy khi biên dịch ứng dụng bằng các phiên bản cũ của Trình bổ trợ Android cho Gradle và D8.

Thay đổi khác về hành vi

  • aaptOptions.noCompress không còn phân biệt chữ hoa chữ thường trên bất cứ nền tảng nào (dành cho cả tệp APK lẫn gói) và tuân theo các đường dẫn sử dụng ký tự viết hoa.
  • Theo mặc định, liên kết dữ liệu hiện được gia tăng. Để tìm hiểu thêm, hãy xem nội dung Vấn đề #110061530.

  • Mọi bài kiểm thử đơn vị, bao gồm cả các bài kiểm thử đơn vị Roboelectric, hiện đều có thể lưu vào bộ nhớ đệm. Để tìm hiểu thêm, hãy xem nội dung Vấn đề #115873047.

Sửa lỗi

Phiên bản Trình bổ trợ Android cho Gradle này cung cấp các bản sửa lỗi sau:

  • Hiện chúng tôi đã hỗ trợ các bài kiểm thử đơn vị Robolectric trong những mô-đun thư viện sử dụng tính năng liên kết dữ liệu. Để tìm hiểu thêm, hãy xem nội dung Vấn đề #126775542.
  • Giờ đây, bạn có thể chạy tác vụ connectedAndroidTest trên nhiều mô-đun trong khi bật chế độ thực thi song song của Gradle.

Vấn đề đã biết

Phần này mô tả các vấn đề đã biết tồn tại trong Trình bổ trợ Android cho Gradle 3.6.0.

Hiệu suất tác vụ chạy trên trình tìm lỗi mã nguồn của Android ở mức chậm

Trình tìm lỗi mã nguồn của Android có thể mất thêm nhiều thời gian để hoàn thành một số dự án do sự hồi quy cơ sở hạ tầng phân tích cú pháp, dẫn đến việc tính toán chậm hơn các kiểu suy luận cho lambda trong những cấu trúc mã nhất định.

Vấn đề này được báo cáo là một lỗi trong IDEA và sẽ được khắc phục trong Trình bổ trợ Android cho Gradle 4.0.

Thiếu lớp tệp kê khai {:#agp-missing-manifest}

Nếu ứng dụng của bạn xác định các quyền tuỳ chỉnh trong tệp kê khai, thì Trình bổ trợ Android cho Gradle thường tạo một lớp Manifest.java bổ sung các quyền đó dưới dạng hằng số chuỗi. Trình bổ trợ sẽ đóng gói lớp này cùng với ứng dụng để bạn có thể dễ dàng tham chiếu đến những quyền đó trong thời gian chạy.

Tính năng tạo lớp tệp kê khai bị lỗi trong Trình bổ trợ Android cho Gradle 3.6.0. Nếu tạo ứng dụng bằng phiên bản trình bổ trợ này và ứng dụng tham chiếu đến lớp tệp kê khai, thì bạn có thể thấy ngoại lệ của ClassNotFoundException. Để giải quyết vấn đề này, hãy làm theo một trong những cách sau:

  • Tham chiếu đến các quyền tuỳ chỉnh theo tên đủ điều kiện. Ví dụ: "com.example.myapp.permission.DEADLY_ACTIVITY".

  • Xác định các hằng số của riêng bạn như sau:

                public final class CustomPermissions {
                  public static final class permission {
                    public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
                  }
                }