Tổng quan về Play Feature Delivery

Mô hình phân phát ứng dụng của Google Play sử dụng định dạng Android App Bundle để tạo và phân phát các tệp APK được tối ưu hoá cho cấu hình thiết bị của từng người dùng, nhờ đó, người dùng chỉ cần tải mã và tài nguyên mà họ cần để chạy ứng dụng.

Play Feature Delivery sử dụng các tính năng nâng cao của gói ứng dụng để cho phép một số tính năng cụ thể của ứng dụng được phân phối theo điều kiện hoặc được tải xuống theo yêu cầu. Để làm được việc đó, trước tiên, bạn cần tách riêng những tính năng này khỏi ứng dụng cơ sở thành các mô-đun tính năng.

Cấu hình xây dựng mô-đun tính năng

Khi bạn tạo một mô-đun tính năng mới bằng Android Studio, IDE sẽ áp dụng trình bổ trợ Gradle sau đây cho tệp build.gradle của mô-đun.

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

plugins {
  id 'com.android.dynamic-feature'
}

Nhiều thuộc tính hiện có cho trình bổ trợ ứng dụng chuẩn cũng có cho mô-đun tính năng. Các phần dưới đây mô tả những thuộc tính bạn nên và không nên đưa vào cấu hình xây dựng của mô-đun tính năng.

Thuộc tính không nên đưa vào cấu hình xây dựng mô-đun tính năng

Vì mỗi mô-đun tính năng lại phụ thuộc vào mô-đun cơ sở, nên mô-đun tính năng cũng kế thừa một số cấu hình cụ thể. Vì vậy, bạn nên bỏ các thuộc tính sau trong tệp build.gradle của mô-đun tính năng:

  • Cấu hình ký tên: Gói ứng dụng được ký bằng cấu hình ký tên mà bạn chỉ định trong mô-đun cơ sở.
  • Thuộc tính minifyEnabled: Bạn có thể bật tính năng rút gọn mã cho toàn bộ dự án ứng dụng trên cấu hình xây dựng của mô-đun cơ sở. Vì vậy, bạn nên bỏ thuộc tính này khỏi mô-đun tính năng. Tuy nhiên, bạn có thể chỉ định các quy tắc ProGuard bổ sung cho từng mô-đun tính năng.
  • versionCodeversionName: Khi xây dựng gói ứng dụng, Gradle sử dụng thông tin phiên bản ứng dụng mà mô-đun cơ sở cung cấp. Bạn nên bỏ các thuộc tính này khỏi tệp build.gradle của mô-đun tính năng.

Thiết lập mối quan hệ với mô-đun cơ sở

Khi tạo mô-đun tính năng, Android Studio cho thấy mô-đun tính năng trong mô-đun cơ sở bằng cách thêm thuộc tính android.dynamicFeatures vào tệp build.gradle của mô-đun cơ sở, như trình bày dưới đây:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

Ngoài ra, Android Studio cũng bao gồm mô-đun cơ sở dưới dạng phần phụ thuộc của mô-đun tính năng, như trình bày dưới đây:

// In the feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

Chỉ định quy tắc ProGuard bổ sung

Mặc dù chỉ có cấu hình xây dựng của mô-đun cơ sở mới có thể rút gọn mã cho dự án ứng dụng, nhưng bạn có thể cung cấp các quy tắc ProGuard tuỳ chỉnh cho từng mô-đun tính năng bằng cách sử dụng proguardFiles, như trình bày dưới đây:

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

Xin lưu ý rằng các quy tắc ProGuard này hợp nhất với các quy tắc từ những mô-đun khác (bao gồm cả mô-đun cơ sở) trong thời gian xây dựng. Vì vậy, mặc dù mỗi mô-đun tính năng có thể chỉ định một bộ quy tắc mới, nhưng những quy tắc đó sẽ áp dụng cho tất cả mô-đun trong dự án ứng dụng.

Triển khai ứng dụng

Trong khi phát triển ứng dụng để hỗ trợ mô-đun tính năng, bạn có thể triển khai ứng dụng cho một thiết bị được kết nối như bình thường bằng cách chọn Run (Chạy) > Run (Chạy) trên thanh trình đơn (hoặc bằng cách nhấp vào Run (Chạy) trên thanh công cụ).

Nếu dự án ứng dụng bao gồm một hoặc nhiều mô-đun tính năng, bạn có thể chọn tính năng cần đưa vào khi triển khai ứng dụng bằng cách sửa đổi cấu hình chạy/gỡ lỗi hiện có như sau:

  1. Chọn Run (Chạy) > Edit Configurations (Chỉnh sửa cấu hình) trên thanh trình đơn.
  2. Trên bảng điều khiển bên trái của hộp thoại Cấu hình chạy/gỡ lỗi, hãy chọn cấu hình Ứng dụng Android mà bạn muốn.
  3. Trong phần Dynamic features to deploy (Tính năng động để triển khai) trên thẻ General (Chung), hãy đánh dấu hộp bên cạnh từng mô-đun tính năng bạn muốn đưa vào khi triển khai ứng dụng.
  4. Nhấp vào OK.

Theo mặc định, Android Studio không triển khai ứng dụng bằng cách sử dụng gói ứng dụng để triển khai ứng dụng. Thay vào đó, IDE xây dựng và cài đặt các tệp APK được tối ưu hoá cho tốc độ triển khai trên thiết bị, thay vì kích thước tệp APK. Để định cấu hình Android Studio nhằm xây dựng và triển khai các tệp APK cũng như trải nghiệm tức thì trên một gói ứng dụng, hãy sửa đổi cấu hình chạy/gỡ lỗi.

Sử dụng mô-đun tính năng để phân phối theo phương thức tuỳ chỉnh

Lợi ích độc đáo của mô-đun tính năng là khả năng tuỳ chỉnh cách thức và thời điểm tải nhiều tính năng của ứng dụng xuống thiết bị chạy Android 5.0 (API cấp 21) trở lên. Ví dụ: để giảm kích thước tải xuống ban đầu của ứng dụng, bạn có thể định cấu hình một số tính năng để tải xuống theo nhu cầu hoặc chỉ tải xuống những thiết bị có hỗ trợ một số chức năng nhất định, chẳng hạn như khả năng chụp ảnh hoặc hỗ trợ các tính năng thực tế tăng cường.

Theo mặc định, khi tải ứng dụng lên dưới dạng một gói ứng dụng, bạn sẽ nhận được nội dung tải xuống có mức độ tối ưu hoá cao, nhưng các tuỳ chọn phân phối tính năng nâng cao và có mức độ tuỳ chỉnh cao hơn sẽ đòi hỏi bạn phải định cấu hình bổ sung và mô-đun hoá tính năng của ứng dụng bằng mô-đun tính năng. Tức là mô-đun tính năng cung cấp khối xây dựng để tạo tính năng mô-đun mà bạn có thể định cấu hình để mỗi tính năng được tải xuống khi cần.

Hãy xem xét một ứng dụng cho phép người dùng mua và bán hàng hoá trên trang web thương mại trực tuyến. Bạn có thể mô-đun hoá một cách hợp lý từng chức năng sau đây của ứng dụng thành các mô-đun tính năng riêng biệt:

  • Đăng nhập và tạo tài khoản
  • Duyệt qua trang web thương mại
  • Đăng hàng để bán
  • Xử lý khoản thanh toán

Bảng dưới đây mô tả nhiều tuỳ chọn phân phối có hỗ trợ mô-đun tính năng cũng như cách bạn có thể dùng các tuỳ chọn đó để tối ưu hoá kích thước tải xuống ban đầu của ứng dụng trang web thương mại mẫu.

Tuỳ chọn phân phối Hành vi Trường hợp sử dụng mẫu Bắt đầu
Phân phối khi cài đặt Theo mặc định, mô-đun tính năng không định cấu hình tuỳ chọn phân phối nào ở trên sẽ được tải xuống khi cài đặt ứng dụng. Đây là một hành vi quan trọng vì bạn có thể dần dần sử dụng các tuỳ chọn phân phối nâng cao. Ví dụ: bạn có thể hưởng lợi từ việc mô-đun hoá các tính năng của ứng dụng và chỉ phân phối theo yêu cầu sau khi triển khai đầy đủ nội dung tải xuống theo yêu cầu qua Thư viện Play Feature Delivery.

Ngoài ra, sau này ứng dụng của bạn có thể yêu cầu gỡ cài đặt các tính năng. Vì vậy, nếu cần đến một số tính năng cụ thể khi cài đặt ứng dụng nhưng không phải sau khi cài đặt ứng dụng, thì bạn có thể giảm kích thước cài đặt bằng cách yêu cầu xoá tính năng đó khỏi thiết bị.

Nếu ứng dụng có một số hoạt động đào tạo cụ thể (chẳng hạn như hướng dẫn trực quan về cách mua và bán các mặt hàng trên trang web thương mại), thì bạn có thể cung cấp cả tính năng đó khi cài đặt ứng dụng theo mặc định.

Tuy nhiên, để giảm kích thước cài đặt của ứng dụng, ứng dụng có thể yêu cầu xoá tính năng này sau khi người dùng hoàn tất quá trình đào tạo.

Mô-đun hoá ứng dụng bằng các mô-đun tính năng không định cấu hình tuỳ chọn phân phối nâng cao nào.

Để tìm hiểu cách xoá một số mô-đun tính năng mà người dùng có thể không cần nữa để giảm kích thước cài đặt của ứng dụng, hãy đọc nội dung Quản lý mô-đun đã cài đặt.

Phân phối theo yêu cầu Cho phép ứng dụng yêu cầu và tải mô-đun tính năng xuống khi cần. Nếu chỉ 20% trong số những người sử dụng ứng dụng trang web thương mại đăng các mặt hàng lên để bán, thì có một chiến lược hữu ích để giảm kích thước tải xuống ban đầu cho phần lớn người dùng; đó là cung cấp chức năng chụp ảnh (bao gồm cả nội dung mô tả mặt hàng) và đăng mặt hàng để bán dưới dạng nội dung tải xuống theo yêu cầu. Tức là bạn có thể định cấu hình mô-đun tính năng cho chức năng bán hàng của ứng dụng và chỉ tải xuống khi người dùng thể hiện mối quan tâm đến việc đăng hàng bán trên trang web thương mại đó.

Ngoài ra, nếu người dùng không còn bán hàng sau một khoảng thời gian cụ thể, thì ứng dụng có thể giảm kích thước cài đặt bằng cách yêu cầu gỡ cài đặt tính năng này.

Tạo mô-đun tính năng và định cấu hình tính năng phân phối theo yêu cầu. Sau đó, ứng dụng của bạn có thể sử dụng Thư viện Play Feature Delivery để yêu cầu tải xuống mô-đun theo yêu cầu.
Phân phối có điều kiện Cho phép bạn chỉ định một số yêu cầu đối với thiết bị của người dùng, chẳng hạn như tính năng phần cứng, ngôn ngữ và cấp API tối thiểu để xác định xem một tính năng được mô-đun hoá có được tải xuống tại thời điểm cài đặt ứng dụng hay không. Nếu ứng dụng trang web thương mại đó được phân phối trên toàn cầu, thì có thể bạn cần hỗ trợ các phương thức thanh toán chỉ phổ biến ở một số khu vực hoặc địa phương. Để giảm kích thước tải xuống của ứng dụng ban đầu, bạn có thể tạo các mô-đun tính năng riêng biệt để xử lý một số loại phương thức thanh toán cụ thể và cài đặt những mô-đun này theo điều kiện trên thiết bị của người dùng dựa trên ngôn ngữ/quốc gia họ đăng ký. Tạo mô-đun tính năng và định cấu hình tính năng phân phối có điều kiện.
Phân phối tức thì Google Play Instant cho phép người dùng tương tác với ứng dụng của bạn mà không cần cài đặt ứng dụng trên thiết bị. Thay vào đó, họ có thể trải nghiệm ứng dụng của bạn thông qua nút "Try now" (Thử ngay) trên Cửa hàng Google Play hoặc qua URL bạn tạo. Hình thức phân phối nội dung này giúp bạn dễ dàng tăng mức độ tương tác với ứng dụng.

Nhờ tính năng phân phối tức thì, bạn có thể sử dụng Google Play Instant để cho phép người dùng trải nghiệm ngay một số tính năng nhất định của ứng dụng mà không cần cài đặt.

Hãy xem xét một trò chơi cung cấp một số cấp độ đầu tiên của trò chơi đó trong một mô-đun tính năng gọn nhẹ. Bạn có thể hỗ trợ phiên bản tức thì của mô-đun đó để người dùng có thể trải nghiệm trò chơi ngay lập tức thông qua một đường liên kết URL hoặc nút "Try now" (Thử ngay) mà không cần cài đặt ứng dụng. Tạo mô-đun tính năng và định cấu hình tính năng phân phối tức thì. Sau đó, ứng dụng của bạn có thể sử dụng Thư viện Play Feature Delivery để yêu cầu tải xuống mô-đun theo yêu cầu.

Lưu ý việc mô-đun hoá tính năng của ứng dụng bằng mô-đun tính năng chỉ là bước đầu tiên. Để hỗ trợ Google Play Instant, kích thước tải xuống của mô-đun cơ sở của ứng dụng và tính năng hỗ trợ ứng dụng tức thì phải đáp ứng các quy định hạn chế nghiêm ngặt về kích thước. Để tìm hiểu thêm, hãy đọc bài viết Cung cấp trải nghiệm tức thì bằng cách giảm kích thước ứng dụng hoặc trò chơi.

Xây dựng URI cho tài nguyên

Nếu bạn muốn dùng URI để truy cập tài nguyên lưu trữ trong mô-đun tính năng, thì sau đây là cách tạo URI tài nguyên cho mô-đun tính năng bằng Uri.Builder():

Kotlin

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

Java

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

Từng phần của đường dẫn đến tài nguyên được xây dựng trong khi chạy, đảm bảo rằng không gian tên chính xác được tạo sau khi tệp APK phân tách được tải.

Hãy xem một ví dụ về cách tạo URI, giả sử bạn có một ứng dụng và mô-đun tính năng với các tên sau đây:

  • Tên gói ứng dụng: com.example.my_app_package
  • Tên gói tài nguyên của tính năng: com.example.my_app_package.my_dynamic_feature

Nếu resId trong đoạn mã ở trên tham chiếu đến một tài nguyên tệp thô có tên "my_video" trong mô-đun tính năng, thì mã Uri.Builder() ở trên sẽ đưa ra kết quả như sau:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

Sau đó, ứng dụng của bạn có thể sử dụng URI này để truy cập tài nguyên đó của mô-đun tính năng.

Để xác thực đường dẫn trong URI, bạn có thể sử dụng APK Analyzer (Công cụ phân tích APK) để kiểm tra tệp APK mô-đun tính năng và xác định tên gói:

Ảnh chụp màn hình APK Analyzer (Công cụ phân tích APK) đang kiểm tra nội dung của tệp tài nguyên được biên dịch.
Hình 1. Sử dụng APK Analyzer (Công cụ phân tích APK) để kiểm tra tên gói trong tệp tài nguyên được biên dịch.

Những điểm cần lưu ý về mô-đun tính năng

Các mô-đun tính năng có thể giúp bạn cải thiện tốc độ xây dựng và tốc độ kỹ thuật, đồng thời điều chỉnh trên quy mô lớn hoạt động phân phối các tính năng của ứng dụng để giảm kích thước ứng dụng. Tuy nhiên, có một số hạn chế và trường hợp đặc biệt cần lưu ý khi sử dụng mô-đun tính năng:

  • Việc cài đặt 50 mô-đun tính năng trở lên trên một thiết bị, thông qua phương thức phân phối có điều kiện hoặc theo yêu cầu, có thể dẫn đến các vấn đề về hiệu suất. Các mô-đun phân phối tại thời điểm cài đặt (không được định cấu hình là có thể xoá) sẽ tự động được đưa vào mô-đun cơ sở và chỉ được tính là một mô-đun tính năng trên mỗi thiết bị.
  • Giới hạn số lượng mô-đun được cấu hình là có thể xoá cho hình thức phân phối tại thời điểm cài đặt trong khoảng 10 trở xuống. Nếu không, thời gian tải xuống và cài đặt của ứng dụng có thể tăng lên.
  • Chỉ thiết bị chạy Android 5.0 (API cấp 21) trở lên mới hỗ trợ hoạt động tải xuống và cài đặt tính năng theo yêu cầu. Để cung cấp tính năng cho các phiên bản Android trước đó, hãy bật tính năng Fusing (Hợp nhất) khi bạn tạo một mô-đun tính năng.
  • Bật SplitCompat để ứng dụng có quyền truy cập vào các mô-đun tính năng đã tải xuống được phân phối theo yêu cầu.
  • Mô-đun tính năng không được chỉ định hoạt động trong tệp kê khai khi android:exported được đặt thành true. Lý do là không có gì đảm bảo rằng thiết bị đã tải mô-đun tính năng xuống khi một ứng dụng khác cố gắng khởi chạy hoạt động đó. Ngoài ra, ứng dụng phải xác nhận rằng một tính năng đã được tải xuống trước khi cố gắng truy cập vào mã và tài nguyên của tính năng đó. Để tìm hiểu thêm, hãy đọc nội dung Quản lý mô-đun đã cài đặt.
  • Vì Play Feature Delivery yêu cầu bạn phải phát hành ứng dụng bằng gói ứng dụng, hãy đảm bảo rằng bạn đã nắm được các vấn đề đã biết liên quan đến gói ứng dụng.

Tài liệu tham khảo về tệp kê khai mô-đun tính năng

Khi tạo một mô-đun tính năng mới bằng Android Studio, IDE sẽ bao gồm hầu hết thuộc tính tệp kê khai mà mô-đun này đòi hỏi phải hoạt động như một mô-đun tính năng. Ngoài ra, có một số thuộc tính được hệ thống xây dựng chèn vào tại thời điểm biên dịch. Vì vậy, bạn không cần chỉ định hoặc tự sửa đổi các thuộc tính đó. Bảng sau đây mô tả các thuộc tính tệp kê khai quan trọng đối với mô-đun tính năng.

Thuộc tính Mô tả
<manifest Đây là khối <manifest> điển hình.
xmlns:dist="http://schemas.android.com/apk/distribution" Chỉ định một không gian tên XML dist: mới được mô tả kỹ hơn ở phần dưới đây.
split="split_name" Khi tạo gói ứng dụng, Android Studio cung cấp sẵn thuộc tính này cho bạn. Vì vậy, bạn không nên tự thêm hoặc sửa đổi thuộc tính này.

Xác định tên của mô-đun mà ứng dụng chỉ định khi yêu cầu một mô-đun theo yêu cầu qua Thư viện Play Feature Delivery.

Cách Gradle xác định giá trị cho thuộc tính này:

Theo mặc định, khi bạn tạo một mô-đun tính năng bằng Android Studio, IDE sẽ sử dụng tên mà bạn chỉ định làm Module name (Tên mô-đun) để xác định mô-đun đó là dự án phụ Gradle trong Tệp cài đặt Gradle.

Khi bạn tạo gói ứng dụng, Gradle sẽ sử dụng phần tử cuối cùng của đường dẫn dự án phụ để chèn thuộc tính tệp kê khai này vào tệp kê khai của mô-đun. Ví dụ: nếu bạn tạo một mô-đun tính năng mới trong thư mục MyAppProject/features/ và chỉ định "dynamic_feature1" làm Module name (Tên mô-đun), thì IDE sẽ thêm ':features:dynamic_feature1' làm dự án phụ trong tệp settings.gradle. Khi tạo gói ứng dụng, Gradle sẽ chèn <manifest split="dynamic_feature1"> vào tệp kê khai của mô-đun.

android:isFeatureSplit="true | false"> Khi tạo gói ứng dụng, Android Studio cung cấp sẵn thuộc tính này cho bạn. Vì vậy, bạn không nên thêm hoặc sửa đổi thuộc tính này theo cách thủ công.

Chỉ định rằng mô-đun này là mô-đun tính năng. Tệp kê khai trong mô-đun cơ sở và tệp APK cấu hình sẽ bỏ thuộc tính này hoặc đặt thành false.

<dist:module Xác định các thuộc tính sẽ xác định cách đóng gói và phân phối mô-đun dưới dạng tệp APK.
dist:instant="true | false" Chỉ định việc mô-đun có được cung cấp qua Google Play Instant dưới dạng trải nghiệm tức thì hay không.

Nếu ứng dụng có một hoặc nhiều mô-đun tính năng hỗ trợ phiên bản tức thì, thì bạn cũng phải hỗ trợ phiên bản tức thì cho mô-đun cơ sở. Khi sử dụng Android Studio 3.5 trở lên, IDE sẽ thực hiện việc này cho bạn khi bạn tạo mô-đun tính năng hỗ trợ phiên bản tức thì.

Bạn không thể đặt phần tử XML này thành true trong khi cũng đặt <dist:on-demand/>. Tuy nhiên, bạn vẫn có thể yêu cầu tải các mô-đun tính năng hỗ trợ phiên bản tức thì theo yêu cầu xuống dưới dạng trải nghiệm tức thì qua Thư viện Play Feature Delivery. Khi người dùng tải và cài đặt ứng dụng, thì theo mặc định, thiết bị của họ sẽ tải và cài đặt các mô-đun tính năng hỗ trợ phiên bản tức thì cùng với tệp APK cơ sở.

dist:title="@string/feature_name"> Chỉ định một tiêu đề mà người dùng nhìn thấy cho mô-đun. Ví dụ: thiết bị có thể cho thấy tiêu đề này khi yêu cầu xác nhận tải xuống.

Bạn cần thêm tài nguyên chuỗi cho tiêu đề này vào tệp module_root/src/source_set/res/values/strings.xml của mô-đun cơ sở.

<dist:fusing dist:include="true | false" /> Chỉ định việc có đưa mô-đun vào nhiều tệp APK nhắm đến thiết bị chạy Android 4.4 (API cấp 20) trở xuống hay không.

Ngoài ra, khi bạn sử dụng bundletool để tạo tệp APK qua một gói ứng dụng, chỉ các mô-đun tính năng đặt thuộc tính này thành true mới được đưa vào tệp APK chung – đây là tệp APK nguyên khối chứa mã và tài nguyên cho tất cả cấu hình thiết bị mà ứng dụng của bạn hỗ trợ.

<dist:delivery> Đóng gói các tuỳ chọn tuỳ chỉnh tính năng phân phối mô-đun, như trình bày dưới đây. Xin lưu ý rằng mỗi mô-đun tính năng chỉ được định cấu hình một loại trong số các tuỳ chọn phân phối tuỳ chỉnh này.
<dist:install-time> Chỉ định việc mô-đun có được cung cấp khi cài đặt hay không. Đây là hành vi mặc định cho các mô-đun tính năng không chỉ định một loại tuỳ chọn phân phối tuỳ chỉnh khác.

Để tìm hiểu thêm về tài nguyên tải xuống khi cài đặt, hãy đọc nội dung Định cấu hình chế độ phân phối khi cài đặt.

Nút (node) này cũng có thể chỉ định những điều kiện giới hạn mô-đun cho những thiết bị đáp ứng một số yêu cầu cụ thể, chẳng hạn như tính năng của thiết bị, quốc gia của người dùng hoặc cấp API tối thiểu. Để tìm hiểu thêm, hãy đọc nội dung Định cấu hình tính năng phân phối có điều kiện.

<dist:removable dist:value="true | false" />

Khi bạn không đặt hoặc đặt thành false, bundletool sẽ hợp nhất các mô-đun tại thời điểm cài đặt vào mô-đun cơ sở khi tạo tệp APK phân tách trong gói đó. Vì sẽ có ít tệp APK phân tách hơn do quá trình hợp nhất, nên chế độ cài đặt này có thể cải thiện hiệu suất của ứng dụng.

Khi bạn đặt removable thành true: các mô-đun phân phối khi cài đặt sẽ không được hợp nhất vào mô-đun cơ sở. Hãy đặt thành true nếu sau này bạn muốn gỡ cài đặt mô-đun. Tuy nhiên, việc định cấu hình quá nhiều mô-đun là có thể xoá có thể khiến thời gian cài đặt ứng dụng tăng lên.

Giá trị mặc định là false. Bạn chỉ cần đặt giá trị này trong tệp kê khai nếu muốn tắt tính năng hợp nhất cho một mô-đun tính năng.

Lưu ý: Bạn chỉ dùng được tính năng này khi sử dụng Trình bổ trợ Android cho Gradle 4.2 hoặc khi sử dụng bundletool v1.0 qua dòng lệnh.

</dist:install-time>  
<dist:on-demand /> Chỉ định việc mô-đun có được cung cấp dưới dạng nội dung tải xuống theo yêu cầu hay không. Tức là chưa có mô-đun khi cài đặt nhưng ứng dụng có thể yêu cầu tải xuống sau.

Để tìm hiểu thêm về tài nguyên tải xuống theo yêu cầu, hãy đọc nội dung Định cấu hình tính năng phân phối theo yêu cầu.

</dist:delivery>
</dist:module>
<application
android:hasCode="true | false">
...
</application>
Nếu mô-đun tính năng không tạo tệp DEX – tức là mô-đun không chứa mã mà sau đó được biên dịch thành định dạng tệp DEX – bạn phải làm như sau (nếu không, bạn có thể gặp lỗi thời gian chạy):
  1. Đặt android:hasCode thành "false" trong tệp kê khai của mô-đun tính năng.
  2. Thêm mã sau vào tệp kê khai của mô-đun cơ sở:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</manifest>

Tài nguyên khác

Để tìm hiểu thêm về cách sử dụng mô-đun tính năng, hãy thử tham khảo các tài nguyên sau đây.

Bài đăng trên blog

Video

Điều khoản dịch vụ và an toàn dữ liệu

Bằng cách truy cập hoặc sử dụng Thư viện Play Feature Delivery bạn đồng ý với Điều khoản dịch vụ của Bộ phát triển phần mềm Play Core. Vui lòng đọc và hiểu tất cả điều khoản và chính sách hiện hành trước khi truy cập thư viện.

An toàn dữ liệu

Thư viện Play Core mang đến giao diện trong thời gian chạy cho ứng dụng trên Cửa hàng Google Play. Do đó, khi bạn sử dụng Play Core trong ứng dụng, Cửa hàng Play sẽ chạy các quy trình riêng, trong đó có hoạt động xử lý dữ liệu chịu sự điều chỉnh của Điều khoản dịch vụ của Google Play. Thông tin dưới đây mô tả cách thư viện Play Core xử lý dữ liệu để giải quyết các yêu cầu cụ thể của ứng dụng.

API ngôn ngữ bổ sung

Dữ liệu thu được về mức sử dụng Danh sách các ngôn ngữ đã cài đặt
Mục đích của việc thu thập dữ liệu Dữ liệu đã thu thập được dùng để cung cấp các phiên bản ngôn ngữ khác nhau của ứng dụng và để giữ lại các ngôn ngữ đã cài đặt sau khi cập nhật ứng dụng.
Mã hoá dữ liệu Dữ liệu đã được mã hoá
Chia sẻ dữ liệu Dữ liệu không được chuyển cho bất kỳ bên thứ ba nào.
Xoá dữ liệu Dữ liệu sẽ bị xoá sau một khoảng thời gian lưu giữ cố định.

Play Feature Delivery

Dữ liệu thu được về mức sử dụng Siêu dữ liệu của thiết bị
Phiên bản ứng dụng
Mục đích của việc thu thập dữ liệu Dữ liệu thu thập được dùng để phân phối mô-đun phù hợp cho thiết bị và để bảo toàn các mô-đun đã cài đặt sau khi cập nhật, sao lưu và khôi phục.
Mã hoá dữ liệu Dữ liệu đã được mã hoá
Chia sẻ dữ liệu Dữ liệu không được chuyển cho bất kỳ bên thứ ba nào.
Xoá dữ liệu Dữ liệu sẽ bị xoá sau một khoảng thời gian lưu giữ cố định.

Mặc dù chúng tôi hướng đến sự minh bạch tối đa, nhưng bạn hoàn toàn chịu trách nhiệm về việc phản hồi biểu mẫu mục an toàn dữ liệu của Google Play liên quan đến hoạt động thu thập và chia sẻ dữ liệu người dùng trên ứng dụng của bạn cùng với các phương pháp bảo mật.