Chương trình tiếp cận sớm (EAP) của Play for AI trên thiết bị

Giới thiệu

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

Lợi ích

  • Tải một cấu phần phát hành lên Google Play và uỷ quyền lưu trữ, phân phối, cập nhật và nhắm mục tiêu cho Play mà không mất thêm phí.
  • Phân phối mô hình học máy tại thời điểm cài đặt, theo dõi nhanh hoặc theo yêu cầu.
    • Việc phân phối tại thời điểm 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 tệp APK.
    • Quá trình phân phối tiếp nối nhanh sẽ tự động diễn ra trong 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 tải mô hình 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 trong thời gian chạy. Tính năng này sẽ hữu ích nếu mô hình chỉ cần thiết cho một số luồng người dùng nhất định. 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 mẫu thiết bị, thuộc tính hệ thống hoặc RAM.
  • Giữ cho bản cập nhật ứng dụng nhỏ gọn và được tối ưu hoá bằng tính năng vá tự động của Play, nghĩa là chỉ cần tải các tệp khác biệt xuống.

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.
  • Nhà phát triển tham gia chương trình tiếp cận sớm cần phải đánh giá Play for AI trên thiết bị và gửi ý kiến phản hồi cho Google Play.
  • Chỉ ứng dụng đã tải mô hình xuống mới có thể sử dụng các mô hình mà Play tải xuống cho AI trên thiết bị. Không được cung cấp mô hình cho các ứng dụng khác, chẳng hạn như thông qua kết nối dịch vụ.
  • Mỗi gói AI có thể có kích thước tối đa 1,5 GB, dựa trên kích thước tải xuống đã nén. Kích thước ứng dụng tích luỹ tối đa của mọi phiên bản ứng dụng được tạo từ gói ứng dụng là 4 GB.
  • Ứng dụng có kích thước trên 1 GB phải đặt Cấp độ SDK tối thiểu thành 21 trở lên.
  • Trong chương trình tiếp cận sớm, Play for AI trên thiết bị có thể thay đổi.

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à các bản 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 thực hiện thay đổi đối vớ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. Không được phép sử dụng Java/Kotlin và thư viện gốc. Nếu bạn cần vận chuyển thư viện hoặc mã để chạy mô hình học máy, hãy 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 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 đó bằng hướng dẫn dành cho gói tại thời điểm cài đặt hoặc gói theo dõi nhanh và gói 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. Cung cấp mã tài khoản nhà phát triển Play cho Google Play để tham gia EAP.
  2. Đóng gói các mô hình của bạn vào gói AI trong Android App Bundle và chỉ định cách phân phối các gói AI.
  3. [Không bắt buộc] Nếu muốn phân phối nhiều mô hình cho nhiều thiết bị, bạn có thể định cấu hình tính năng nhắm mục tiêu theo thiết bị cho các gói AI của mình. 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 không nhận được mô hình nào.
  4. [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 tiếp nối nhanh, hãy tích hợp Thư viện phân phối AI của Play vào ứng dụng để tải các gói AI xuống khi cần.
  5. Kiểm thử và phát hành gói ứng dụng lên Google Play.

Cung cấp mã tài khoản nhà phát triển của bạn trên Play

Vì tính năng này đang trong giai đoạn sử dụng sớm, nên tài khoản nhà phát triển của bạn cần được đưa vào danh sách cho phép để có quyền truy cập vào Play for AI trên thiết bị. Xác nhận mã tài khoản nhà phát triển Play và tên gói ứng dụng với người quản lý đối tác của Google Play hoặc thành viên nhóm Play for On-device AI. Chỉ định xem bạn có nhắm đến các thiết bị cụ thể cho mô hình của mình hay không (đây là bước 3 trong phần trước). Hiện tại, chúng tôi đang mời một số đối tác của Play thử nghiệm tính năng này.

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 vào một gói AI

Bạn không cần phải sử dụng Android Studio cho các bước sau.

  1. Trong thư mục cấp cao nhất của dự án, hãy tạo 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. 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. Bên trong gói AI, hãy tạo một thư mục src/main/assets/.

  6. Đặt 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 mô hình. Cách bạn thực hiện việc này sẽ phụ thuộc vào chế độ phân phối của các gói AI. Xem hướng dẫn về chế độ 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 tính năng nhắm mục tiêu theo thiết bị để phân phối các mô hình khác nhau cho các thiết bị khác nhau.

  9. Xây dựng Android App Bundle bằng Gradle. Trong gói ứng dụng đã tạo, thư mục cấp cơ sở hiện bao 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 thành phầ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 điểm cài đặt sẽ có sẵn ngay khi khởi chạy ứng dụng. Sử dụng API AssetManager của Java để 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 phân phối AI của Play.

Khai báo phần phụ thuộc trên Thư viện phân phối AI của Play

Trong tệp build.gradle của ứng dụng, hãy khai báo phần phụ thuộc trên 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 trong 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 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 gói đã tải xuống từ trước đến nay (nếu được yêu cầu) và số lượng gói đã chuyển vào ứng dụng:

Để biết trạng thái của 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 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() đ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 gói AI. Thông tin cập nhật trạng thái được chia nhỏ cho từng gói để 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ả tài nguyên 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ệp 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, 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 hiển thị 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, ví dụ: nếu ứng dụng được tải không qua cửa hàng. 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 các gói AI một lần nữa.

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 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 thuộc 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 tính năng 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 các 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 API Play AI Delivery

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á 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 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ụ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 mục tiêu theo thiết bị giúp bạn kiểm soát chi tiết hơn về những phần của 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 cho 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 cho các thiết bị khác nhau.

Bạn có thể nhắm đến các thuộc tính thiết bị 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 mục tiêu theo thiết bị:

  1. Xác định nhóm thiết bị trong tệp XML.
  2. Chỉ định phần nào của gói sẽ thuộc nhóm thiết bị nào.
  3. [Không bắt buộc] Kiểm thử cấu hình cục bộ.
  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 mục tiêu theo 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 là tối thiểu 8.10.0-alpha01. Tệp này được đóng gói với Android Studio Meerkat 2, nằm trong canary.

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 mục tiêu theo 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 mục tiêu theo thiết bị là một tệp XML mà bạn dùng để 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ả 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ị đượ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.

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 trước 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.

Nếu không khớp với nhóm nào, 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 rõ ràng.

Các thuộc tính thiết bị có sẵn

  • 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 (không bao gồm): 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 mẫ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 mã thiết bị 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 của 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à bộ chọn này không được đưa vào thiết bị (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 thuộc tính này.

    Tài liệu tham khảo về tính năng của 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 đưa vào bộ chọn này. Thiết bị cần có bất kỳ khối nào trong danh sách này để đáp ứng thuộc tính này.

Dưới đây là ví dụ cho thấy tất cả thuộc tính thiết bị có thể có:

<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 tệp APK được tạo từ gói của bạn được phân tách theo nhóm thiết bị.

Sử dụng tính năng 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 đó.

Phân chia 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à sửa đổi hậu tố cho các thư mục thích hợp (như mô tả bên dưới) bằng #group_myCustomGroup1, #group_myCustomGroup2, v.v. Khi sử dụng gói AI trong ứng dụng, bạn sẽ không cần phải 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 xây dựng).

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 đến ai-pack-name/assets/image-classifier/ mà không cần thêm hậu tố nào.

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/.

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

Lý do là 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 hiển thị 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 mục tiêu theo thiết bị cho các mô-đun tính năng. Thay vì phân chia các mô-đun tính năng theo nhóm thiết bị, bạn chỉ định liệu toàn bộ mô-đun có được phân phối dựa trên tư cách thành viên của nhóm thiết bị hay không.

Để phân phối mô-đun tính năng cho 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 một 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 kênh thử nghiệm 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 tệp APK bằng bundletool (1.18.0 trở lên) và tải tệp APK đó không qua cửa hàng ứng dụng lên thiết bị. Hãy làm theo các bước sau để kiểm thử cục bộ ứng dụng của bạn bằng cách sử dụng công cụ 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 việc kiểm thử cục bộ bằng bundletool

Sau đây là những hạn chế của việc 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à ứng dụng 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 tệp APK

Hãy sử dụng phương thức sau đây để đảm bảo chỉ cài đặt đúng tệp 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 tệp 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.

Kiểm thử và phát hành trên Google Play

Bạn nên kiểm thử toàn diện ứng dụng trên Google Play bằng một 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 phiên bản chính thức bằng cá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ị

Hãy liên hệ với nhà quản lý đối tác của Google Play để có quyền truy cập vào ứng dụng mẫu của chúng tôi.

Tài liệu 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 mục tiêu theo thiết bị. Hãy xem phần kiểm thử cục bộ để bắt đầu.

Gửi ý kiến phản hồi

Những người tham gia chương trình tiếp cận sớm cần báo cáo các vấn đề và cung cấp ý kiến phản hồi. Bạn có thể liên hệ với nhà quản lý đối tác của Google Play hoặc liên hệ với nhóm Play for On-device AI.

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