Play cho AI trên thiết bị (thử nghiệm)

Giới thiệu

Play for On-device AI mang lại lợi ích của Android App Bundle và dịch vụ phân phối của Google Play cho hoạt động phân phối mô hình ML tuỳ chỉnh. Nhờ đó, bạn có thể cải thiện hiệu suất mô hình mà không cần tốn thêm chi phí và giảm độ phức tạp của hệ sinh thái thiết bị. Play Asset Delivery cho phép bạn xuất bản một cấu phần phần mềm duy nhất lên Play, chứa mã, tài sản và các mô hình học máy của bạn, đồng thời chọn trong số nhiều chế độ phân phối và lựa chọn nhắm mục tiêu.

Lợi ích

  • Tải một cấu phần phần mềm xuất bản lên Google Play và uỷ quyền cho Play lưu trữ, phân phối, cập nhật và nhắm đến mục tiêu mà không mất thêm phí.
  • Phân phối các mô hình học máy của bạn tại thời điểm cài đặt, tiếp nối nhanh hoặc theo yêu cầu.
    • Tính năng phân phối tại thời gian cài đặt có thể đảm bảo rằng một mô hình rất lớn sẽ xuất hiện khi ứng dụng của bạn được mở. Mô hình của bạn sẽ được cài đặt dưới dạng APK.
    • Quá trình phân phối tiếp nối nhanh sẽ tự động diễn ra ở chế độ nền sau khi ứng dụng của bạn được cài đặt. Người dùng có thể mở ứng dụng của bạn trước khi mô hình được tải xuống hoàn toàn. Mô hình của bạn sẽ được tải xuống bộ nhớ trong của ứng dụng.
    • Tính năng phân phối theo yêu cầu cho phép bạn yêu cầu mô hình tại thời gian chạy. Tính năng này hữu ích nếu mô hình chỉ cần thiết cho một số quy trình của người dùng. Mô hình của bạn sẽ được tải xuống bộ nhớ trong của ứng dụng.
  • Phân phối các biến thể của mô hình học máy nhắm đến các thiết bị cụ thể dựa trên kiểu thiết bị, thuộc tính hệ thống hoặc RAM.
  • Giảm thiểu và tối ưu hoá các bản cập nhật ứng dụng bằng tính năng vá tự động của Play. Điều này có nghĩa là bạn chỉ cần tải xuống những điểm khác biệt trong các tệp.

Những yếu tố nên cân nhắc

  • Bằng việc sử dụng Play cho AI trên thiết bị, bạn đồng ý với các điều khoản trong Thoả thuận phân phối dành cho nhà phát triển trên Google PlayĐiều khoản dịch vụ của Bộ phát triển phần mềm Play Core.
  • Các mô hình do Play tải xuống cho AI trên thiết bị chỉ được dùng cho các ứng dụng của bạn. Không được cung cấp các mô hình cho các ứng dụng khác.
  • Mỗi gói AI có thể có kích thước tối đa là 1,5 GB, dựa trên kích thước tải xuống đã nén của gói. Kích thước ứng dụng tích luỹ tối đa của mọi phiên bản ứng dụng do bạn tạo từ gói ứng dụng là 4 GB.
  • Ứng dụng có kích thước lớn hơn 1 GB phải đặt Cấp độ SDK tối thiểu thành 21 trở lên.

Cách sử dụng Play cho AI trên thiết bị

Play cho AI trên thiết bị sử dụng các gói AI. Bạn đóng gói các mô hình tuỳ chỉnh đã sẵn sàng để phân phối trong các gói AI trong gói ứng dụng. Bạn có thể chọn phân phối gói AI tại thời điểm cài đặt, tiếp nối nhanh hoặc theo yêu cầu.

Bằng cách đóng gói các gói AI với gói ứng dụng, bạn có thể sử dụng tất cả các công cụ phát hành và kiểm thử hiện có của Play, chẳng hạn như kênh kiểm thử và quy trình phát hành theo giai đoạn để quản lý việc phân phối ứng dụng bằng các mô hình tuỳ chỉnh.

Các gói AI được cập nhật cùng với tệp nhị phân của ứng dụng. Nếu bản phát hành ứng dụng mới của bạn không thay đổi gói AI, thì quy trình vá tự động của Play sẽ đảm bảo người dùng không phải tải lại gói đó. Play sẽ chỉ tải những nội dung đã thay đổi xuống khi cập nhật ứng dụng.

Gói AI chỉ chứa các mô hình. Bạn không được phép sử dụng thư viện Java/Kotlin và thư viện gốc. Nếu bạn cần phân phối các thư viện hoặc mã để chạy mô hình học máy, hãy di chuyển thư viện hoặc mã đó vào mô-đun cơ sở hoặc mô-đun tính năng. Bạn có thể định cấu hình mô-đun tính năng để mô-đun này có cùng chế độ cài đặt tải xuống và nhắm đến mục tiêu như gói AI.

Sử dụng LiteRT và MediaPipe với các gói AI

Bạn có thể sử dụng LiteRT và MediaPipe với các gói AI. Đóng gói mô hình của bạn trong một gói AI rồi truy cập vào mô hình đó theo hướng dẫn dành cho các gói khi cài đặt hoặc cho các gói tiếp nối nhanh và theo yêu cầu.

Tài liệu đọc thêm:

Bắt đầu sử dụng gói AI

Ở cấp độ cao, dưới đây là cách bạn có thể bắt đầu sử dụng Play cho AI trên thiết bị:

  1. Đóng gói các mô hình của bạn thành các gói AI trong Android App Bundle và chỉ định cách phân phối các gói AI.
  2. [Không bắt buộc] Nếu muốn phân phối các mô hình khác nhau cho các thiết bị khác nhau, bạn có thể định cấu hình chế độ nhắm mục tiêu theo thiết bị cho các gói AI. Ví dụ: bạn có thể phân phối gói AI A cho một mẫu thiết bị cụ thể, gói AI B cho các thiết bị có RAM tối thiểu 6 GB và tất cả các thiết bị khác có thể không nhận được mô hình nào.
  3. [Không bắt buộc] Nếu bạn đang sử dụng tính năng phân phối theo yêu cầu hoặc phân phối tiếp nối nhanh, hãy tích hợp Thư viện Play AI Delivery vào ứng dụng để tải các gói AI xuống khi cần.
  4. Kiểm thử và phát hành gói ứng dụng lên Google Play.

Kiểm tra phiên bản trình bổ trợ Android cho Gradle

Để sử dụng các gói AI, hãy đảm bảo rằng phiên bản Trình bổ trợ Android cho Gradle (AGP) của bạn tối thiểu là 8.8. Phiên bản này được đóng gói cùng với Android Studio Ladybug 2.

Trích xuất mô hình của bạn vào một gói AI

Bạn không cần Android Studio để thực hiện các bước sau.

  1. Trong thư mục cấp cao nhất của dự án, hãy tạo một thư mục cho gói AI. Tên thư mục này được dùng làm tên gói AI. Tên gói AI phải bắt đầu bằng một chữ cái và chỉ được chứa chữ cái, số và dấu gạch dưới.
  2. Trong thư mục gói AI, hãy tạo tệp build.gradle rồi thêm mã sau đây. Hãy nhớ chỉ định tên của gói AI và chỉ một loại hình phân phối:

    // In the AI pack's build.gradle file:
    plugins {
      id 'com.android.ai-pack'
    }
    
    aiPack {
        packName = "ai-pack-name" // Directory name for the AI pack
        dynamicDelivery {
            deliveryType = "[ install-time | fast-follow | on-demand ]"
        }
    }
    
  3. Trong tệp build.gradle của ứng dụng thuộc dự án, hãy thêm tên của từng gói AI vào dự án như trình bày dưới đây:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. Trong tệp settings.gradle của dự án, hãy đưa tất cả gói AI vào dự án như trình bày dưới đây:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. Trong gói AI, hãy tạo một thư mục src/main/assets/.

  6. Đặt các mô hình của bạn vào thư mục src/main/assets. Ở đây, bạn cũng có thể tạo thư mục con. Lúc này, cấu trúc thư mục cho ứng dụng sẽ có dạng như sau:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. Thêm mã để tải và chạy các mô hình của bạn. Cách thực hiện việc này sẽ phụ thuộc vào chế độ phân phối của gói AI. Hãy xem hướng dẫn về thời gian cài đặttiếp nối nhanh/theo yêu cầu bên dưới.

  8. [Không bắt buộc] Định cấu hình chế độ nhắm mục tiêu theo thiết bị để phân phối các mô hình khác nhau đến các thiết bị khác nhau.

  9. Xây dựng Android App Bundle bằng Gradle. Vào lúc này trong gói ứng dụng đã tạo, thư mục cấp cơ sở gồm những phần tử sau:

    • ai-pack-name/manifest/AndroidManifest.xml: Định cấu hình chế độ phân phối và giá trị nhận dạng của gói AI
    • ai-pack-name/assets/your-model-directories: Thư mục chứa tất cả các tài sản được phân phối trong gói AI

    Gradle sẽ tạo tệp kê khai cho mỗi gói AI và xuất ra thư mục assets/ cho bạn.

Định cấu hình phân phối tại thời điểm cài đặt

Các gói AI được định cấu hình là thời gian cài đặt sẽ có sẵn ngay khi khởi chạy ứng dụng. Sử dụng Java AssetManager API để truy cập vào các gói AI được phân phát ở chế độ này:

import android.content.res.AssetManager;
...
Context context = createPackageContext("com.example.app", 0);
AssetManager assetManager = context.getAssets();
InputStream is = assetManager.open("model-name");

Định cấu hình chế độ phân phối tiếp nối nhanh và theo yêu cầu

Để tải các gói AI xuống bằng tính năng phân phối tiếp nối nhanh hoặc theo yêu cầu, hãy sử dụng Thư viện Play AI Delivery.

Khai báo phần phụ thuộc vào Thư viện Play AI Delivery

Trong tệp build.gradle của ứng dụng, hãy khai báo một phần phụ thuộc vào Thư viện phân phối AI của Play:

dependencies {
  ...
  implementation "com.google.android.play:ai-delivery:0.1.1-alpha01"
}

Kiểm tra trạng thái

Mỗi gói AI được lưu trữ trong một thư mục riêng ở bộ nhớ trong của ứng dụng. Sử dụng phương thức getPackLocation() để xác định thư mục gốc của gói AI. Phương thức này trả về các giá trị sau:

Giá trị trả về Trạng thái
Một đối tượng AiPackLocation hợp lệ Thư mục gốc của gói AI đã sẵn sàng để truy cập ngay tại assetsPath()
null Không có gói AI hoặc các gói AI không xác định

Xem thông tin tải xuống về gói AI

Sử dụng phương thức
getPackStates() để xác định kích thước của tệp tải xuống và liệu gói đã được tải xuống hay chưa.

Task<AiPackStates> getPackStates(List<String> packNames)

getPackStates() là một phương thức không đồng bộ trả về Task<AiPackStates>. Phương thức packStates() của đối tượng AiPackStates trả về Map<String, AiPackState>. Bản đồ này chứa trạng thái của mỗi gói AI được yêu cầu và được xác định theo tên:

Map<String, AiPackState> AiPackStates#packStates()

Yêu cầu cuối cùng sẽ có dạng như sau:

final String aiPackName = "myAiPackName";

aiPackManager
    .getPackStates(Collections.singletonList(aiPackName))
    .addOnCompleteListener(new OnCompleteListener<AiPackStates>() {
        @Override
        public void onComplete(Task<AiPackStates> task) {
            AiPackStates aiPackStates;
            try {
                aiPackStates = task.getResult();
                AiPackState aiPackState =
                    aiPackStates.packStates().get(aiPackName);
            } catch (RuntimeExecutionException e) {
                Log.d("MainActivity", e.getMessage());
                return;
            });

Các phương thức AiPackState sau đây cho biết kích thước của gói AI, số lượng đã tải xuống từ trước đến nay (nếu được yêu cầu) và số lượng đã chuyển vào ứng dụng:

Để biết trạng thái của một gói AI, hãy sử dụng phương thức status(). Phương thức này sẽ trả về trạng thái dưới dạng số nguyên tương ứng với một trường không đổi trong lớp AiPackStatus. Gói AI chưa được cài đặt sẽ có trạng thái AiPackStatus.NOT_INSTALLED.

Nếu một yêu cầu không thành công, hãy sử dụng phương thức errorCode(). Phương thức này trả về giá trị tương ứng với một trường không đổi trong lớp AiPackErrorCode.

Cài đặt

Hãy sử dụng phương thức fetch() để tải gói AI xuống trong lần đầu tiên hoặc gọi để hoàn tất quá trình cập nhật một gói AI:

Task<AiPackStates> fetch(List<String> packNames)

Phương thức này trả về một đối tượng AiPackStates chứa danh sách gói, kích thước và trạng thái tải xuống ban đầu của các gói đó. Nếu một gói AI được yêu cầu qua fetch() và đang trong quá trình tải xuống, thì hệ thống sẽ trả về trạng thái tải xuống và không bắt đầu thêm quá trình tải xuống nào.

Theo dõi trạng thái tải xuống

Bạn nên triển khai một AiPackStateUpdateListener để theo dõi tiến trình cài đặt các gói AI. Thông tin cập nhật trạng thái cho từng gói được chia nhỏ để hỗ trợ việc theo dõi trạng thái của từng gói AI. Bạn có thể bắt đầu sử dụng các gói AI hiện có trước khi tất cả các nội dung tải xuống khác theo yêu cầu của bạn hoàn tất.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
Tài nguyên tải xuống kích thước lớn

Nếu tài nguyên tải xuống lớn hơn 200 MB và người dùng đang không sử dụng Wi-Fi, thì quá trình tải xuống sẽ chỉ bắt đầu khi người dùng thể hiện rõ sự đồng ý rằng họ sẽ tiếp tục tải xuống qua kết nối dữ liệu di động. Tương tự, nếu tài nguyên tải xuống có kích thước lớn và người dùng mất Wi-Fi, thì quá trình tải xuống sẽ tạm dừng và cần có sự đồng ý rõ ràng của người dùng để tiếp tục sử dụng kết nối dữ liệu di động. Gói bị tạm dừng có trạng thái là WAITING_FOR_WIFI. Để kích hoạt luồng giao diện người dùng nhắc người dùng đồng ý, hãy sử dụng phương thức showConfirmationDialog().

Hãy lưu ý rằng nếu ứng dụng không gọi phương thức này, thì quá trình tải xuống sẽ tạm dừng và tự động tiếp tục lại khi người dùng có kết nối Wi-Fi.

Yêu cầu người dùng xác nhận

Nếu một gói có trạng thái REQUIRES_USER_CONFIRMATION, thì quá trình tải xuống sẽ không tiếp tục cho đến khi người dùng chấp nhận hộp thoại xuất hiện cùng với showConfirmationDialog(). Trạng thái này có thể xảy ra khi Play không nhận dạng được ứng dụng, chẳng hạn như nếu ứng dụng được tải lên thiết bị mà không qua Play. Xin lưu ý rằng việc gọi showConfirmationDialog() trong trường hợp này sẽ khiến ứng dụng được cập nhật. Sau khi cập nhật, bạn sẽ cần yêu cầu lại các gói AI.

Sau đây là ví dụ về cách triển khai trình nghe:

AiPackStateUpdateListener aiPackStateUpdateListener = new AiPackStateUpdateListener() {
    private final ActivityResultLauncher<IntentSenderRequest> activityResultLauncher =
      registerForActivityResult(
          new ActivityResultContracts.StartIntentSenderForResult(),
          new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
              if (result.getResultCode() == RESULT_OK) {
                Log.d(TAG, "Confirmation dialog has been accepted.");
              } else if (result.getResultCode() == RESULT_CANCELED) {
                Log.d(TAG, "Confirmation dialog has been denied by the user.");
              }
            }
          });

    @Override
    public void onStateUpdate(AiPackState aiPackState) {
      switch (aiPackState.status()) {
        case AiPackStatus.PENDING:
          Log.i(TAG, "Pending");
          break;

        case AiPackStatus.DOWNLOADING:
          long downloaded = aiPackState.bytesDownloaded();
          long totalSize = aiPackState.totalBytesToDownload();
          double percent = 100.0 * downloaded / totalSize;

          Log.i(TAG, "PercentDone=" + String.format("%.2f", percent));
          break;

        case AiPackStatus.TRANSFERRING:
          // 100% downloaded and assets are being transferred.
          // Notify user to wait until transfer is complete.
          break;

        case AiPackStatus.COMPLETED:
          // AI pack is ready to use. Run the model.
          break;

        case AiPackStatus.FAILED:
          // Request failed. Notify user.
          Log.e(TAG, aiPackState.errorCode());
          break;

        case AiPackStatus.CANCELED:
          // Request canceled. Notify user.
          break;

        case AiPackStatus.WAITING_FOR_WIFI:
        case AiPackStatus.REQUIRES_USER_CONFIRMATION:
          if (!confirmationDialogShown) {
            aiPackManager.showConfirmationDialog(activityResultLauncher);
            confirmationDialogShown = true;
          }
          break;

        case AiPackStatus.NOT_INSTALLED:
          // AI pack is not downloaded yet.
          break;
        case AiPackStatus.UNKNOWN:
          Log.wtf(TAG, "AI pack status unknown")
          break;
      }
    }
}

Ngoài ra, bạn có thể sử dụng phương thức getPackStates() để biết trạng thái của các tài nguyên đã tải xuống hiện có. AiPackStates chứa thông tin về tiến trình tải xuống, trạng thái tải xuống và mọi mã lỗi thất bại (failure).

Truy cập vào gói AI

Bạn có thể truy cập vào gói AI bằng cách sử dụng lệnh gọi hệ thống tệp sau khi yêu cầu tải xuống đạt đến trạng thái COMPLETED. Sử dụng phương thức getPackLocation() để lấy thư mục gốc của gói AI.

Các gói AI được lưu trữ trong thư mục assets trong thư mục gốc của gói AI. Bạn có thể lấy đường dẫn đến thư mục assets bằng cách sử dụng phương thức assetsPath() thuận tiện. Hãy sử dụng phương thức sau đây để lấy đường dẫn đến một tài sản cụ thể:

private String getAbsoluteAiAssetPath(String aiPack, String relativeAiAssetPath) {
    AiPackLocation aiPackPath = aiPackManager.getPackLocation(aiPack);

    if (aiPackPath == null) {
        // AI pack is not ready
        return null;
    }

    String aiAssetsFolderPath = aiPackPath.assetsPath();
    // equivalent to: FilenameUtils.concat(aiPackPath.path(), "assets");
    String aiAssetPath = FilenameUtils.concat(aiAssetsFolderPath, relativeAiAssetPath);
    return aiAssetPath;
}

Định cấu hình tiêu chí nhắm mục tiêu theo thiết bị

Bạn có thể làm theo hướng dẫn nhắm mục tiêu theo thiết bị để chỉ định những thiết bị hoặc nhóm thiết bị sẽ nhận được gói AI của bạn.

Các phương thức khác của Play AI Delivery API

Sau đây là một số phương thức API khác mà có thể bạn muốn sử dụng trong ứng dụng.

Hủy yêu cầu

Sử dụng cancel() để huỷ yêu cầu về gói AI đang hoạt động. Xin lưu ý rằng yêu cầu này là một thao tác được thực hiện trên cơ sở nỗ lực tối đa.

Xoá một gói AI

Sử dụng removePack() để lên lịch xoá gói AI.

Xem thông tin vị trí của nhiều gói AI

Sử dụng getPackLocations() để truy vấn trạng thái của nhiều gói AI cùng một lúc, các thao tác này sẽ trả về thông tin bản đồ và vị trí của các gói AI. Bản đồ do getPackLocations() trả về chứa một mục thông tin cho từng gói đang được tải xuống và cập nhật.

Nhắm mục tiêu theo thiết bị

Tính năng nhắm đến thiết bị giúp bạn kiểm soát chi tiết hơn những phần nào trong gói ứng dụng được phân phối đến các thiết bị cụ thể. Ví dụ: bạn có thể đảm bảo rằng một mô hình lớn chỉ được phân phối đến các thiết bị có RAM cao hoặc bạn có thể phân phối các phiên bản khác nhau của một mô hình đến các thiết bị khác nhau.

Bạn có thể nhắm đến các thuộc tính của thiết bị, chẳng hạn như:

Tổng quan về các bước bắt buộc

Bạn cần thực hiện các bước sau để bật tính năng nhắm đến thiết bị:

  1. Xác định nhóm thiết bị trong tệp XML.
  2. Chỉ định những phần nào trong gói của bạn sẽ được chuyển đến nhóm thiết bị nào.
  3. [Không bắt buộc] Kiểm thử cấu hình của bạn tại địa phương.
  4. Tải gói (chứa tệp XML) lên Google Play.

Kiểm tra phiên bản trình bổ trợ Android cho Gradle

Để sử dụng tính năng nhắm đến thiết bị, hãy đảm bảo rằng phiên bản Trình bổ trợ Android cho Gradle (AGP) của bạn ít nhất là 8.10.0. Công cụ này được đóng gói cùng với Android Studio (Meerkat 2 trở lên). Tải phiên bản ổn định mới nhất của Android Studio xuống.

Bật tính năng này trong Trình bổ trợ Android cho Gradle

Bạn phải bật tính năng nhắm đến thiết bị một cách rõ ràng trong tệp gradle.properties:

android.experimental.enableDeviceTargetingConfigApi=true

Tạo tệp XML cấu hình nhắm mục tiêu theo thiết bị

Tệp cấu hình nhắm đến thiết bị là một tệp XML, trong đó bạn xác định các nhóm thiết bị tuỳ chỉnh. Ví dụ: bạn có thể xác định một nhóm thiết bị có tên là qti_v79 chứa tất cả các thiết bị có hệ thống trên chip Qualcomm SM8750:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="qti_v79">
        <config:device-selector>
            <config:system-on-chip manufacturer="QTI" model="SM8750"/>
        </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

Nhóm thiết bị bao gồm tối đa 5 bộ chọn thiết bị. Một thiết bị sẽ được đưa vào nhóm thiết bị nếu thiết bị đó đáp ứng bất kỳ bộ chọn thiết bị nào của nhóm.

Một bộ chọn thiết bị có thể có một hoặc nhiều thuộc tính thiết bị. Một thiết bị sẽ được chọn nếu thiết bị đó khớp với tất cả các thuộc tính thiết bị của bộ chọn.

Nếu một thiết bị khớp với nhiều nhóm, thì thiết bị đó sẽ được phân phát nội dung cho nhóm được xác định đầu tiên trong tệp XML. Thứ tự bạn xác định các nhóm trong tệp XML là thứ tự ưu tiên của bạn.

Nếu không có nhóm nào phù hợp với một thiết bị, thì thiết bị đó sẽ nhận được nhóm "khác" mặc định. Nhóm này được tạo tự động và không được xác định một cách rõ ràng.

Các thuộc tính có thể sử dụng của thiết bị

  • device_ram: Yêu cầu về RAM của thiết bị
    • min_bytes (bao gồm): Dung lượng RAM bắt buộc tối thiểu (tính bằng byte)
    • max_bytes (loại trừ): Dung lượng RAM bắt buộc tối đa (tính bằng byte)
  • included_device_ids: Các kiểu thiết bị cần đưa vào bộ chọn này (tối đa 10000 device_ids cho mỗi nhóm). Thuộc tính này được đáp ứng nếu thiết bị khớp với bất kỳ device_id nào trong danh sách.
    • build_brand: Nhà sản xuất thiết bị
    • build_device: Mã kiểu thiết bị
  • excluded_device_ids: Các kiểu thiết bị cần loại trừ trong bộ chọn này (tối đa 10000 device_ids cho mỗi nhóm). Thuộc tính này được đáp ứng nếu thiết bị không khớp với device_id nào trong danh sách.
    • build_brand: Nhà sản xuất thiết bị
    • build_device: Mã kiểu thiết bị
  • required_system_features: Các tính năng mà thiết bị cần phải có để có mặt trong bộ chọn này (tối đa 100 tính năng cho mỗi nhóm). Thiết bị cần có tất cả các tính năng hệ thống trong danh sách này để đáp ứng thuộc tính này.

    Tài liệu tham khảo về tính năng hệ thống

    • name: Một tính năng của hệ thống
  • forbidden_system_features: Các tính năng mà thiết bị không được có để có mặt trong bộ chọn này (tối đa 100 tính năng cho mỗi nhóm). Nếu có bất kỳ tính năng hệ thống nào trong danh sách này, thì thiết bị sẽ không đáp ứng được thuộc tính này.

    Tài liệu tham khảo về tính năng hệ thống

    • name: Một tính năng của hệ thống
  • system-on-chip: Hệ thống trên chip sẽ có trong bộ chọn này. Thiết bị cần có một con chip bất kỳ trong danh sách này để đáp ứng thuộc tính này.

Sau đây là ví dụ minh hoạ tất cả các thuộc tính có thể có của thiết bị:

<config:device-targeting-config
    xmlns:config="http://schemas.android.com/apk/config">

    <config:device-group name="myCustomGroup1">
      <config:device-selector ram-min-bytes="8000000000">
        <config:included-device-id brand="google" device="redfin"/>
        <config:included-device-id brand="google" device="sailfish"/>
        <config:included-device-id brand="good-brand"/>
        <config:excluded-device-id brand="google" device="caiman"/>
        <config:system-on-chip manufacturer="Sinclair" model="ZX80"/>
        <config:system-on-chip manufacturer="Commodore" model="C64"/>
      </config:device-selector>
      <config:device-selector ram-min-bytes="16000000000"/>
    </config:device-group>

    <config:device-group name="myCustomGroup2">
      <config:device-selector ram-min-bytes="4000000000" ram-max-bytes="8000000000">
        <config:required-system-feature name="android.hardware.bluetooth"/>
        <config:required-system-feature name="android.hardware.location"/>
        <config:forbidden-system-feature name="android.hardware.camera"/>
        <config:forbidden-system-feature name="mindcontrol.laser"/>
      </config:device-selector>
    </config:device-group>

</config:device-targeting-config>

Mã nhà sản xuất thiết bị và mã kiểu thiết bị chính thức

Bạn có thể tìm định dạng đúng cho mã nhà sản xuất và mã kiểu thiết bị bằng cách sử dụng Danh mục thiết bị trên Google Play Console, bằng một trong hai cách sau:

  • Kiểm tra từng thiết bị bằng Danh mục thiết bị, đồng thời tìm nhà sản xuất và mã kiểu thiết bị ở những vị trí như trong ví dụ dưới đây (Đối với Google Pixel 4a, nhà sản xuất là "Google" và mã kiểu thiết bị là "sunfish")

    trang pixel 4a trong danh mục thiết bị

    trang pixel 4a trong danh mục thiết bị

  • Tải tệp CSV (chứa các thiết bị được hỗ trợ) xuống, sau đó nhập giá trị Nhà sản xuất vào trường build_brand và nhập giá trị Mã kiểu thiết bị vào trường build_device.

Đưa tệp cấu hình nhắm mục tiêu theo thiết bị vào gói ứng dụng

Thêm nội dung sau vào tệp build.gradle của mô-đun chính:

android {
  ...
  bundle {
    deviceTargetingConfig = file('device_targeting_config.xml')
    deviceGroup {
      enableSplit = true   // split bundle by #group
      defaultGroup = "other"  // group used for standalone APKs
    }
  }
  ...
}

device_targeting_config.xml là đường dẫn của tệp cấu hình tương ứng với mô-đun chính. Điều này đảm bảo rằng tệp cấu hình của bạn được đóng gói cùng với gói ứng dụng.

Mệnh đề deviceGroup đảm bảo rằng các APK được tạo từ gói của bạn sẽ được chia theo nhóm thiết bị.

Sử dụng tiêu chí nhắm mục tiêu theo thiết bị cho gói AI

Bạn có thể duy trì kích thước được tối ưu hoá trên các thiết bị bằng cách chỉ phân phối các mô hình lớn cho những thiết bị có thể chạy các mô hình đó.

Chia nhỏ các gói AI theo nhóm thiết bị bằng cách lấy các thư mục gói AI hiện có được tạo ở bước cuối cùng và thêm hậu tố thích hợp vào các thư mục (như mô tả bên dưới) bằng #group_myCustomGroup1, #group_myCustomGroup2, v.v. Khi dùng các gói AI trong ứng dụng, bạn sẽ không cần giải quyết các thư mục theo hậu tố (nói cách khác, hậu tố sẽ tự động bị xoá trong quá trình tạo).

Sau bước trước, bước này có thể hiển thị như sau:

...
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup1/
.../ai-pack-name/src/main/assets/image-classifier#group_myCustomGroup2/
...

Trong ví dụ này, bạn sẽ tham chiếu ai-pack-name/assets/image-classifier/ mà không có hậu tố.

Các thiết bị trong myCustomGroup1 sẽ nhận được tất cả thành phần trong image-classifier#group_myCustomGroup1/, còn các thiết bị trong myCustomGroup2 sẽ nhận được tất cả thành phần trong image-classifier#group_myCustomGroup2/.

Những thiết bị không thuộc myCustomGroup1 hoặc myCustomGroup2 sẽ nhận được gói ai-pack-name trống.

Điều này là do những thiết bị không khớp với bất kỳ nhóm thiết bị nào sẽ nhận được biến thể mặc định của gói AI. Điều này bao gồm mọi thứ không nằm trong thư mục có #group_suffix.

Sau khi tải gói AI xuống, bạn có thể kiểm tra xem mô hình của mình có xuất hiện hay không bằng cách sử dụng AssetManager cho các gói tại thời điểm cài đặt hoặc AiPackManager cho các gói tiếp nối nhanh và theo yêu cầu. Ví dụ về cách thực hiện việc này được minh hoạ cho tất cả các chế độ phân phối trong ứng dụng mẫu.

Sử dụng tiêu chí nhắm mục tiêu theo thiết bị cho các mô-đun tính năng

Bạn cũng có thể sử dụng tính năng nhắm đến thiết bị cho các mô-đun tính năng. Thay vì chia nhỏ các mô-đun tính năng theo nhóm thiết bị, bạn chỉ định xem toàn bộ mô-đun có được phân phối hay không dựa trên tư cách thành viên của nhóm thiết bị.

Để phân phối một mô-đun tính năng đến các thiết bị thuộc myCustomGroup1 hoặc myCustomGroup2, hãy sửa đổi AndroidManifest.xml của mô-đun đó:

<manifest ...>
  ...
  <dist:module dist:title="...">
    <dist:delivery>
      <dist:install-time>
        <dist:conditions>
          <dist:device-groups>
            <dist:device-group dist:name="myCustomGroup1"/>
            <dist:device-group dist:name="myCustomGroup2"/>
          </dist:device-groups>
          ...
        </dist:conditions>
      </dist:install-time>
    </dist:delivery>
  </dist:module>
  ...
</manifest>

Kiểm thử cục bộ

Trước khi tạo bản phát hành cho gói mới, bạn có thể kiểm thử cục bộ bằng tính năng Chia sẻ ứng dụng nội bộ hoặc Bundletool.

Chia sẻ ứng dụng nội bộ

Tính năng Chia sẻ ứng dụng nội bộ cho phép bạn sử dụng một gói ứng dụng để nhanh chóng tạo một URL mà bạn có thể nhấn vào trên thiết bị cục bộ để cài đặt chính xác nội dung mà Google Play sẽ cài đặt cho thiết bị đó nếu phiên bản ứng dụng đó đang hoạt động trong một kênh kiểm thử hoặc kênh phát hành công khai.

Hãy xem hướng dẫn về tính năng chia sẻ ứng dụng nội bộ.

Bundletool

Ngoài ra, bạn có thể tạo APK bằng bundletool (1.18.0 trở lên) và tải chúng lên thiết bị của bạn. Hãy làm theo các bước sau để kiểm thử cục bộ ứng dụng bằng bundletool:

  1. Tạo gói ứng dụng bằng Android Studio hoặc bundletool.

  2. Tạo APK có cờ (flag) --local-testing:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. Kết nối một thiết bị và chạy bundletool để tải các tệp APK không qua cửa hàng:

    # Example without Device Targeting Configuration
    java -jar bundletool.jar install-apks --apks=output.apks
    
    # Example with Device Targeting Configuration (you must specify which groups the connected device belongs to)
    java -jar bundletool.jar install-apks --apks=output.apks --device-groups=myCustomGroup1,myCustomGroup2
    

Hạn chế của kiểm thử cục bộ bằng bundletool

Sau đây là những hạn chế của kiểm thử cục bộ bằng bundletool:

  • Gói fast-follow hoạt động như gói on-demand. Điều này nghĩa là trò chơi sẽ không tự động được tìm nạp khi không tải qua cửa hàng (sideloaded). Nhà phát triển cần yêu cầu chúng theo cách thủ công khi ứng dụng bắt đầu; bạn không cần phải thay đổi mã trong ứng dụng của mình.
  • Các gói tìm nạp từ bộ nhớ ngoài thay vì qua Play, vì vậy, bạn không thể kiểm thử cách thức hoạt động của mã trong trường hợp lỗi mạng.
  • Kiểm thử cục bộ không bao gồm tình huống chờ Wi-Fi.
  • Không hỗ trợ cập nhật. Trước khi cài đặt phiên bản mới của bản dựng, hãy gỡ cài đặt phiên bản trước theo cách thủ công.

Xác minh rằng bạn đang cài đặt đúng APK

Hãy sử dụng phương thức sau đây để đảm bảo chỉ cài đặt đúng APK trên thiết bị

adb shell pm path {packageName}

Bạn sẽ thấy một số dòng mã như:

package:{...}/base.apk
package:{...}/split_config.en.apk
package:{...}/split_config.xxhdpi.apk
package:{...}/split_main_ai-pack-name.apk
package:{...}/split_main_ai-pack-name.config.group_myCustomGroup1.apk

Xin lưu ý rằng bạn sẽ chỉ thấy các APK trong danh sách này, được tạo từ các mô-đun tính năng và gói AI tại thời điểm cài đặt. Các gói AI theo yêu cầu và theo dõi nhanh không được cài đặt dưới dạng APK.

Thử nghiệm và phát hành trên Google Play

Bạn nên kiểm thử ứng dụng của mình từ đầu đến cuối trên Google Play bằng kênh kiểm thử nội bộ.

Sau khi thực hiện việc này, bạn có thể phát hành bản cập nhật ứng dụng cho kênh phát hành công khai theo từng giai đoạn bằng chế độ phát hành theo giai đoạn.

Ứng dụng mẫu sử dụng Play cho AI trên thiết bị

Tải ứng dụng mẫu xuống.

Ví dụ này minh hoạ cách sử dụng từng chế độ phân phối cũng như cấu hình nhắm đến thiết bị. Hãy xem phần kiểm thử cục bộ để bắt đầu.

Tìm hiểu thêm về Android App Bundle và đọc các tài liệu tham khảo về SDK Phân phối AI.