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

Giới thiệu

Play cho AI trên thiết bị mang đến 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 lo lắng về sự phức tạp của hệ sinh thái thiết bị và không mất thêm phí. Tính năng 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, trong đó chứa mã, thành phầ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à 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 phát hành lên Google Play và uỷ quyền cho Play lưu trữ, phân phối, cập nhật và nhắm mục tiêu 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, tiếp nối nhanh hoặc theo yêu cầu.
    • Phương thứ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 nhanh diễn ra tự động 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 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 không gian lưu trữ nội bộ 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. Điều này rất 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 được 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ữ cho các bản cập nhật ứng dụng luôn nhỏ gọn và tối ưu hoá bằng tính năng vá lỗi tự động của Play, tức là chỉ cần tải những điểm khác biệt trong tệp 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 và Điều khoản dịch vụ của Bộ phát triển phần mềm Play Core.
  • Chỉ ứng dụng của bạn mới được sử dụng các mô hình do Play tải xuống cho AI trên thiết bị. Không nên cung cấp mô hình cho các ứng dụng khác.
  • Mỗi gói AI có thể có dung lượng lên đến 1,5 GB, dựa trên kích thước tải xuống sau khi 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 của bạn 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 là 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 của mình. 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 cùng với gói ứng dụng, bạn có thể sử dụng tất cả các công cụ kiểm thử và phát hành hiện có của Play, chẳng hạn như kênh kiểm thử và 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.

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á lỗi 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 cung cấp thư viện hoặc mã để chạy mô hình học máy, hãy chuyển mô hình đó 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 vào một gói AI rồi truy cập vào mô hình đó theo hướng dẫn cho gói cài đặt hoặc cho gói tiếp nối nhanh và gói theo yêu cầu.

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

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

Sau đây là thông tin tổng quan về cách 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 vào 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 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 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 chế độ 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 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 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 cho 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ư minh hoạ 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 gói AI. Xem hướng dẫn về install-time và fast-follow/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 đế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 giá trị nhận dạng và chế độ phân phối 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à install-time sẽ có sẵn ngay khi khởi chạy ứng dụng. Hãy sử dụng AssetManager API trong 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 phương thức 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 trên Thư viện Play AI Delivery

Trong tệp build.gradle của ứng dụng, hãy khai báo 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

Hãy 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ố gói đã tải xuống từ trước đến nay (nếu được yêu cầu) và số gói đã 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 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() đ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 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ả 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 quy trình giao diện người dùng nhằm 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.

Cần 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ư khi ứng dụng được cài đặt không qua cửa hàng ứng dụng. 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).

Sử dụng gói AI

Bạn có thể truy cập vào một 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. Hãy 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 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 thiết bị hoặc nhóm thiết bị sẽ nhận được gói AI.

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ụ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 chặt chẽ hơn 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 đế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ị 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 trong gói sẽ được phân phối đến nhóm thiết bị nào.
  3. [Không bắt buộc] Kiểm thử cấu hình trên máy.
  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 tối thiểu 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 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, 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ả thiết bị có hệ thống Qualcomm SM8750 trên chip:

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

Một 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.

Bộ chọn thiết bị có thể có một hoặc nhiều thuộc tính thiết bị. Thiết bị sẽ được chọn nếu khớp với tất 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 một thiết bị không khớp với nhóm nào, thì thiết bị đó sẽ được đưa vào nhóm "khác" mặc định. Nhóm này được tạo tự động và không cần xác định 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 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ị
  • 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 một thiết bị 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 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 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ã chính thức của nhà sản xuất thiết bị và mẫu thiết bị

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 đoạn mã 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 liên quan đến mô-đun chính. Điều này đảm bảo rằng tệp cấu hình được đóng gói cùng với gói ứng dụng của bạn.

Mệnh đề deviceGroup đảm bảo rằng các tệp APK được tạo từ gói của bạn sẽ đượ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ể tối ưu hoá kích thước trên thiết bị bằng cách chỉ cung cấp các mô hình lớn cho những thiết bị có thể chạy các mô hình đó.

Chia nhỏ gói AI theo nhóm thiết bị bằng cách lấy thư mục gói AI hiện có được tạo ở bước cuối cùng và thêm hậu tố vào 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 thêm hậu tố vào thư mục (nói cách khác, hậu tố sẽ tự động bị loại bỏ 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ần thêm bất kỳ hậu tố nào.

Thiết bị trong myCustomGroup1 sẽ nhận được tất cả thành phần trong image-classifier#group_myCustomGroup1/, còn 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 một 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 nội dung 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ó tồn tại hay không bằng cách sử dụng AssetManager cho các gói cài đặt hoặc AiPackManager cho các gói theo dõi nhanh và theo yêu cầu. Ví dụ về cách thực hiện việc này được trình bày cho tất cả các chế độ phân phối trong ứng dụng mẫu.

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

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ì chia nhỏ mô-đun tính năng theo nhóm thiết bị, bạn chỉ định xem có nên phân phối toàn bộ mô-đun 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 đế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ể thử nghiệm cục bộ bằng tính năng Chia sẻ ứng dụng trong nội bộ hoặc Bundletool.

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

Tính năng Chia sẻ ứng dụng trong nội bộ cho phép bạn sử dụng 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 kênh thử nghiệm hoặc kênh phát hành công khai.

Hãy xem hướng dẫn chia sẻ ứng dụng trong nội bộ.

Bundletool

Ngoài ra, bạn có thể tạo tệp APK bằng cách sử dụng bundletool (1.18.0 trở lên) và cài đặt không qua cửa hàng ứng dụng vào 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
    

Các 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 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. Gói AI theo yêu cầu và gói AI tiếp nối nhanh không được cài đặt dưới dạng tệp APK.

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

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

Sau khi hoàn tất, bạn có thể phát hành dần bản cập nhật ứng dụng lên kênh phát hành công khai bằng tính năng 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.

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

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