بازی برای برنامه دسترسی زودهنگام هوش مصنوعی روی دستگاه (EAP)

مقدمه

Play for On-Device AI مزایای Android App Bundles و تحویل Google Play را به توزیع سفارشی مدل ML می‌آورد تا بتوانید بدون هزینه اضافی عملکرد مدل را با پیچیدگی کمتر اکوسیستم بهبود بخشید. این به شما امکان می‌دهد یک مصنوع واحد را در Play منتشر کنید که حاوی کد، دارایی‌ها، و مدل‌های ML شماست و از بین تعدادی حالت تحویل و گزینه‌های هدف انتخاب کنید.

مزایا

  • یک مصنوع انتشارات را در Google Play آپلود کنید و میزبانی، تحویل، به‌روزرسانی‌ها و هدف‌یابی را بدون هزینه اضافی به Play واگذار کنید.
  • مدل های ML خود را در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل دهید.
    • تحویل در زمان نصب می تواند تضمین کند که یک مدل بسیار بزرگ هنگام باز شدن برنامه شما وجود دارد. مدل شما به صورت APK نصب خواهد شد.
    • پس از نصب برنامه، تحویل سریع به‌طور خودکار در پس‌زمینه انجام می‌شود. کاربران ممکن است برنامه شما را قبل از دانلود کامل مدل شما باز کنند. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
    • تحویل برحسب تقاضا به شما امکان می‌دهد مدل را در زمان اجرا درخواست کنید، که اگر مدل فقط برای جریان‌های کاربر خاصی مورد نیاز باشد، مفید است. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
  • انواع مدل‌های ML خود را ارائه دهید که بر اساس مدل دستگاه، ویژگی‌های سیستم یا RAM برای دستگاه‌های خاصی هدف قرار می‌گیرند.
  • به‌روزرسانی‌های برنامه را با وصله خودکار Play کوچک و بهینه نگه دارید، به این معنی که فقط تفاوت‌های موجود در فایل‌ها باید دانلود شوند.

ملاحظات

  • با استفاده از Play for On-Device AI، با شرایط مندرج در توافقنامه توزیع برنامه‌نویس Google Play و شرایط خدمات کیت توسعه نرم‌افزار Play Core موافقت می‌کنید.
  • انتظار می رود توسعه دهندگان شرکت کننده در برنامه دسترسی زودهنگام Play را برای هوش مصنوعی روی دستگاه ارزیابی کنند و بازخورد خود را به Google Play ارائه دهند.
  • مدل‌های دانلود شده توسط Play for On-Device AI فقط توسط برنامه‌ای که مدل را دانلود کرده می‌تواند استفاده کند. مدل‌ها نباید به برنامه‌های دیگر ارائه شوند، مثلاً از طریق اتصال سرویس.
  • بسته‌های هوش مصنوعی می‌توانند تا 1.5 گیگابایت بر اساس اندازه‌های دانلود فشرده‌شان باشند. حداکثر اندازه تجمعی برنامه هر نسخه از برنامه شما که از بسته برنامه شما تولید شده است 4 گیگابایت است.
  • برنامه‌های بیش از ۱ گیگابایت باید حداقل سطح SDK را روی ۲۱ یا بالاتر تنظیم کنند.
  • در طول برنامه دسترسی زودهنگام، Play for On-Device AI ممکن است تغییر کند.

نحوه استفاده از Play for On-Device AI

Play for On-Device AI از بسته های هوش مصنوعی استفاده می کند. شما مدل‌های سفارشی را که برای توزیع در بسته‌های هوش مصنوعی آماده هستند در بسته برنامه خود بسته‌بندی می‌کنید. شما می‌توانید انتخاب کنید که بسته هوش مصنوعی در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل داده شود.

با بسته‌بندی بسته‌های هوش مصنوعی با بسته برنامه خود، می‌توانید از همه ابزارهای آزمایشی و انتشار موجود Play، مانند آهنگ‌های آزمایشی و عرضه‌های مرحله‌ای برای مدیریت توزیع برنامه‌تان با مدل‌های سفارشی‌تان استفاده کنید.

بسته های هوش مصنوعی همراه با باینری برنامه به روز می شوند. اگر نسخه جدید برنامه شما تغییراتی در بسته هوش مصنوعی ایجاد نمی کند، فرآیند وصله خودکار Play باعث می شود کاربر مجبور به دانلود مجدد آن نباشد. وقتی برنامه را به‌روزرسانی می‌کند، Play فقط آنچه را که تغییر کرده است دانلود می‌کند.

بسته های هوش مصنوعی فقط شامل مدل هستند. جاوا/کاتلین و کتابخانه های بومی مجاز نیستند. اگر برای اجرای مدل ML خود نیاز به ارسال کتابخانه ها یا کد دارید، آن را به ماژول پایه یا یک ماژول ویژگی منتقل کنید. می توانید ماژول ویژگی خود را به گونه ای پیکربندی کنید که تنظیمات دانلود و هدف گذاری مشابه بسته هوش مصنوعی داشته باشد.

از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید

می توانید از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید. مدل خود را در یک بسته هوش مصنوعی بسته بندی کنید و سپس با استفاده از دستورالعمل های بسته های زمان نصب یا بسته های سریع و درخواستی به آن دسترسی پیدا کنید.

مطالعه بیشتر:

  • شروع با LiteRT
    • برنامه نمونه نشان می دهد که چگونه می توانید یک مدل LiteRT را در یک بسته هوش مصنوعی بسته بندی کنید و آن را در زمان اجرا بارگذاری کنید.
    • بسیاری از مدل های LiteRT از قبل آموزش دیده وجود دارد که می توانید در بسته های هوش مصنوعی برای شروع استفاده کنید.
  • شروع کار با MediaPipe
    • برای بسته‌های سریع دنبال و درخواستی، می‌توانید از AssetCache.java برای بارگیری دارایی‌های خود (مانند فایل‌های .binarypb ) از طریق مسیرهای فایل‌شان استفاده کنید.
    • برای بسته‌های زمان نصب، می‌توانید از AndroidAssetUtil.java استفاده کنید.

با بسته های هوش مصنوعی شروع کنید

در سطح بالا، در اینجا نحوه شروع استفاده از Play for On-Device AI آورده شده است:

  1. شناسه حساب توسعه‌دهنده Play خود را برای پیوستن به EAP به Google Play ارائه دهید.
  2. مدل‌های خود را در بسته‌های هوش مصنوعی در Android App Bundle خود بسته‌بندی کنید و نحوه تحویل بسته‌های هوش مصنوعی را مشخص کنید.
  3. [اختیاری] اگر می‌خواهید مدل‌های مختلف را به دستگاه‌های مختلف تحویل دهید، می‌توانید هدف‌گیری دستگاه را برای بسته‌های هوش مصنوعی خود پیکربندی کنید . برای مثال، می‌توانید بسته هوش مصنوعی A را به یک مدل دستگاه خاص، بسته هوش مصنوعی B را به دستگاه‌هایی با حداقل 6 گیگابایت رم تحویل دهید، و همه دستگاه‌های دیگر نمی‌توانند هیچ مدلی دریافت کنند.
  4. [اختیاری] اگر از تحویل درخواستی یا پیگیری سریع استفاده می‌کنید، کتابخانه Play AI Delivery را در برنامه خود ادغام کنید تا بسته‌های هوش مصنوعی خود را در صورت نیاز دانلود کنید.
  5. بسته نرم افزاری خود را آزمایش کرده و در Google Play منتشر کنید.

شناسه حساب توسعه دهنده Play خود را ارائه دهید

از آنجایی که این ویژگی در دسترسی اولیه است، برای دسترسی به Play for On-Device AI حساب توسعه‌دهنده شما باید در فهرست مجاز باشد. شناسه‌های حساب توسعه‌دهنده Play و نام‌های بسته برنامه را به مدیر شریک Google Play یا عضو تیم هوش مصنوعی Play for On-Device تأیید کنید. مشخص کنید که آیا مدل های خود را برای دستگاه های خاصی هدف قرار خواهید داد (این مرحله 3 از بخش قبل است). در حال حاضر، ما از شرکای منتخب Play دعوت می کنیم تا این ویژگی را آزمایش کنند.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از بسته های هوش مصنوعی، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.8 باشد. این نسخه با اندروید استودیو لیدی باگ 2 بسته بندی شده است.

مدل خود را در یک بسته هوش مصنوعی استخراج کنید

Android Studio برای مراحل زیر مورد نیاز نیست.

  1. در دایرکتوری سطح بالای پروژه خود، یک دایرکتوری برای بسته هوش مصنوعی ایجاد کنید. این نام دایرکتوری به عنوان نام بسته هوش مصنوعی استفاده می شود. نام بسته های هوش مصنوعی باید با یک حرف شروع شود و فقط شامل حروف، اعداد و زیرخط باشد.
  2. در پوشه AI pack یک فایل build.gradle ایجاد کنید و کد زیر را اضافه کنید. حتماً نام بسته هوش مصنوعی و فقط یک نوع تحویل را مشخص کنید:

    // 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. در فایل برنامه build.gradle پروژه، نام هر بسته هوش مصنوعی را در پروژه خود مانند تصویر زیر اضافه کنید:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. در فایل settings.gradle پروژه، تمام بسته‌های هوش مصنوعی را مانند شکل زیر در پروژه خود قرار دهید:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. در بسته هوش مصنوعی خود، یک دایرکتوری src/main/assets/ ایجاد کنید.

  6. مدل های خود را در دایرکتوری src/main/assets قرار دهید. در اینجا نیز می توانید زیر شاخه ها را ایجاد کنید. ساختار دایرکتوری برنامه شما اکنون باید به شکل زیر باشد:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. برای بارگذاری و اجرای مدل های خود کد اضافه کنید. نحوه انجام این کار به حالت تحویل بسته های هوش مصنوعی شما بستگی دارد. دستورالعمل‌های مربوط به زمان نصب و دنبال کردن سریع/طبق تقاضا را در زیر ببینید.

  8. [اختیاری] هدف گذاری دستگاه را برای ارائه مدل های مختلف به دستگاه های مختلف پیکربندی کنید .

  9. بسته نرم افزاری اندروید را با Gradle بسازید . در بسته نرم افزاری تولید شده، دایرکتوری سطح ریشه اکنون شامل موارد زیر است:

    • ai-pack-name/manifest/AndroidManifest.xml : شناسه بسته هوش مصنوعی و حالت تحویل را پیکربندی می کند
    • ai-pack-name/assets/your-model-directories : دایرکتوری حاوی تمام دارایی های ارائه شده به عنوان بخشی از بسته هوش مصنوعی است.

    Gradle مانیفست را برای هر بسته هوش مصنوعی تولید می کند و فهرست assets/ فهرست را برای شما خروجی می دهد.

پیکربندی تحویل زمان نصب

بسته‌های هوش مصنوعی که به‌عنوان زمان نصب پیکربندی شده‌اند، بلافاصله با راه‌اندازی برنامه در دسترس هستند. از Java AssetManager API برای دسترسی به بسته های هوش مصنوعی در این حالت استفاده کنید:

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

تحویل سریع و درخواستی را پیکربندی کنید

برای دانلود بسته های هوش مصنوعی با تحویل سریع یا درخواستی، از کتابخانه تحویل هوش مصنوعی Play استفاده کنید.

وابستگی خود را به کتابخانه تحویل هوش مصنوعی Play اعلام کنید

در فایل build.gradle برنامه خود، یک وابستگی به کتابخانه تحویل هوش مصنوعی Play اعلام کنید:

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

وضعیت را بررسی کنید

هر بسته هوش مصنوعی در یک پوشه جداگانه در حافظه داخلی برنامه ذخیره می شود. از متد getPackLocation() برای تعیین پوشه ریشه یک بسته هوش مصنوعی استفاده کنید. این متد مقادیر زیر را برمی گرداند:

ارزش برگشتی وضعیت
یک شیء معتبر AiPackLocation پوشه ریشه بسته هوش مصنوعی برای دسترسی فوری در assetsPath() آماده است.
null بسته‌های هوش مصنوعی یا بسته‌های هوش مصنوعی ناشناخته در دسترس نیستند

دریافت اطلاعات دانلود در مورد بسته های هوش مصنوعی

استفاده کنید
متد getPackStates() برای تعیین اندازه دانلود و اینکه آیا بسته در حال بارگیری است یا خیر.

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

getPackStates() یک روش ناهمزمان است که Task<AiPackStates> برمی گرداند. متد packStates() یک شی AiPackStates یک Map<String, AiPackState> را برمی گرداند. این نقشه شامل وضعیت هر بسته هوش مصنوعی درخواستی است که با نام آن کلید زده شده است:

Map<String, AiPackState> AiPackStates#packStates()

درخواست نهایی با موارد زیر نشان داده می شود:

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;
            });

روش‌های AiPackState زیر اندازه بسته هوش مصنوعی، مقدار دانلود شده تا کنون (در صورت درخواست) و مبلغی که قبلاً به برنامه منتقل شده است را ارائه می‌کند:

برای دریافت وضعیت یک بسته هوش مصنوعی، از متد status() استفاده کنید، که وضعیت را به صورت یک عدد صحیح که مربوط به یک فیلد ثابت در کلاس AiPackStatus است، برمی‌گرداند. بسته هوش مصنوعی که هنوز نصب نشده است وضعیت AiPackStatus.NOT_INSTALLED را دارد.

اگر درخواستی با شکست مواجه شد، از روش errorCode() استفاده کنید که مقدار بازگشتی آن مربوط به یک فیلد ثابت در کلاس AiPackErrorCode است.

نصب کنید

از متد fetch() برای دانلود یک بسته هوش مصنوعی برای اولین بار استفاده کنید یا برای تکمیل به روز رسانی یک بسته هوش مصنوعی تماس بگیرید:

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

این روش یک شی AiPackStates حاوی لیستی از بسته ها و حالت ها و اندازه های دانلود اولیه آنها را برمی گرداند. اگر بسته AI درخواست شده از طریق fetch() در حال بارگیری باشد، وضعیت دانلود برگردانده می شود و دانلود اضافی شروع نمی شود.

وضعیت های دانلود را مانیتور کنید

برای ردیابی پیشرفت نصب بسته های هوش مصنوعی باید یک AiPackStateUpdateListener پیاده سازی کنید. به‌روزرسانی‌های وضعیت در هر بسته برای پشتیبانی از ردیابی وضعیت بسته‌های هوش مصنوعی جداگانه تجزیه می‌شوند. می‌توانید قبل از تکمیل همه دانلودهای دیگر برای درخواستتان، استفاده از بسته‌های هوش مصنوعی موجود را شروع کنید.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
دانلودهای بزرگ

اگر دانلود بزرگتر از 200 مگابایت باشد و کاربر از Wi-Fi استفاده نکند، دانلود شروع نمی شود تا زمانی که کاربر صریحاً رضایت خود را برای ادامه دانلود با استفاده از اتصال داده تلفن همراه اعلام کند. به همین ترتیب، اگر بارگیری زیاد باشد و کاربر Wi-Fi را از دست بدهد، دانلود متوقف می‌شود و برای ادامه با استفاده از اتصال داده تلفن همراه، رضایت صریح لازم است. یک بسته متوقف شده دارای وضعیت WAITING_FOR_WIFI است. برای راه اندازی جریان UI برای درخواست رضایت از کاربر، از متد showConfirmationDialog() استفاده کنید.

توجه داشته باشید که اگر برنامه این روش را فراخوانی نکند، دانلود متوقف می‌شود و تنها زمانی که کاربر به اتصال Wi-Fi بازگشته است، به‌طور خودکار از سر گرفته می‌شود.

تایید کاربر مورد نیاز است

اگر بسته ای دارای وضعیت REQUIRES_USER_CONFIRMATION باشد، دانلود ادامه نمی یابد تا زمانی که کاربر گفتگوی نشان داده شده با showConfirmationDialog() را نپذیرد. این وضعیت زمانی رخ می‌دهد که برنامه توسط Play شناسایی نشود—مثلاً اگر برنامه جانبی بارگذاری شده باشد. توجه داشته باشید که فراخوانی showConfirmationDialog() در این حالت باعث به‌روزرسانی برنامه می‌شود. پس از به روز رسانی، باید دوباره بسته های هوش مصنوعی را درخواست کنید.

در زیر نمونه ای از اجرای شنونده است:

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

همچنین، می‌توانید از متد getPackStates() برای دریافت وضعیت دانلودهای فعلی استفاده کنید. AiPackStates شامل پیشرفت دانلود، وضعیت دانلود و هر گونه کد خطای خطا است.

دسترسی به بسته های هوش مصنوعی

پس از اینکه درخواست دانلود به حالت COMPLETED رسید، می‌توانید با استفاده از تماس‌های سیستم فایل به بسته هوش مصنوعی دسترسی پیدا کنید. از متد getPackLocation() برای دریافت پوشه ریشه بسته هوش مصنوعی استفاده کنید.

بسته های هوش مصنوعی در فهرست assets در دایرکتوری ریشه بسته هوش مصنوعی ذخیره می شوند. با استفاده از روش راحتی assetsPath() می توانید مسیر دایرکتوری assets را دریافت کنید. برای رسیدن به یک دارایی خاص از روش زیر استفاده کنید:

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

هدف گذاری دستگاه را پیکربندی کنید

می‌توانید دستورالعمل‌های هدف‌گیری دستگاه را دنبال کنید تا دستگاه‌ها یا گروه‌هایی از دستگاه‌هایی را که باید بسته‌های هوش مصنوعی شما را دریافت کنند، مشخص کنید.

سایر روش‌های Play AI Delivery API

در زیر چند روش API اضافی وجود دارد که ممکن است بخواهید در برنامه خود استفاده کنید.

لغو درخواست

cancel() برای لغو درخواست بسته AI فعال استفاده کنید. توجه داشته باشید که این درخواست بهترین عملیات است.

یک بسته هوش مصنوعی را بردارید

از removePack() برای برنامه ریزی حذف بسته هوش مصنوعی استفاده کنید.

مکان های بسته های هوش مصنوعی متعدد را دریافت کنید

از getPackLocations() برای پرس و جو کردن وضعیت چندین بسته هوش مصنوعی به صورت انبوه استفاده کنید که نقشه بسته های هوش مصنوعی و مکان آنها را برمی گرداند. نقشه برگردانده شده توسط getPackLocations() حاوی یک ورودی برای هر بسته است که در حال حاضر دانلود شده و به روز شده است.

هدف گذاری دستگاه

هدف‌گیری دستگاه به شما کنترل دقیق‌تری بر روی بخش‌هایی از بسته برنامه شما به دستگاه‌های خاص تحویل می‌دهد. برای مثال، می‌توانید اطمینان حاصل کنید که یک مدل بزرگ فقط به دستگاه‌هایی با RAM بالا تحویل داده می‌شود یا می‌توانید نسخه‌های مختلف یک مدل را به دستگاه‌های مختلف تحویل دهید.

شما می توانید ویژگی های دستگاه مانند:

مروری بر مراحل مورد نیاز

مراحل زیر برای فعال کردن هدف گذاری دستگاه مورد نیاز است:

  1. گروه های دستگاه خود را در یک فایل XML تعریف کنید.
  2. مشخص کنید کدام بخش از بسته شما باید به کدام گروه دستگاه برود.
  3. [اختیاری] پیکربندی خود را به صورت محلی آزمایش کنید.
  4. بسته نرم افزاری خود (حاوی فایل XML) را در Google Play آپلود کنید.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از هدف گیری دستگاه، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.10.0-alpha01 باشد. این با Android Studio Meerkat 2 که در قناری است بسته بندی شده است.

این قابلیت را در افزونه Gradle اندروید فعال کنید

هدف گذاری دستگاه باید به صراحت در فایل gradle.properties شما فعال باشد:

android.experimental.enableDeviceTargetingConfigApi=true

یک فایل XML پیکربندی هدفمند دستگاه ایجاد کنید

فایل پیکربندی هدف گیری دستگاه یک فایل XML است که در آن گروه های دستگاه سفارشی خود را تعریف می کنید. به عنوان مثال، می توانید یک گروه دستگاه به نام qti_v79 تعریف کنید که شامل تمام دستگاه های دارای سیستم 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>

یک گروه دستگاه از حداکثر 5 انتخابگر دستگاه تشکیل شده است. یک دستگاه در صورتی در گروه دستگاه گنجانده می شود که هر یک از انتخابگرهای دستگاه خود را برآورده کند.

انتخابگر دستگاه می تواند یک یا چند ویژگی دستگاه داشته باشد. دستگاهی انتخاب می شود که با تمام ویژگی های دستگاه انتخابگر مطابقت داشته باشد.

اگر دستگاهی با چندین گروه مطابقت داشته باشد، محتوای گروهی که ابتدا در فایل XML تعریف شده است به آن ارائه می شود. ترتیبی که گروه ها را در فایل XML تعریف می کنید، ترتیب اولویت شماست.

اگر دستگاهی با هیچ گروهی مطابقت نداشته باشد، گروه «دیگر» پیش‌فرض را دریافت می‌کند. این گروه به طور خودکار ایجاد می شود و نباید به صراحت تعریف شود.

ویژگی های دستگاه موجود

  • device_ram : مورد نیاز رم دستگاه
    • min_bytes ( شامل) : حداقل RAM مورد نیاز (بر حسب بایت)
    • max_bytes ( انحصاری) : حداکثر RAM مورد نیاز (بر حسب بایت)
  • include_device_ids : مدل‌های دستگاهی که باید در این انتخابگر گنجانده شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هر ID_ID موجود در لیست مطابقت داشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • excluded_device_ids : مدل‌های دستگاهی که در این انتخابگر حذف می‌شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هیچ device_id در لیست مطابقت نداشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • require_system_features : ویژگی هایی که یک دستگاه باید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . یک دستگاه باید تمام ویژگی های سیستم را در این لیست داشته باشد تا این ویژگی را برآورده کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • forbidden_system_features : ویژگی هایی که یک دستگاه نباید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . اگر دستگاهی دارای یکی از ویژگی های سیستم در این لیست باشد، این ویژگی را برآورده نمی کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • system-on-chip : سیستم روی تراشه‌هایی که باید در این انتخابگر گنجانده شود. یک دستگاه باید هر چیپ را در این لیست داشته باشد تا این ویژگی را برآورده کند.

در اینجا یک مثال نشان می دهد که تمام ویژگی های ممکن دستگاه را نشان می دهد:

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

کدهای رسمی سازنده دستگاه و مدل دستگاه

می‌توانید قالب‌بندی صحیح سازنده دستگاه و کد مدل را با استفاده از کاتالوگ دستگاه در کنسول Google Play، با یکی از موارد زیر پیدا کنید:

  • بازرسی دستگاه‌های جداگانه با استفاده از کاتالوگ دستگاه، و یافتن کد سازنده و مدل در مکان‌هایی که در مثال زیر نشان داده شده است (برای Google Pixel 4a، سازنده «Google» و کد مدل «sunfish» است)».

    صفحه پیکسل 4a در کاتالوگ دستگاه

    صفحه پیکسل 4a در کاتالوگ دستگاه

  • دانلود CSV دستگاه‌های پشتیبانی‌شده و استفاده از کد سازنده و مدل کد به ترتیب برای فیلدهای build_brand و build_device .

فایل پیکربندی هدفمندی دستگاه خود را در بسته برنامه خود قرار دهید

موارد زیر را به فایل build.gradle ماژول اصلی خود اضافه کنید:

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 مسیر فایل پیکربندی شما نسبت به ماژول اصلی است. این تضمین می کند که فایل پیکربندی شما با بسته نرم افزاری شما بسته بندی شده است.

بند deviceGroup تضمین می‌کند که فایل‌های APK تولید شده از بسته شما بر اساس گروه‌های دستگاه تقسیم می‌شوند.

از هدف گیری دستگاه برای بسته های هوش مصنوعی خود استفاده کنید

فقط با تحویل مدل‌های بزرگ خود به دستگاه‌هایی که می‌توانند آن‌ها را اجرا کنند، می‌توانید اندازه را روی دستگاه‌ها بهینه نگه دارید.

بسته‌های هوش مصنوعی خود را با استفاده از فهرست‌های بسته AI موجود که در مرحله آخر ایجاد شده‌اند، بر اساس گروه‌های دستگاه تقسیم کنید، و پوشه‌های مناسب (همانطور که در زیر توضیح داده شده است) را با استفاده از #group_myCustomGroup1، #group_myCustomGroup2، و غیره پس از رفع مشکل، پس از تعمیر قرار دهید. هنگام استفاده از بسته‌های AI در برنامه خود، نیازی به آدرس‌دهی پوشه‌ها با کلمات دیگر با postfix نیست.

بعد از مرحله قبل، ممکن است به صورت زیر باشد:

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

در این مثال، شما ai-pack-name/assets/image-classifier/ بدون هیچ پسوندی اشاره می کنید.

دستگاه‌های myCustomGroup1 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup1/ دریافت خواهند کرد، در حالی که دستگاه‌های myCustomGroup2 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup2/ دریافت خواهند کرد.

دستگاه‌هایی که به myCustomGroup1 یا myCustomGroup2 تعلق ندارند، یک بسته ai-pack-name خالی دریافت خواهند کرد.

این به این دلیل است که دستگاه‌هایی که با هیچ گروه دستگاهی مطابقت ندارند، نوع پیش‌فرض بسته هوش مصنوعی شما را دریافت خواهند کرد. این شامل هر چیزی است که داخل یک فهرست با پسوند #group_suffix نیست.

هنگامی که بسته هوش مصنوعی را دانلود کردید، می توانید با استفاده از AssetManager برای بسته های زمان نصب یا AiPackManager برای بسته های سریع و درخواستی بررسی کنید که آیا مدل شما موجود است یا خیر. نمونه هایی برای انجام این کار برای همه حالت های تحویل در برنامه نمونه نشان داده شده است.

از هدف گذاری دستگاه برای ماژول های ویژگی خود استفاده کنید

همچنین می توانید از هدف گذاری دستگاه برای ماژول های ویژگی استفاده کنید. به جای تقسیم ماژول های ویژگی بر اساس گروه دستگاه، مشخص می کنید که آیا کل ماژول باید بر اساس عضویت در گروه دستگاه تحویل داده شود یا خیر.

برای ارائه یک ماژول ویژگی به دستگاه‌هایی که متعلق به myCustomGroup1 یا myCustomGroup2 هستند، AndroidManifest.xml آن را تغییر دهید:

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

به صورت محلی تست کنید

قبل از ایجاد نسخه برای بسته جدید خود، می‌توانید به صورت محلی با اشتراک‌گذاری برنامه داخلی یا Bundletool آزمایش کنید.

اشتراک گذاری داخلی برنامه

اشتراک‌گذاری داخلی برنامه به شما امکان می‌دهد از یک بسته برنامه برای ایجاد سریع یک URL استفاده کنید که می‌توانید روی آن ضربه بزنید تا دقیقاً همان چیزی را که Google Play برای آن دستگاه نصب می‌کرد، نصب کنید، اگر آن نسخه از برنامه در مسیر آزمایشی یا تولیدی پخش می‌شد.

به دستورالعمل های اشتراک گذاری داخلی برنامه نگاهی بیندازید.

Bundletool

از طرف دیگر، می‌توانید فایل‌های APK را با استفاده از bundletool (1.18.0 یا بالاتر) تولید کنید و آن‌ها را روی دستگاه خود بارگذاری کنید. این مراحل را برای آزمایش برنامه خود به صورت محلی با استفاده از bundletool دنبال کنید:

  1. بسته نرم افزاری خود را با Android Studio یا bundletool بسازید.

  2. APK با پرچم --local-testing ایجاد کنید:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. یک دستگاه را وصل کنید و bundletool برای بارگذاری جانبی فایل‌های APK اجرا کنید:

    # 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
    

محدودیت‌های آزمایش محلی با bundletool

محدودیت‌های آزمایش محلی با bundletool به شرح زیر است:

  • بسته های fast-follow مانند بسته های on-demand عمل می کنند. به این معنی که هنگام بارگذاری جانبی برنامه، آنها به طور خودکار واکشی نمی شوند. وقتی برنامه شروع به کار کرد، توسعه دهندگان باید آنها را به صورت دستی درخواست کنند. این نیازی به تغییر کد در برنامه شما ندارد.
  • بسته‌ها به جای Play از حافظه خارجی واکشی می‌شوند، بنابراین نمی‌توانید نحوه عملکرد کدتان را در صورت بروز خطاهای شبکه آزمایش کنید.
  • آزمایش محلی سناریوی انتظار برای Wi-Fi را پوشش نمی دهد.
  • به روز رسانی ها پشتیبانی نمی شوند. قبل از نصب نسخه جدید بیلد خود، نسخه قبلی را به صورت دستی حذف نصب کنید.

بررسی کنید که APK های صحیح در حال نصب هستند

از روش زیر برای اطمینان از نصب APK های صحیح روی دستگاه استفاده کنید

adb shell pm path {packageName}

شما باید چیزی شبیه به:

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

توجه داشته باشید که در این لیست فقط فایل‌های APK را خواهید دید که از ماژول‌های ویژگی و بسته‌های هوش مصنوعی در زمان نصب ساخته شده‌اند. بسته‌های هوش مصنوعی درخواستی و سریع به‌عنوان APK نصب نمی‌شوند.

تست کنید و در گوگل پلی منتشر کنید

توصیه می‌کنیم برنامه خود را از سر تا سر در Google Play با یک مسیر آزمایشی داخلی آزمایش کنید.

هنگامی که این کار را انجام دادید، می‌توانید به‌روزرسانی برنامه‌تان را به‌صورت تدریجی برای تولید با عرضه‌های مرحله‌ای منتشر کنید.

نمونه برنامه با استفاده از Play for On-Device AI

برای دسترسی به برنامه نمونه ما با مدیر شریک Google Play خود تماس بگیرید.

نحوه استفاده از هر یک از حالت های تحویل و همچنین پیکربندی هدف گیری دستگاه را نشان می دهد. برای شروع به بخش تست محلی مراجعه کنید.

بازخورد ارائه دهید

شرکت کنندگان در برنامه دسترسی اولیه باید مشکلات را گزارش کرده و بازخورد ارائه کنند. می‌توانید با مدیر شریک Google Play خود تماس بگیرید یا با تیم هوش مصنوعی Play for On-Device تماس بگیرید.

درباره Android App Bundles بیشتر بیاموزید و مراجع AI Delivery SDK را بخوانید.

،

مقدمه

Play for On-Device AI مزایای Android App Bundles و تحویل Google Play را به توزیع سفارشی مدل ML می‌آورد تا بتوانید بدون هزینه اضافی عملکرد مدل را با پیچیدگی کمتر اکوسیستم بهبود بخشید. این به شما امکان می‌دهد یک مصنوع واحد را در Play منتشر کنید که حاوی کد، دارایی‌ها، و مدل‌های ML شماست و از بین تعدادی حالت تحویل و گزینه‌های هدف انتخاب کنید.

مزایا

  • یک مصنوع انتشارات را در Google Play آپلود کنید و میزبانی، تحویل، به‌روزرسانی‌ها و هدف‌یابی را بدون هزینه اضافی به Play واگذار کنید.
  • مدل های ML خود را در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل دهید.
    • تحویل در زمان نصب می تواند تضمین کند که یک مدل بسیار بزرگ هنگام باز شدن برنامه شما وجود دارد. مدل شما به صورت APK نصب خواهد شد.
    • پس از نصب برنامه، تحویل سریع به‌طور خودکار در پس‌زمینه انجام می‌شود. کاربران ممکن است برنامه شما را قبل از دانلود کامل مدل شما باز کنند. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
    • تحویل برحسب تقاضا به شما امکان می‌دهد مدل را در زمان اجرا درخواست کنید، که اگر مدل فقط برای جریان‌های کاربر خاصی مورد نیاز باشد، مفید است. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
  • انواع مدل‌های ML خود را ارائه دهید که بر اساس مدل دستگاه، ویژگی‌های سیستم یا RAM برای دستگاه‌های خاصی هدف قرار می‌گیرند.
  • به‌روزرسانی‌های برنامه را با وصله خودکار Play کوچک و بهینه نگه دارید، به این معنی که فقط تفاوت‌های موجود در فایل‌ها باید دانلود شوند.

ملاحظات

  • با استفاده از Play for On-Device AI، با شرایط مندرج در توافقنامه توزیع برنامه‌نویس Google Play و شرایط خدمات کیت توسعه نرم‌افزار Play Core موافقت می‌کنید.
  • انتظار می رود توسعه دهندگان شرکت کننده در برنامه دسترسی زودهنگام Play را برای هوش مصنوعی روی دستگاه ارزیابی کنند و بازخورد خود را به Google Play ارائه دهند.
  • مدل‌های دانلود شده توسط Play for On-Device AI فقط توسط برنامه‌ای که مدل را دانلود کرده می‌تواند استفاده کند. مدل‌ها نباید به برنامه‌های دیگر ارائه شوند، مثلاً از طریق اتصال سرویس.
  • بسته‌های هوش مصنوعی می‌توانند تا 1.5 گیگابایت بر اساس اندازه‌های دانلود فشرده‌شان باشند. حداکثر اندازه تجمعی برنامه هر نسخه از برنامه شما که از بسته برنامه شما تولید شده است 4 گیگابایت است.
  • برنامه‌های بیش از ۱ گیگابایت باید حداقل سطح SDK را روی ۲۱ یا بالاتر تنظیم کنند.
  • در طول برنامه دسترسی زودهنگام، Play for On-Device AI ممکن است تغییر کند.

نحوه استفاده از Play for On-Device AI

Play for On-Device AI از بسته های هوش مصنوعی استفاده می کند. شما مدل‌های سفارشی را که برای توزیع در بسته‌های هوش مصنوعی آماده هستند در بسته برنامه خود بسته‌بندی می‌کنید. شما می‌توانید انتخاب کنید که بسته هوش مصنوعی در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل داده شود.

با بسته‌بندی بسته‌های هوش مصنوعی با بسته برنامه خود، می‌توانید از همه ابزارهای آزمایشی و انتشار موجود Play، مانند آهنگ‌های آزمایشی و عرضه‌های مرحله‌ای برای مدیریت توزیع برنامه‌تان با مدل‌های سفارشی‌تان استفاده کنید.

بسته های هوش مصنوعی همراه با باینری برنامه به روز می شوند. اگر نسخه جدید برنامه شما تغییراتی در بسته هوش مصنوعی ایجاد نمی کند، فرآیند وصله خودکار Play باعث می شود کاربر مجبور به دانلود مجدد آن نباشد. وقتی برنامه را به‌روزرسانی می‌کند، Play فقط آنچه را که تغییر کرده است دانلود می‌کند.

بسته های هوش مصنوعی فقط شامل مدل هستند. جاوا/کاتلین و کتابخانه های بومی مجاز نیستند. اگر برای اجرای مدل ML خود نیاز به ارسال کتابخانه ها یا کد دارید، آن را به ماژول پایه یا یک ماژول ویژگی منتقل کنید. می توانید ماژول ویژگی خود را به گونه ای پیکربندی کنید که تنظیمات دانلود و هدف گذاری مشابه بسته هوش مصنوعی داشته باشد.

از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید

می توانید از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید. مدل خود را در یک بسته هوش مصنوعی بسته بندی کنید و سپس با استفاده از دستورالعمل های بسته های زمان نصب یا بسته های سریع و درخواستی به آن دسترسی پیدا کنید.

مطالعه بیشتر:

  • شروع با LiteRT
    • برنامه نمونه نشان می دهد که چگونه می توانید یک مدل LiteRT را در یک بسته هوش مصنوعی بسته بندی کنید و آن را در زمان اجرا بارگذاری کنید.
    • بسیاری از مدل های LiteRT از قبل آموزش دیده وجود دارد که می توانید در بسته های هوش مصنوعی برای شروع استفاده کنید.
  • شروع کار با MediaPipe
    • برای بسته‌های سریع دنبال و درخواستی، می‌توانید از AssetCache.java برای بارگیری دارایی‌های خود (مانند فایل‌های .binarypb ) از طریق مسیرهای فایل‌شان استفاده کنید.
    • برای بسته‌های زمان نصب، می‌توانید از AndroidAssetUtil.java استفاده کنید.

با بسته های هوش مصنوعی شروع کنید

در سطح بالا، در اینجا نحوه شروع استفاده از Play for On-Device AI آورده شده است:

  1. شناسه حساب توسعه‌دهنده Play خود را برای پیوستن به EAP به Google Play ارائه دهید.
  2. مدل‌های خود را در بسته‌های هوش مصنوعی در Android App Bundle خود بسته‌بندی کنید و نحوه تحویل بسته‌های هوش مصنوعی را مشخص کنید.
  3. [اختیاری] اگر می‌خواهید مدل‌های مختلف را به دستگاه‌های مختلف تحویل دهید، می‌توانید هدف‌گیری دستگاه را برای بسته‌های هوش مصنوعی خود پیکربندی کنید . برای مثال، می‌توانید بسته هوش مصنوعی A را به یک مدل دستگاه خاص، بسته هوش مصنوعی B را به دستگاه‌هایی با حداقل 6 گیگابایت رم تحویل دهید، و همه دستگاه‌های دیگر نمی‌توانند هیچ مدلی دریافت کنند.
  4. [اختیاری] اگر از تحویل درخواستی یا پیگیری سریع استفاده می‌کنید، کتابخانه Play AI Delivery را در برنامه خود ادغام کنید تا بسته‌های هوش مصنوعی خود را در صورت نیاز دانلود کنید.
  5. بسته نرم افزاری خود را آزمایش کرده و در Google Play منتشر کنید.

شناسه حساب توسعه دهنده Play خود را ارائه دهید

از آنجایی که این ویژگی در دسترسی اولیه است، برای دسترسی به Play for On-Device AI حساب توسعه‌دهنده شما باید در فهرست مجاز باشد. شناسه‌های حساب توسعه‌دهنده Play و نام‌های بسته برنامه را به مدیر شریک Google Play یا عضو تیم هوش مصنوعی Play for On-Device تأیید کنید. مشخص کنید که آیا مدل های خود را برای دستگاه های خاصی هدف قرار خواهید داد (این مرحله 3 از بخش قبل است). در حال حاضر، ما از شرکای منتخب Play دعوت می کنیم تا این ویژگی را آزمایش کنند.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از بسته های هوش مصنوعی، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.8 باشد. این نسخه با اندروید استودیو لیدی باگ 2 بسته بندی شده است.

مدل خود را در یک بسته هوش مصنوعی استخراج کنید

Android Studio برای مراحل زیر مورد نیاز نیست.

  1. در دایرکتوری سطح بالای پروژه خود، یک دایرکتوری برای بسته هوش مصنوعی ایجاد کنید. این نام دایرکتوری به عنوان نام بسته هوش مصنوعی استفاده می شود. نام بسته های هوش مصنوعی باید با یک حرف شروع شود و فقط شامل حروف، اعداد و زیرخط باشد.
  2. در پوشه AI pack یک فایل build.gradle ایجاد کنید و کد زیر را اضافه کنید. حتماً نام بسته هوش مصنوعی و فقط یک نوع تحویل را مشخص کنید:

    // 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. در فایل برنامه build.gradle پروژه، نام هر بسته هوش مصنوعی را در پروژه خود مانند تصویر زیر اضافه کنید:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. در فایل settings.gradle پروژه، تمام بسته‌های هوش مصنوعی را مانند شکل زیر در پروژه خود قرار دهید:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. در بسته هوش مصنوعی خود، یک دایرکتوری src/main/assets/ ایجاد کنید.

  6. مدل های خود را در دایرکتوری src/main/assets قرار دهید. در اینجا نیز می توانید زیر شاخه ها را ایجاد کنید. ساختار دایرکتوری برنامه شما اکنون باید به شکل زیر باشد:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. برای بارگذاری و اجرای مدل های خود کد اضافه کنید. نحوه انجام این کار به حالت تحویل بسته های هوش مصنوعی شما بستگی دارد. دستورالعمل‌های مربوط به زمان نصب و دنبال کردن سریع/طبق تقاضا را در زیر ببینید.

  8. [اختیاری] هدف گذاری دستگاه را برای ارائه مدل های مختلف به دستگاه های مختلف پیکربندی کنید .

  9. بسته نرم افزاری اندروید را با Gradle بسازید . در بسته نرم افزاری تولید شده، دایرکتوری سطح ریشه اکنون شامل موارد زیر است:

    • ai-pack-name/manifest/AndroidManifest.xml : شناسه بسته هوش مصنوعی و حالت تحویل را پیکربندی می کند
    • ai-pack-name/assets/your-model-directories : دایرکتوری حاوی تمام دارایی های ارائه شده به عنوان بخشی از بسته هوش مصنوعی است.

    Gradle مانیفست را برای هر بسته هوش مصنوعی تولید می کند و فهرست assets/ فهرست را برای شما خروجی می دهد.

پیکربندی تحویل زمان نصب

بسته‌های هوش مصنوعی که به‌عنوان زمان نصب پیکربندی شده‌اند، بلافاصله با راه‌اندازی برنامه در دسترس هستند. از Java AssetManager API برای دسترسی به بسته های هوش مصنوعی در این حالت استفاده کنید:

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

تحویل سریع و درخواستی را پیکربندی کنید

برای دانلود بسته های هوش مصنوعی با تحویل سریع یا درخواستی، از کتابخانه تحویل هوش مصنوعی Play استفاده کنید.

وابستگی خود را به کتابخانه تحویل هوش مصنوعی Play اعلام کنید

در فایل build.gradle برنامه خود، یک وابستگی به کتابخانه تحویل هوش مصنوعی Play اعلام کنید:

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

وضعیت را بررسی کنید

هر بسته هوش مصنوعی در یک پوشه جداگانه در حافظه داخلی برنامه ذخیره می شود. از متد getPackLocation() برای تعیین پوشه ریشه یک بسته هوش مصنوعی استفاده کنید. این متد مقادیر زیر را برمی گرداند:

ارزش برگشتی وضعیت
یک شیء معتبر AiPackLocation پوشه ریشه بسته هوش مصنوعی برای دسترسی فوری در assetsPath() آماده است.
null بسته‌های هوش مصنوعی یا بسته‌های هوش مصنوعی ناشناخته در دسترس نیستند

دریافت اطلاعات دانلود در مورد بسته های هوش مصنوعی

استفاده کنید
متد getPackStates() برای تعیین اندازه دانلود و اینکه آیا بسته در حال بارگیری است یا خیر.

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

getPackStates() یک روش ناهمزمان است که Task<AiPackStates> برمی گرداند. متد packStates() یک شی AiPackStates یک Map<String, AiPackState> را برمی گرداند. این نقشه شامل وضعیت هر بسته هوش مصنوعی درخواستی است که با نام آن کلید زده شده است:

Map<String, AiPackState> AiPackStates#packStates()

درخواست نهایی با موارد زیر نشان داده می شود:

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;
            });

روش‌های AiPackState زیر اندازه بسته هوش مصنوعی، مقدار دانلود شده تا کنون (در صورت درخواست) و مبلغی که قبلاً به برنامه منتقل شده است را ارائه می‌کند:

برای دریافت وضعیت یک بسته هوش مصنوعی، از متد status() استفاده کنید، که وضعیت را به صورت یک عدد صحیح که مربوط به یک فیلد ثابت در کلاس AiPackStatus است، برمی‌گرداند. بسته هوش مصنوعی که هنوز نصب نشده است وضعیت AiPackStatus.NOT_INSTALLED را دارد.

اگر درخواستی با شکست مواجه شد، از روش errorCode() استفاده کنید که مقدار بازگشتی آن مربوط به یک فیلد ثابت در کلاس AiPackErrorCode است.

نصب کنید

از متد fetch() برای دانلود یک بسته هوش مصنوعی برای اولین بار استفاده کنید یا برای تکمیل به روز رسانی یک بسته هوش مصنوعی تماس بگیرید:

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

این روش یک شی AiPackStates حاوی لیستی از بسته ها و حالت ها و اندازه های دانلود اولیه آنها را برمی گرداند. اگر بسته AI درخواست شده از طریق fetch() در حال بارگیری باشد، وضعیت دانلود برگردانده می شود و دانلود اضافی شروع نمی شود.

وضعیت های دانلود را مانیتور کنید

برای ردیابی پیشرفت نصب بسته های هوش مصنوعی باید یک AiPackStateUpdateListener پیاده سازی کنید. به‌روزرسانی‌های وضعیت در هر بسته برای پشتیبانی از ردیابی وضعیت بسته‌های هوش مصنوعی جداگانه تجزیه می‌شوند. می‌توانید قبل از تکمیل همه دانلودهای دیگر برای درخواستتان، استفاده از بسته‌های هوش مصنوعی موجود را شروع کنید.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
دانلودهای بزرگ

اگر دانلود بزرگتر از 200 مگابایت باشد و کاربر از Wi-Fi استفاده نکند، دانلود شروع نمی شود تا زمانی که کاربر صریحاً رضایت خود را برای ادامه دانلود با استفاده از اتصال داده تلفن همراه اعلام کند. به همین ترتیب، اگر بارگیری زیاد باشد و کاربر Wi-Fi را از دست بدهد، دانلود متوقف می‌شود و برای ادامه با استفاده از اتصال داده تلفن همراه، رضایت صریح لازم است. یک بسته متوقف شده دارای وضعیت WAITING_FOR_WIFI است. برای راه اندازی جریان UI برای درخواست رضایت از کاربر، از متد showConfirmationDialog() استفاده کنید.

توجه داشته باشید که اگر برنامه این روش را فراخوانی نکند، دانلود متوقف می‌شود و تنها زمانی که کاربر به اتصال Wi-Fi بازگشته است، به‌طور خودکار از سر گرفته می‌شود.

تایید کاربر مورد نیاز است

اگر بسته ای دارای وضعیت REQUIRES_USER_CONFIRMATION باشد، دانلود ادامه نمی یابد تا زمانی که کاربر گفتگوی نشان داده شده با showConfirmationDialog() را نپذیرد. این وضعیت زمانی رخ می‌دهد که برنامه توسط Play شناسایی نشود—مثلاً اگر برنامه جانبی بارگذاری شده باشد. توجه داشته باشید که فراخوانی showConfirmationDialog() در این حالت باعث به‌روزرسانی برنامه می‌شود. پس از به روز رسانی، باید دوباره بسته های هوش مصنوعی را درخواست کنید.

در زیر نمونه ای از اجرای شنونده است:

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

همچنین، می‌توانید از متد getPackStates() برای دریافت وضعیت دانلودهای فعلی استفاده کنید. AiPackStates شامل پیشرفت دانلود، وضعیت دانلود و هر گونه کد خطای خطا است.

دسترسی به بسته های هوش مصنوعی

پس از اینکه درخواست دانلود به حالت COMPLETED رسید، می‌توانید با استفاده از تماس‌های سیستم فایل به بسته هوش مصنوعی دسترسی پیدا کنید. از متد getPackLocation() برای دریافت پوشه ریشه بسته هوش مصنوعی استفاده کنید.

بسته های هوش مصنوعی در فهرست assets در دایرکتوری ریشه بسته هوش مصنوعی ذخیره می شوند. با استفاده از روش راحتی assetsPath() می توانید مسیر دایرکتوری assets را دریافت کنید. برای رسیدن به یک دارایی خاص از روش زیر استفاده کنید:

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

هدف گذاری دستگاه را پیکربندی کنید

می‌توانید دستورالعمل‌های هدف‌گیری دستگاه را دنبال کنید تا دستگاه‌ها یا گروه‌هایی از دستگاه‌هایی را که باید بسته‌های هوش مصنوعی شما را دریافت کنند، مشخص کنید.

سایر روش‌های Play AI Delivery API

در زیر چند روش API اضافی وجود دارد که ممکن است بخواهید در برنامه خود استفاده کنید.

لغو درخواست

cancel() برای لغو درخواست بسته AI فعال استفاده کنید. توجه داشته باشید که این درخواست بهترین عملیات است.

یک بسته هوش مصنوعی را بردارید

از removePack() برای برنامه ریزی حذف بسته هوش مصنوعی استفاده کنید.

مکان های بسته های هوش مصنوعی متعدد را دریافت کنید

از getPackLocations() برای پرس و جو کردن وضعیت چندین بسته هوش مصنوعی به صورت انبوه استفاده کنید که نقشه بسته های هوش مصنوعی و مکان آنها را برمی گرداند. نقشه برگردانده شده توسط getPackLocations() حاوی یک ورودی برای هر بسته است که در حال حاضر دانلود شده و به روز شده است.

هدف گذاری دستگاه

هدف‌گیری دستگاه به شما کنترل دقیق‌تری بر روی بخش‌هایی از بسته برنامه شما به دستگاه‌های خاص تحویل می‌دهد. برای مثال، می‌توانید اطمینان حاصل کنید که یک مدل بزرگ فقط به دستگاه‌هایی با RAM بالا تحویل داده می‌شود یا می‌توانید نسخه‌های مختلف یک مدل را به دستگاه‌های مختلف تحویل دهید.

شما می توانید ویژگی های دستگاه مانند:

مروری بر مراحل مورد نیاز

مراحل زیر برای فعال کردن هدف گذاری دستگاه مورد نیاز است:

  1. گروه های دستگاه خود را در یک فایل XML تعریف کنید.
  2. مشخص کنید کدام بخش از بسته شما باید به کدام گروه دستگاه برود.
  3. [اختیاری] پیکربندی خود را به صورت محلی آزمایش کنید.
  4. بسته نرم افزاری خود (حاوی فایل XML) را در Google Play آپلود کنید.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از هدف گیری دستگاه، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.10.0-alpha01 باشد. این با Android Studio Meerkat 2 که در قناری است بسته بندی شده است.

این قابلیت را در افزونه Gradle اندروید فعال کنید

هدف گذاری دستگاه باید به صراحت در فایل gradle.properties شما فعال باشد:

android.experimental.enableDeviceTargetingConfigApi=true

یک فایل XML پیکربندی هدفمند دستگاه ایجاد کنید

فایل پیکربندی هدف گیری دستگاه یک فایل XML است که در آن گروه های دستگاه سفارشی خود را تعریف می کنید. به عنوان مثال، می توانید یک گروه دستگاه به نام qti_v79 تعریف کنید که شامل تمام دستگاه های دارای سیستم 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>

یک گروه دستگاه از حداکثر 5 انتخابگر دستگاه تشکیل شده است. یک دستگاه در صورتی در گروه دستگاه گنجانده می شود که هر یک از انتخابگرهای دستگاه خود را برآورده کند.

انتخابگر دستگاه می تواند یک یا چند ویژگی دستگاه داشته باشد. دستگاهی انتخاب می شود که با تمام ویژگی های دستگاه انتخابگر مطابقت داشته باشد.

اگر دستگاهی با چندین گروه مطابقت داشته باشد، محتوای گروهی که ابتدا در فایل XML تعریف شده است به آن ارائه می شود. ترتیبی که گروه ها را در فایل XML تعریف می کنید، ترتیب اولویت شماست.

اگر دستگاهی با هیچ گروهی مطابقت نداشته باشد، گروه «دیگر» پیش‌فرض را دریافت می‌کند. این گروه به طور خودکار ایجاد می شود و نباید به صراحت تعریف شود.

ویژگی های دستگاه موجود

  • device_ram : مورد نیاز رم دستگاه
    • min_bytes ( شامل) : حداقل RAM مورد نیاز (بر حسب بایت)
    • max_bytes ( انحصاری) : حداکثر RAM مورد نیاز (بر حسب بایت)
  • include_device_ids : مدل‌های دستگاهی که باید در این انتخابگر گنجانده شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هر ID_ID موجود در لیست مطابقت داشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • excluded_device_ids : مدل‌های دستگاهی که در این انتخابگر حذف می‌شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هیچ device_id در لیست مطابقت نداشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • require_system_features : ویژگی هایی که یک دستگاه باید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . یک دستگاه باید تمام ویژگی های سیستم را در این لیست داشته باشد تا این ویژگی را برآورده کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • forbidden_system_features : ویژگی هایی که یک دستگاه نباید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . اگر دستگاهی دارای یکی از ویژگی های سیستم در این لیست باشد، این ویژگی را برآورده نمی کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • system-on-chip : سیستم روی تراشه‌هایی که باید در این انتخابگر گنجانده شود. یک دستگاه باید هر چیپ را در این لیست داشته باشد تا این ویژگی را برآورده کند.

در اینجا یک مثال نشان می دهد که تمام ویژگی های ممکن دستگاه را نشان می دهد:

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

کدهای رسمی سازنده دستگاه و مدل دستگاه

می‌توانید قالب‌بندی صحیح سازنده دستگاه و کد مدل را با استفاده از کاتالوگ دستگاه در کنسول Google Play، با یکی از موارد زیر پیدا کنید:

  • بازرسی دستگاه‌های جداگانه با استفاده از کاتالوگ دستگاه، و یافتن کد سازنده و مدل در مکان‌هایی که در مثال زیر نشان داده شده است (برای Google Pixel 4a، سازنده «Google» و کد مدل «sunfish» است)».

    صفحه پیکسل 4a در کاتالوگ دستگاه

    صفحه پیکسل 4a در کاتالوگ دستگاه

  • دانلود CSV دستگاه‌های پشتیبانی‌شده و استفاده از کد سازنده و مدل کد به ترتیب برای فیلدهای build_brand و build_device .

فایل پیکربندی هدفمندی دستگاه خود را در بسته برنامه خود قرار دهید

موارد زیر را به فایل build.gradle ماژول اصلی خود اضافه کنید:

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 مسیر فایل پیکربندی شما نسبت به ماژول اصلی است. این تضمین می کند که فایل پیکربندی شما با بسته نرم افزاری شما بسته بندی شده است.

بند deviceGroup تضمین می‌کند که فایل‌های APK تولید شده از بسته شما بر اساس گروه‌های دستگاه تقسیم می‌شوند.

از هدف گیری دستگاه برای بسته های هوش مصنوعی خود استفاده کنید

فقط با تحویل مدل‌های بزرگ خود به دستگاه‌هایی که می‌توانند آن‌ها را اجرا کنند، می‌توانید اندازه را روی دستگاه‌ها بهینه نگه دارید.

بسته‌های هوش مصنوعی خود را با استفاده از فهرست‌های بسته AI موجود که در مرحله آخر ایجاد شده‌اند، بر اساس گروه‌های دستگاه تقسیم کنید، و پوشه‌های مناسب (همانطور که در زیر توضیح داده شده است) را با استفاده از #group_myCustomGroup1، #group_myCustomGroup2، و غیره پس از رفع مشکل، پس از تعمیر قرار دهید. هنگام استفاده از بسته‌های AI در برنامه خود، نیازی به آدرس‌دهی پوشه‌ها با کلمات دیگر با postfix نیست.

بعد از مرحله قبل، ممکن است به صورت زیر باشد:

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

در این مثال، شما ai-pack-name/assets/image-classifier/ بدون هیچ پسوندی اشاره می کنید.

دستگاه‌های myCustomGroup1 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup1/ دریافت خواهند کرد، در حالی که دستگاه‌های myCustomGroup2 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup2/ دریافت خواهند کرد.

دستگاه‌هایی که به myCustomGroup1 یا myCustomGroup2 تعلق ندارند، یک بسته ai-pack-name خالی دریافت خواهند کرد.

این به این دلیل است که دستگاه‌هایی که با هیچ گروه دستگاهی مطابقت ندارند، نوع پیش‌فرض بسته هوش مصنوعی شما را دریافت خواهند کرد. این شامل هر چیزی است که داخل یک فهرست با پسوند #group_suffix نیست.

هنگامی که بسته هوش مصنوعی را دانلود کردید، می توانید با استفاده از AssetManager برای بسته های زمان نصب یا AiPackManager برای بسته های سریع و درخواستی بررسی کنید که آیا مدل شما موجود است یا خیر. نمونه هایی برای انجام این کار برای همه حالت های تحویل در برنامه نمونه نشان داده شده است.

از هدف گذاری دستگاه برای ماژول های ویژگی خود استفاده کنید

همچنین می توانید از هدف گذاری دستگاه برای ماژول های ویژگی استفاده کنید. به جای تقسیم ماژول های ویژگی بر اساس گروه دستگاه، مشخص می کنید که آیا کل ماژول باید بر اساس عضویت در گروه دستگاه تحویل داده شود یا خیر.

برای ارائه یک ماژول ویژگی به دستگاه‌هایی که متعلق به myCustomGroup1 یا myCustomGroup2 هستند، AndroidManifest.xml آن را تغییر دهید:

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

به صورت محلی تست کنید

قبل از ایجاد نسخه برای بسته جدید خود، می‌توانید به صورت محلی با اشتراک‌گذاری برنامه داخلی یا Bundletool آزمایش کنید.

اشتراک گذاری داخلی برنامه

اشتراک‌گذاری داخلی برنامه به شما امکان می‌دهد از یک بسته برنامه برای ایجاد سریع یک URL استفاده کنید که می‌توانید روی آن ضربه بزنید تا دقیقاً همان چیزی را که Google Play برای آن دستگاه نصب می‌کرد، نصب کنید، اگر آن نسخه از برنامه در مسیر آزمایشی یا تولیدی پخش می‌شد.

به دستورالعمل های اشتراک گذاری داخلی برنامه نگاهی بیندازید.

Bundletool

از طرف دیگر، می‌توانید فایل‌های APK را با استفاده از bundletool (1.18.0 یا بالاتر) تولید کنید و آن‌ها را روی دستگاه خود بارگذاری کنید. این مراحل را برای آزمایش برنامه خود به صورت محلی با استفاده از bundletool دنبال کنید:

  1. بسته نرم افزاری خود را با Android Studio یا bundletool بسازید.

  2. APK با پرچم --local-testing ایجاد کنید:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. یک دستگاه را وصل کنید و bundletool برای بارگذاری جانبی فایل‌های APK اجرا کنید:

    # 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
    

محدودیت‌های آزمایش محلی با bundletool

محدودیت‌های آزمایش محلی با bundletool به شرح زیر است:

  • بسته های fast-follow مانند بسته های on-demand عمل می کنند. به این معنی که هنگام بارگذاری جانبی برنامه، آنها به طور خودکار واکشی نمی شوند. وقتی برنامه شروع به کار کرد، توسعه دهندگان باید آنها را به صورت دستی درخواست کنند. این نیازی به تغییر کد در برنامه شما ندارد.
  • بسته‌ها به جای Play از حافظه خارجی واکشی می‌شوند، بنابراین نمی‌توانید نحوه عملکرد کدتان را در صورت بروز خطاهای شبکه آزمایش کنید.
  • آزمایش محلی سناریوی انتظار برای Wi-Fi را پوشش نمی دهد.
  • به روز رسانی ها پشتیبانی نمی شوند. قبل از نصب نسخه جدید بیلد خود، نسخه قبلی را به صورت دستی حذف نصب کنید.

بررسی کنید که APK های صحیح در حال نصب هستند

از روش زیر برای اطمینان از نصب APK های صحیح روی دستگاه استفاده کنید

adb shell pm path {packageName}

شما باید چیزی شبیه به:

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

توجه داشته باشید که در این لیست فقط فایل‌های APK را خواهید دید که از ماژول‌های ویژگی و بسته‌های هوش مصنوعی در زمان نصب ساخته شده‌اند. بسته‌های هوش مصنوعی درخواستی و سریع به‌عنوان APK نصب نمی‌شوند.

تست کنید و در گوگل پلی منتشر کنید

توصیه می‌کنیم برنامه خود را از سر تا سر در Google Play با یک مسیر آزمایشی داخلی آزمایش کنید.

هنگامی که این کار را انجام دادید، می‌توانید به‌روزرسانی برنامه‌تان را به‌صورت تدریجی برای تولید با عرضه‌های مرحله‌ای منتشر کنید.

نمونه برنامه با استفاده از Play for On-Device AI

برای دسترسی به برنامه نمونه ما با مدیر شریک Google Play خود تماس بگیرید.

نحوه استفاده از هر یک از حالت های تحویل و همچنین پیکربندی هدف گیری دستگاه را نشان می دهد. برای شروع به بخش تست محلی مراجعه کنید.

بازخورد ارائه دهید

شرکت کنندگان در برنامه دسترسی اولیه باید مشکلات را گزارش کرده و بازخورد ارائه کنند. می‌توانید با مدیر شریک Google Play خود تماس بگیرید یا با تیم هوش مصنوعی Play for On-Device تماس بگیرید.

درباره Android App Bundles بیشتر بیاموزید و مراجع AI Delivery SDK را بخوانید.

،

مقدمه

Play for On-Device AI مزایای Android App Bundles و تحویل Google Play را به توزیع سفارشی مدل ML می‌آورد تا بتوانید بدون هزینه اضافی عملکرد مدل را با پیچیدگی کمتر اکوسیستم بهبود بخشید. این به شما امکان می‌دهد یک مصنوع واحد را در Play منتشر کنید که حاوی کد، دارایی‌ها، و مدل‌های ML شماست و از بین تعدادی حالت تحویل و گزینه‌های هدف انتخاب کنید.

مزایا

  • یک مصنوع انتشارات را در Google Play آپلود کنید و میزبانی، تحویل، به‌روزرسانی‌ها و هدف‌یابی را بدون هزینه اضافی به Play واگذار کنید.
  • مدل های ML خود را در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل دهید.
    • تحویل در زمان نصب می تواند تضمین کند که یک مدل بسیار بزرگ هنگام باز شدن برنامه شما وجود دارد. مدل شما به صورت APK نصب خواهد شد.
    • پس از نصب برنامه، تحویل سریع به‌طور خودکار در پس‌زمینه انجام می‌شود. کاربران ممکن است برنامه شما را قبل از دانلود کامل مدل شما باز کنند. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
    • تحویل برحسب تقاضا به شما امکان می‌دهد مدل را در زمان اجرا درخواست کنید، که اگر مدل فقط برای جریان‌های کاربر خاصی مورد نیاز باشد، مفید است. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
  • انواع مدل‌های ML خود را ارائه دهید که بر اساس مدل دستگاه، ویژگی‌های سیستم یا RAM برای دستگاه‌های خاصی هدف قرار می‌گیرند.
  • به‌روزرسانی‌های برنامه را با وصله خودکار Play کوچک و بهینه نگه دارید، به این معنی که فقط تفاوت‌های موجود در فایل‌ها باید دانلود شوند.

ملاحظات

  • با استفاده از Play for On-Device AI، با شرایط مندرج در توافقنامه توزیع برنامه‌نویس Google Play و شرایط خدمات کیت توسعه نرم‌افزار Play Core موافقت می‌کنید.
  • انتظار می رود توسعه دهندگان شرکت کننده در برنامه دسترسی زودهنگام Play را برای هوش مصنوعی روی دستگاه ارزیابی کنند و بازخورد خود را به Google Play ارائه دهند.
  • مدل‌های دانلود شده توسط Play for On-Device AI فقط توسط برنامه‌ای که مدل را دانلود کرده می‌تواند استفاده کند. مدل‌ها نباید به برنامه‌های دیگر ارائه شوند، مثلاً از طریق اتصال سرویس.
  • بسته‌های هوش مصنوعی می‌توانند تا 1.5 گیگابایت بر اساس اندازه‌های دانلود فشرده‌شان باشند. حداکثر اندازه تجمعی برنامه هر نسخه از برنامه شما که از بسته برنامه شما تولید شده است 4 گیگابایت است.
  • برنامه‌های بیش از ۱ گیگابایت باید حداقل سطح SDK را روی ۲۱ یا بالاتر تنظیم کنند.
  • در طول برنامه دسترسی زودهنگام، Play for On-Device AI ممکن است تغییر کند.

نحوه استفاده از Play for On-Device AI

Play for On-Device AI از بسته های هوش مصنوعی استفاده می کند. شما مدل‌های سفارشی را که برای توزیع در بسته‌های هوش مصنوعی آماده هستند در بسته برنامه خود بسته‌بندی می‌کنید. شما می‌توانید انتخاب کنید که بسته هوش مصنوعی در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل داده شود.

با بسته‌بندی بسته‌های هوش مصنوعی با بسته برنامه خود، می‌توانید از همه ابزارهای آزمایشی و انتشار موجود Play، مانند آهنگ‌های آزمایشی و عرضه‌های مرحله‌ای برای مدیریت توزیع برنامه‌تان با مدل‌های سفارشی‌تان استفاده کنید.

بسته های هوش مصنوعی همراه با باینری برنامه به روز می شوند. اگر نسخه جدید برنامه شما تغییراتی در بسته هوش مصنوعی ایجاد نمی کند، فرآیند وصله خودکار Play باعث می شود کاربر مجبور به دانلود مجدد آن نباشد. وقتی برنامه را به‌روزرسانی می‌کند، Play فقط آنچه را که تغییر کرده است دانلود می‌کند.

بسته های هوش مصنوعی فقط شامل مدل هستند. جاوا/کاتلین و کتابخانه های بومی مجاز نیستند. اگر برای اجرای مدل ML خود نیاز به ارسال کتابخانه ها یا کد دارید، آن را به ماژول پایه یا یک ماژول ویژگی منتقل کنید. می توانید ماژول ویژگی خود را به گونه ای پیکربندی کنید که تنظیمات دانلود و هدف گذاری مشابه بسته هوش مصنوعی داشته باشد.

از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید

می توانید از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید. مدل خود را در یک بسته هوش مصنوعی بسته بندی کنید و سپس با استفاده از دستورالعمل های بسته های زمان نصب یا بسته های سریع و درخواستی به آن دسترسی پیدا کنید.

مطالعه بیشتر:

  • شروع با LiteRT
    • برنامه نمونه نشان می دهد که چگونه می توانید یک مدل LiteRT را در یک بسته هوش مصنوعی بسته بندی کنید و آن را در زمان اجرا بارگذاری کنید.
    • بسیاری از مدل های LiteRT از قبل آموزش دیده وجود دارد که می توانید در بسته های هوش مصنوعی برای شروع استفاده کنید.
  • شروع کار با MediaPipe
    • برای بسته‌های سریع دنبال و درخواستی، می‌توانید از AssetCache.java برای بارگیری دارایی‌های خود (مانند فایل‌های .binarypb ) از طریق مسیرهای فایل‌شان استفاده کنید.
    • برای بسته‌های زمان نصب، می‌توانید از AndroidAssetUtil.java استفاده کنید.

با بسته های هوش مصنوعی شروع کنید

در سطح بالا، در اینجا نحوه شروع استفاده از Play for On-Device AI آورده شده است:

  1. شناسه حساب توسعه‌دهنده Play خود را برای پیوستن به EAP به Google Play ارائه دهید.
  2. مدل‌های خود را در بسته‌های هوش مصنوعی در Android App Bundle خود بسته‌بندی کنید و نحوه تحویل بسته‌های هوش مصنوعی را مشخص کنید.
  3. [اختیاری] اگر می‌خواهید مدل‌های مختلف را به دستگاه‌های مختلف تحویل دهید، می‌توانید هدف‌گیری دستگاه را برای بسته‌های هوش مصنوعی خود پیکربندی کنید . برای مثال، می‌توانید بسته هوش مصنوعی A را به یک مدل دستگاه خاص، بسته هوش مصنوعی B را به دستگاه‌هایی با حداقل 6 گیگابایت رم تحویل دهید، و همه دستگاه‌های دیگر نمی‌توانند هیچ مدلی دریافت کنند.
  4. [اختیاری] اگر از تحویل درخواستی یا پیگیری سریع استفاده می‌کنید، کتابخانه Play AI Delivery را در برنامه خود ادغام کنید تا بسته‌های هوش مصنوعی خود را در صورت نیاز دانلود کنید.
  5. بسته نرم افزاری خود را آزمایش کرده و در Google Play منتشر کنید.

شناسه حساب توسعه دهنده Play خود را ارائه دهید

از آنجایی که این ویژگی در دسترسی اولیه است، برای دسترسی به Play for On-Device AI حساب توسعه‌دهنده شما باید در فهرست مجاز باشد. شناسه‌های حساب توسعه‌دهنده Play و نام‌های بسته برنامه را به مدیر شریک Google Play یا عضو تیم هوش مصنوعی Play for On-Device تأیید کنید. مشخص کنید که آیا مدل های خود را برای دستگاه های خاصی هدف قرار خواهید داد (این مرحله 3 از بخش قبل است). در حال حاضر، ما از شرکای منتخب Play دعوت می کنیم تا این ویژگی را آزمایش کنند.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از بسته های هوش مصنوعی، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.8 باشد. این نسخه با اندروید استودیو لیدی باگ 2 بسته بندی شده است.

مدل خود را در یک بسته هوش مصنوعی استخراج کنید

Android Studio برای مراحل زیر مورد نیاز نیست.

  1. در دایرکتوری سطح بالای پروژه خود، یک دایرکتوری برای بسته هوش مصنوعی ایجاد کنید. این نام دایرکتوری به عنوان نام بسته هوش مصنوعی استفاده می شود. نام بسته های هوش مصنوعی باید با یک حرف شروع شود و فقط شامل حروف، اعداد و زیرخط باشد.
  2. در پوشه AI pack یک فایل build.gradle ایجاد کنید و کد زیر را اضافه کنید. حتماً نام بسته هوش مصنوعی و فقط یک نوع تحویل را مشخص کنید:

    // 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. در فایل برنامه build.gradle پروژه، نام هر بسته هوش مصنوعی را در پروژه خود مانند تصویر زیر اضافه کنید:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. در فایل settings.gradle پروژه، تمام بسته‌های هوش مصنوعی را مانند شکل زیر در پروژه خود قرار دهید:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. در بسته هوش مصنوعی خود، یک دایرکتوری src/main/assets/ ایجاد کنید.

  6. مدل های خود را در دایرکتوری src/main/assets قرار دهید. در اینجا نیز می توانید زیر شاخه ها را ایجاد کنید. ساختار دایرکتوری برنامه شما اکنون باید به شکل زیر باشد:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. برای بارگذاری و اجرای مدل های خود کد اضافه کنید. نحوه انجام این کار به حالت تحویل بسته های هوش مصنوعی شما بستگی دارد. دستورالعمل‌های مربوط به زمان نصب و دنبال کردن سریع/طبق تقاضا را در زیر ببینید.

  8. [اختیاری] هدف گذاری دستگاه را برای ارائه مدل های مختلف به دستگاه های مختلف پیکربندی کنید .

  9. بسته نرم افزاری اندروید را با Gradle بسازید . در بسته نرم افزاری تولید شده، دایرکتوری سطح ریشه اکنون شامل موارد زیر است:

    • ai-pack-name/manifest/AndroidManifest.xml : شناسه بسته هوش مصنوعی و حالت تحویل را پیکربندی می کند
    • ai-pack-name/assets/your-model-directories : دایرکتوری حاوی تمام دارایی های ارائه شده به عنوان بخشی از بسته هوش مصنوعی است.

    Gradle مانیفست را برای هر بسته هوش مصنوعی تولید می کند و فهرست assets/ فهرست را برای شما خروجی می دهد.

پیکربندی تحویل زمان نصب

بسته‌های هوش مصنوعی که به‌عنوان زمان نصب پیکربندی شده‌اند، بلافاصله با راه‌اندازی برنامه در دسترس هستند. از Java AssetManager API برای دسترسی به بسته های هوش مصنوعی در این حالت استفاده کنید:

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

تحویل سریع و درخواستی را پیکربندی کنید

برای دانلود بسته های هوش مصنوعی با تحویل سریع یا درخواستی، از کتابخانه تحویل هوش مصنوعی Play استفاده کنید.

وابستگی خود را به کتابخانه تحویل هوش مصنوعی Play اعلام کنید

در فایل build.gradle برنامه خود، یک وابستگی به کتابخانه تحویل هوش مصنوعی Play اعلام کنید:

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

وضعیت را بررسی کنید

هر بسته هوش مصنوعی در یک پوشه جداگانه در حافظه داخلی برنامه ذخیره می شود. از متد getPackLocation() برای تعیین پوشه ریشه یک بسته هوش مصنوعی استفاده کنید. این متد مقادیر زیر را برمی گرداند:

ارزش برگشتی وضعیت
یک شیء معتبر AiPackLocation پوشه ریشه بسته هوش مصنوعی برای دسترسی فوری در assetsPath() آماده است.
null بسته‌های هوش مصنوعی یا بسته‌های هوش مصنوعی ناشناخته در دسترس نیستند

دریافت اطلاعات دانلود در مورد بسته های هوش مصنوعی

استفاده کنید
متد getPackStates() برای تعیین اندازه دانلود و اینکه آیا بسته در حال بارگیری است یا خیر.

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

getPackStates() یک روش ناهمزمان است که Task<AiPackStates> برمی گرداند. متد packStates() یک شی AiPackStates یک Map<String, AiPackState> را برمی گرداند. این نقشه شامل وضعیت هر بسته هوش مصنوعی درخواستی است که با نام آن کلید زده شده است:

Map<String, AiPackState> AiPackStates#packStates()

درخواست نهایی با موارد زیر نشان داده می شود:

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;
            });

روش‌های AiPackState زیر اندازه بسته هوش مصنوعی، مقدار دانلود شده تا کنون (در صورت درخواست) و مبلغی که قبلاً به برنامه منتقل شده است را ارائه می‌کند:

برای دریافت وضعیت یک بسته هوش مصنوعی، از متد status() استفاده کنید، که وضعیت را به صورت یک عدد صحیح که مربوط به یک فیلد ثابت در کلاس AiPackStatus است، برمی‌گرداند. بسته هوش مصنوعی که هنوز نصب نشده است وضعیت AiPackStatus.NOT_INSTALLED را دارد.

اگر درخواستی با شکست مواجه شد، از روش errorCode() استفاده کنید که مقدار بازگشتی آن مربوط به یک فیلد ثابت در کلاس AiPackErrorCode است.

نصب کنید

از متد fetch() برای دانلود یک بسته هوش مصنوعی برای اولین بار استفاده کنید یا برای تکمیل به روز رسانی یک بسته هوش مصنوعی تماس بگیرید:

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

این روش یک شی AiPackStates حاوی لیستی از بسته ها و حالت ها و اندازه های دانلود اولیه آنها را برمی گرداند. اگر بسته AI درخواست شده از طریق fetch() در حال بارگیری باشد، وضعیت دانلود برگردانده می شود و دانلود اضافی شروع نمی شود.

وضعیت های دانلود را مانیتور کنید

برای ردیابی پیشرفت نصب بسته های هوش مصنوعی باید یک AiPackStateUpdateListener پیاده سازی کنید. به‌روزرسانی‌های وضعیت در هر بسته برای پشتیبانی از ردیابی وضعیت بسته‌های هوش مصنوعی جداگانه تجزیه می‌شوند. می‌توانید قبل از تکمیل همه دانلودهای دیگر برای درخواستتان، استفاده از بسته‌های هوش مصنوعی موجود را شروع کنید.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
دانلودهای بزرگ

اگر دانلود بزرگتر از 200 مگابایت باشد و کاربر از Wi-Fi استفاده نکند، دانلود شروع نمی شود تا زمانی که کاربر صریحاً رضایت خود را برای ادامه دانلود با استفاده از اتصال داده تلفن همراه اعلام کند. به همین ترتیب، اگر بارگیری زیاد باشد و کاربر Wi-Fi را از دست بدهد، دانلود متوقف می‌شود و برای ادامه با استفاده از اتصال داده تلفن همراه، رضایت صریح لازم است. یک بسته متوقف شده دارای وضعیت WAITING_FOR_WIFI است. برای راه اندازی جریان UI برای درخواست رضایت از کاربر، از متد showConfirmationDialog() استفاده کنید.

توجه داشته باشید که اگر برنامه این روش را فراخوانی نکند، دانلود متوقف می‌شود و تنها زمانی که کاربر به اتصال Wi-Fi بازگشته است، به‌طور خودکار از سر گرفته می‌شود.

تایید کاربر مورد نیاز است

اگر بسته ای دارای وضعیت REQUIRES_USER_CONFIRMATION باشد، دانلود ادامه نمی یابد تا زمانی که کاربر گفتگوی نشان داده شده با showConfirmationDialog() را نپذیرد. این وضعیت زمانی رخ می‌دهد که برنامه توسط Play شناسایی نشود—مثلاً اگر برنامه جانبی بارگذاری شده باشد. توجه داشته باشید که فراخوانی showConfirmationDialog() در این حالت باعث به‌روزرسانی برنامه می‌شود. پس از به روز رسانی، باید دوباره بسته های هوش مصنوعی را درخواست کنید.

در زیر نمونه ای از اجرای شنونده است:

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

همچنین، می‌توانید از متد getPackStates() برای دریافت وضعیت دانلودهای فعلی استفاده کنید. AiPackStates شامل پیشرفت دانلود، وضعیت دانلود و هر گونه کد خطای خطا است.

دسترسی به بسته های هوش مصنوعی

پس از اینکه درخواست دانلود به حالت COMPLETED رسید، می‌توانید با استفاده از تماس‌های سیستم فایل به بسته هوش مصنوعی دسترسی پیدا کنید. از متد getPackLocation() برای دریافت پوشه ریشه بسته هوش مصنوعی استفاده کنید.

بسته های هوش مصنوعی در فهرست assets در دایرکتوری ریشه بسته هوش مصنوعی ذخیره می شوند. با استفاده از روش راحتی assetsPath() می توانید مسیر دایرکتوری assets را دریافت کنید. برای رسیدن به یک دارایی خاص از روش زیر استفاده کنید:

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

هدف گذاری دستگاه را پیکربندی کنید

می‌توانید دستورالعمل‌های هدف‌گیری دستگاه را دنبال کنید تا دستگاه‌ها یا گروه‌هایی از دستگاه‌هایی را که باید بسته‌های هوش مصنوعی شما را دریافت کنند، مشخص کنید.

سایر روش‌های Play AI Delivery API

در زیر چند روش API اضافی وجود دارد که ممکن است بخواهید در برنامه خود استفاده کنید.

لغو درخواست

cancel() برای لغو درخواست بسته AI فعال استفاده کنید. توجه داشته باشید که این درخواست بهترین عملیات است.

یک بسته هوش مصنوعی را بردارید

از removePack() برای برنامه ریزی حذف بسته هوش مصنوعی استفاده کنید.

مکان های بسته های هوش مصنوعی متعدد را دریافت کنید

از getPackLocations() برای پرس و جو کردن وضعیت چندین بسته هوش مصنوعی به صورت انبوه استفاده کنید که نقشه بسته های هوش مصنوعی و مکان آنها را برمی گرداند. نقشه برگردانده شده توسط getPackLocations() حاوی یک ورودی برای هر بسته است که در حال حاضر دانلود شده و به روز شده است.

هدف گذاری دستگاه

هدف‌گیری دستگاه به شما کنترل دقیق‌تری بر روی بخش‌هایی از بسته برنامه شما به دستگاه‌های خاص تحویل می‌دهد. برای مثال، می‌توانید اطمینان حاصل کنید که یک مدل بزرگ فقط به دستگاه‌هایی با RAM بالا تحویل داده می‌شود یا می‌توانید نسخه‌های مختلف یک مدل را به دستگاه‌های مختلف تحویل دهید.

شما می توانید ویژگی های دستگاه مانند:

مروری بر مراحل مورد نیاز

مراحل زیر برای فعال کردن هدف گذاری دستگاه مورد نیاز است:

  1. گروه های دستگاه خود را در یک فایل XML تعریف کنید.
  2. مشخص کنید کدام بخش از بسته شما باید به کدام گروه دستگاه برود.
  3. [اختیاری] پیکربندی خود را به صورت محلی آزمایش کنید.
  4. بسته نرم افزاری خود (حاوی فایل XML) را در Google Play آپلود کنید.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از هدف گیری دستگاه، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.10.0-alpha01 باشد. این با Android Studio Meerkat 2 که در قناری است بسته بندی شده است.

این قابلیت را در افزونه Gradle اندروید فعال کنید

هدف گذاری دستگاه باید به صراحت در فایل gradle.properties شما فعال باشد:

android.experimental.enableDeviceTargetingConfigApi=true

یک فایل XML پیکربندی هدفمند دستگاه ایجاد کنید

فایل پیکربندی هدف گیری دستگاه یک فایل XML است که در آن گروه های دستگاه سفارشی خود را تعریف می کنید. به عنوان مثال، می توانید یک گروه دستگاه به نام qti_v79 تعریف کنید که شامل تمام دستگاه های دارای سیستم 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>

یک گروه دستگاه از حداکثر 5 انتخابگر دستگاه تشکیل شده است. یک دستگاه در صورتی در گروه دستگاه گنجانده می شود که هر یک از انتخابگرهای دستگاه خود را برآورده کند.

انتخابگر دستگاه می تواند یک یا چند ویژگی دستگاه داشته باشد. دستگاهی انتخاب می شود که با تمام ویژگی های دستگاه انتخابگر مطابقت داشته باشد.

اگر دستگاهی با چندین گروه مطابقت داشته باشد، محتوای گروهی که ابتدا در فایل XML تعریف شده است به آن ارائه می شود. ترتیبی که گروه ها را در فایل XML تعریف می کنید، ترتیب اولویت شماست.

اگر دستگاهی با هیچ گروهی مطابقت نداشته باشد، گروه «دیگر» پیش‌فرض را دریافت می‌کند. این گروه به طور خودکار ایجاد می شود و نباید به صراحت تعریف شود.

ویژگی های دستگاه موجود

  • device_ram : مورد نیاز رم دستگاه
    • min_bytes ( شامل) : حداقل RAM مورد نیاز (بر حسب بایت)
    • max_bytes ( انحصاری) : حداکثر RAM مورد نیاز (بر حسب بایت)
  • include_device_ids : مدل‌های دستگاهی که باید در این انتخابگر گنجانده شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هر ID_ID موجود در لیست مطابقت داشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • excluded_device_ids : مدل‌های دستگاهی که در این انتخابگر حذف می‌شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هیچ device_id در لیست مطابقت نداشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • require_system_features : ویژگی هایی که یک دستگاه باید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . یک دستگاه باید تمام ویژگی های سیستم را در این لیست داشته باشد تا این ویژگی را برآورده کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • forbidden_system_features : ویژگی هایی که یک دستگاه نباید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . اگر دستگاهی دارای یکی از ویژگی های سیستم در این لیست باشد، این ویژگی را برآورده نمی کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • system-on-chip : سیستم روی تراشه‌هایی که باید در این انتخابگر گنجانده شود. یک دستگاه باید هر چیپ را در این لیست داشته باشد تا این ویژگی را برآورده کند.

در اینجا یک مثال نشان می دهد که تمام ویژگی های ممکن دستگاه را نشان می دهد:

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

کدهای رسمی سازنده دستگاه و مدل دستگاه

می‌توانید قالب‌بندی صحیح سازنده دستگاه و کد مدل را با استفاده از کاتالوگ دستگاه در کنسول Google Play، با یکی از موارد زیر پیدا کنید:

  • بازرسی دستگاه‌های جداگانه با استفاده از کاتالوگ دستگاه، و یافتن کد سازنده و مدل در مکان‌هایی که در مثال زیر نشان داده شده است (برای Google Pixel 4a، سازنده «Google» و کد مدل «sunfish» است)».

    صفحه پیکسل 4a در کاتالوگ دستگاه

    صفحه پیکسل 4a در کاتالوگ دستگاه

  • دانلود CSV دستگاه‌های پشتیبانی‌شده و استفاده از کد سازنده و مدل کد به ترتیب برای فیلدهای build_brand و build_device .

فایل پیکربندی هدفمندی دستگاه خود را در بسته برنامه خود قرار دهید

موارد زیر را به فایل build.gradle ماژول اصلی خود اضافه کنید:

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 مسیر فایل پیکربندی شما نسبت به ماژول اصلی است. این تضمین می کند که فایل پیکربندی شما با بسته نرم افزاری شما بسته بندی شده است.

بند deviceGroup تضمین می‌کند که فایل‌های APK تولید شده از بسته شما بر اساس گروه‌های دستگاه تقسیم می‌شوند.

از هدف گیری دستگاه برای بسته های هوش مصنوعی خود استفاده کنید

فقط با تحویل مدل‌های بزرگ خود به دستگاه‌هایی که می‌توانند آن‌ها را اجرا کنند، می‌توانید اندازه را روی دستگاه‌ها بهینه نگه دارید.

بسته‌های هوش مصنوعی خود را با استفاده از فهرست‌های بسته AI موجود که در مرحله آخر ایجاد شده‌اند، بر اساس گروه‌های دستگاه تقسیم کنید، و پوشه‌های مناسب (همانطور که در زیر توضیح داده شده است) را با استفاده از #group_myCustomGroup1، #group_myCustomGroup2، و غیره پس از رفع مشکل، پس از تعمیر قرار دهید. هنگام استفاده از بسته‌های AI در برنامه خود، نیازی به آدرس‌دهی پوشه‌ها با کلمات دیگر با postfix نیست.

بعد از مرحله قبل، ممکن است به صورت زیر باشد:

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

در این مثال، شما ai-pack-name/assets/image-classifier/ بدون هیچ پسوندی اشاره می کنید.

دستگاه‌های myCustomGroup1 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup1/ دریافت خواهند کرد، در حالی که دستگاه‌های myCustomGroup2 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup2/ دریافت خواهند کرد.

دستگاه‌هایی که به myCustomGroup1 یا myCustomGroup2 تعلق ندارند، یک بسته ai-pack-name خالی دریافت خواهند کرد.

این به این دلیل است که دستگاه‌هایی که با هیچ گروه دستگاهی مطابقت ندارند، نوع پیش‌فرض بسته هوش مصنوعی شما را دریافت خواهند کرد. این شامل هر چیزی است که داخل یک فهرست با پسوند #group_suffix نیست.

هنگامی که بسته هوش مصنوعی را دانلود کردید، می توانید با استفاده از AssetManager برای بسته های زمان نصب یا AiPackManager برای بسته های سریع و درخواستی بررسی کنید که آیا مدل شما موجود است یا خیر. نمونه هایی برای انجام این کار برای همه حالت های تحویل در برنامه نمونه نشان داده شده است.

از هدف گذاری دستگاه برای ماژول های ویژگی خود استفاده کنید

همچنین می توانید از هدف گذاری دستگاه برای ماژول های ویژگی استفاده کنید. به جای تقسیم ماژول های ویژگی بر اساس گروه دستگاه، مشخص می کنید که آیا کل ماژول باید بر اساس عضویت در گروه دستگاه تحویل داده شود یا خیر.

برای ارائه یک ماژول ویژگی به دستگاه‌هایی که متعلق به myCustomGroup1 یا myCustomGroup2 هستند، AndroidManifest.xml آن را تغییر دهید:

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

به صورت محلی تست کنید

قبل از ایجاد نسخه برای بسته جدید خود، می‌توانید به صورت محلی با اشتراک‌گذاری برنامه داخلی یا Bundletool آزمایش کنید.

اشتراک گذاری داخلی برنامه

اشتراک‌گذاری داخلی برنامه به شما امکان می‌دهد از یک بسته برنامه برای ایجاد سریع یک URL استفاده کنید که می‌توانید روی آن ضربه بزنید تا دقیقاً همان چیزی را که Google Play برای آن دستگاه نصب می‌کرد، نصب کنید، اگر آن نسخه از برنامه در مسیر آزمایشی یا تولیدی پخش می‌شد.

به دستورالعمل های اشتراک گذاری داخلی برنامه نگاهی بیندازید.

Bundletool

از طرف دیگر، می‌توانید فایل‌های APK را با استفاده از bundletool (1.18.0 یا بالاتر) تولید کنید و آن‌ها را روی دستگاه خود بارگذاری کنید. این مراحل را برای آزمایش برنامه خود به صورت محلی با استفاده از bundletool دنبال کنید:

  1. بسته نرم افزاری خود را با Android Studio یا bundletool بسازید.

  2. APK با پرچم --local-testing ایجاد کنید:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. یک دستگاه را وصل کنید و bundletool برای بارگذاری جانبی فایل‌های APK اجرا کنید:

    # 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
    

محدودیت‌های آزمایش محلی با bundletool

محدودیت‌های آزمایش محلی با bundletool به شرح زیر است:

  • بسته های fast-follow مانند بسته های on-demand عمل می کنند. به این معنی که هنگام بارگذاری جانبی برنامه، آنها به طور خودکار واکشی نمی شوند. وقتی برنامه شروع به کار کرد، توسعه دهندگان باید آنها را به صورت دستی درخواست کنند. این نیازی به تغییر کد در برنامه شما ندارد.
  • بسته‌ها به جای Play از حافظه خارجی واکشی می‌شوند، بنابراین نمی‌توانید نحوه عملکرد کدتان را در صورت بروز خطاهای شبکه آزمایش کنید.
  • آزمایش محلی سناریوی انتظار برای Wi-Fi را پوشش نمی دهد.
  • به روز رسانی ها پشتیبانی نمی شوند. قبل از نصب نسخه جدید بیلد خود، نسخه قبلی را به صورت دستی حذف نصب کنید.

بررسی کنید که APK های صحیح در حال نصب هستند

از روش زیر برای اطمینان از نصب APK های صحیح روی دستگاه استفاده کنید

adb shell pm path {packageName}

شما باید چیزی شبیه به:

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

توجه داشته باشید که در این لیست فقط فایل‌های APK را خواهید دید که از ماژول‌های ویژگی و بسته‌های هوش مصنوعی در زمان نصب ساخته شده‌اند. بسته‌های هوش مصنوعی درخواستی و سریع به‌عنوان APK نصب نمی‌شوند.

تست کنید و در گوگل پلی منتشر کنید

توصیه می‌کنیم برنامه خود را از سر تا سر در Google Play با یک مسیر آزمایشی داخلی آزمایش کنید.

هنگامی که این کار را انجام دادید، می‌توانید به‌روزرسانی برنامه‌تان را به‌صورت تدریجی برای تولید با عرضه‌های مرحله‌ای منتشر کنید.

نمونه برنامه با استفاده از Play for On-Device AI

برای دسترسی به برنامه نمونه ما با مدیر شریک Google Play خود تماس بگیرید.

نحوه استفاده از هر یک از حالت های تحویل و همچنین پیکربندی هدف گیری دستگاه را نشان می دهد. برای شروع به بخش تست محلی مراجعه کنید.

بازخورد ارائه دهید

شرکت کنندگان در برنامه دسترسی اولیه باید مشکلات را گزارش کرده و بازخورد ارائه کنند. می‌توانید با مدیر شریک Google Play خود تماس بگیرید یا با تیم هوش مصنوعی Play for On-Device تماس بگیرید.

درباره Android App Bundles بیشتر بیاموزید و مراجع AI Delivery SDK را بخوانید.

،

مقدمه

Play for On-Device AI مزایای Android App Bundles و تحویل Google Play را به توزیع سفارشی مدل ML می‌آورد تا بتوانید بدون هزینه اضافی عملکرد مدل را با پیچیدگی کمتر اکوسیستم بهبود بخشید. این به شما امکان می‌دهد یک مصنوع واحد را در Play منتشر کنید که حاوی کد، دارایی‌ها، و مدل‌های ML شماست و از بین تعدادی حالت تحویل و گزینه‌های هدف انتخاب کنید.

مزایا

  • یک مصنوع انتشارات را در Google Play آپلود کنید و میزبانی، تحویل، به‌روزرسانی‌ها و هدف‌یابی را بدون هزینه اضافی به Play واگذار کنید.
  • مدل های ML خود را در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل دهید.
    • تحویل در زمان نصب می تواند تضمین کند که یک مدل بسیار بزرگ هنگام باز شدن برنامه شما وجود دارد. مدل شما به صورت APK نصب خواهد شد.
    • پس از نصب برنامه، تحویل سریع به‌طور خودکار در پس‌زمینه انجام می‌شود. کاربران ممکن است برنامه شما را قبل از دانلود کامل مدل شما باز کنند. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
    • تحویل برحسب تقاضا به شما امکان می‌دهد مدل را در زمان اجرا درخواست کنید، که اگر مدل فقط برای جریان‌های کاربر خاصی مورد نیاز باشد، مفید است. مدل شما در فضای ذخیره سازی داخلی برنامه شما دانلود می شود.
  • انواع مدل‌های ML خود را ارائه دهید که بر اساس مدل دستگاه، ویژگی‌های سیستم یا RAM برای دستگاه‌های خاصی هدف قرار می‌گیرند.
  • به‌روزرسانی‌های برنامه را با وصله خودکار Play کوچک و بهینه نگه دارید، به این معنی که فقط تفاوت‌های موجود در فایل‌ها باید دانلود شوند.

ملاحظات

  • با استفاده از Play for On-Device AI، با شرایط مندرج در توافقنامه توزیع برنامه‌نویس Google Play و شرایط خدمات کیت توسعه نرم‌افزار Play Core موافقت می‌کنید.
  • انتظار می رود توسعه دهندگان شرکت کننده در برنامه دسترسی زودهنگام Play را برای هوش مصنوعی روی دستگاه ارزیابی کنند و بازخورد خود را به Google Play ارائه دهند.
  • مدل‌های دانلود شده توسط Play for On-Device AI فقط توسط برنامه‌ای که مدل را دانلود کرده می‌تواند استفاده کند. مدل‌ها نباید به برنامه‌های دیگر ارائه شوند، مثلاً از طریق اتصال سرویس.
  • بسته‌های هوش مصنوعی می‌توانند تا 1.5 گیگابایت بر اساس اندازه‌های دانلود فشرده‌شان باشند. حداکثر اندازه تجمعی برنامه هر نسخه از برنامه شما که از بسته برنامه شما تولید شده است 4 گیگابایت است.
  • برنامه‌های بیش از ۱ گیگابایت باید حداقل سطح SDK را روی ۲۱ یا بالاتر تنظیم کنند.
  • در طول برنامه دسترسی زودهنگام، Play for On-Device AI ممکن است تغییر کند.

نحوه استفاده از Play for On-Device AI

Play for On-Device AI از بسته های هوش مصنوعی استفاده می کند. شما مدل‌های سفارشی را که برای توزیع در بسته‌های هوش مصنوعی آماده هستند در بسته برنامه خود بسته‌بندی می‌کنید. شما می‌توانید انتخاب کنید که بسته هوش مصنوعی در زمان نصب، دنبال کردن سریع یا بر اساس تقاضا تحویل داده شود.

با بسته‌بندی بسته‌های هوش مصنوعی با بسته برنامه خود، می‌توانید از همه ابزارهای آزمایشی و انتشار موجود Play، مانند آهنگ‌های آزمایشی و عرضه‌های مرحله‌ای برای مدیریت توزیع برنامه‌تان با مدل‌های سفارشی‌تان استفاده کنید.

بسته های هوش مصنوعی همراه با باینری برنامه به روز می شوند. اگر نسخه جدید برنامه شما تغییراتی در بسته هوش مصنوعی ایجاد نمی کند، فرآیند وصله خودکار Play باعث می شود کاربر مجبور به دانلود مجدد آن نباشد. وقتی برنامه را به‌روزرسانی می‌کند، Play فقط آنچه را که تغییر کرده است دانلود می‌کند.

بسته های هوش مصنوعی فقط شامل مدل هستند. جاوا/کاتلین و کتابخانه های بومی مجاز نیستند. اگر برای اجرای مدل ML خود نیاز به ارسال کتابخانه ها یا کد دارید، آن را به ماژول پایه یا یک ماژول ویژگی منتقل کنید. می توانید ماژول ویژگی خود را به گونه ای پیکربندی کنید که تنظیمات دانلود و هدف گذاری مشابه بسته هوش مصنوعی داشته باشد.

از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید

می توانید از LiteRT و MediaPipe با بسته های هوش مصنوعی استفاده کنید. مدل خود را در یک بسته هوش مصنوعی بسته بندی کنید و سپس با استفاده از دستورالعمل های بسته های زمان نصب یا بسته های سریع و درخواستی به آن دسترسی پیدا کنید.

مطالعه بیشتر:

  • شروع با LiteRT
    • برنامه نمونه نشان می دهد که چگونه می توانید یک مدل LiteRT را در یک بسته هوش مصنوعی بسته بندی کنید و آن را در زمان اجرا بارگذاری کنید.
    • بسیاری از مدل های LiteRT از قبل آموزش دیده وجود دارد که می توانید در بسته های هوش مصنوعی برای شروع استفاده کنید.
  • شروع کار با MediaPipe
    • برای بسته‌های سریع دنبال و درخواستی، می‌توانید از AssetCache.java برای بارگیری دارایی‌های خود (مانند فایل‌های .binarypb ) از طریق مسیرهای فایل‌شان استفاده کنید.
    • برای بسته‌های زمان نصب، می‌توانید از AndroidAssetUtil.java استفاده کنید.

با بسته های هوش مصنوعی شروع کنید

در سطح بالا، در اینجا نحوه شروع استفاده از Play for On-Device AI آورده شده است:

  1. شناسه حساب توسعه‌دهنده Play خود را برای پیوستن به EAP به Google Play ارائه دهید.
  2. مدل‌های خود را در بسته‌های هوش مصنوعی در Android App Bundle خود بسته‌بندی کنید و نحوه تحویل بسته‌های هوش مصنوعی را مشخص کنید.
  3. [اختیاری] اگر می‌خواهید مدل‌های مختلف را به دستگاه‌های مختلف تحویل دهید، می‌توانید هدف‌گیری دستگاه را برای بسته‌های هوش مصنوعی خود پیکربندی کنید . برای مثال، می‌توانید بسته هوش مصنوعی A را به یک مدل دستگاه خاص، بسته هوش مصنوعی B را به دستگاه‌هایی با حداقل 6 گیگابایت رم تحویل دهید، و همه دستگاه‌های دیگر نمی‌توانند هیچ مدلی دریافت کنند.
  4. [اختیاری] اگر از تحویل درخواستی یا پیگیری سریع استفاده می‌کنید، کتابخانه Play AI Delivery را در برنامه خود ادغام کنید تا بسته‌های هوش مصنوعی خود را در صورت نیاز دانلود کنید.
  5. بسته نرم افزاری خود را آزمایش کرده و در Google Play منتشر کنید.

شناسه حساب توسعه دهنده Play خود را ارائه دهید

از آنجایی که این ویژگی در دسترسی اولیه است، برای دسترسی به Play for On-Device AI حساب توسعه‌دهنده شما باید در فهرست مجاز باشد. شناسه‌های حساب توسعه‌دهنده Play و نام‌های بسته برنامه را به مدیر شریک Google Play یا عضو تیم هوش مصنوعی Play for On-Device تأیید کنید. مشخص کنید که آیا مدل های خود را برای دستگاه های خاصی هدف قرار خواهید داد (این مرحله 3 از بخش قبل است). در حال حاضر، ما از شرکای منتخب Play دعوت می کنیم تا این ویژگی را آزمایش کنند.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از بسته های هوش مصنوعی، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.8 باشد. این نسخه با اندروید استودیو لیدی باگ 2 بسته بندی شده است.

مدل خود را در یک بسته هوش مصنوعی استخراج کنید

Android Studio برای مراحل زیر مورد نیاز نیست.

  1. در دایرکتوری سطح بالای پروژه خود، یک دایرکتوری برای بسته هوش مصنوعی ایجاد کنید. این نام دایرکتوری به عنوان نام بسته هوش مصنوعی استفاده می شود. نام بسته های هوش مصنوعی باید با یک حرف شروع شود و فقط شامل حروف، اعداد و زیرخط باشد.
  2. در پوشه AI pack یک فایل build.gradle ایجاد کنید و کد زیر را اضافه کنید. حتماً نام بسته هوش مصنوعی و فقط یک نوع تحویل را مشخص کنید:

    // 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. در فایل برنامه build.gradle پروژه، نام هر بسته هوش مصنوعی را در پروژه خود مانند تصویر زیر اضافه کنید:

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":ai-pack-name", ":ai-pack2-name"]
    }
    
  4. در فایل settings.gradle پروژه، تمام بسته‌های هوش مصنوعی را مانند شکل زیر در پروژه خود قرار دهید:

    // In the settings.gradle file:
    include ':app'
    include ':ai-pack-name'
    include ':ai-pack2-name'
    
  5. در بسته هوش مصنوعی خود، یک دایرکتوری src/main/assets/ ایجاد کنید.

  6. مدل های خود را در دایرکتوری src/main/assets قرار دهید. در اینجا نیز می توانید زیر شاخه ها را ایجاد کنید. ساختار دایرکتوری برنامه شما اکنون باید به شکل زیر باشد:

    • build.gradle
    • settings.gradle
    • app/
    • ai-pack-name/build.gradle
    • ai-pack-name/src/main/assets/your-model-directories
  7. برای بارگذاری و اجرای مدل های خود کد اضافه کنید. نحوه انجام این کار به حالت تحویل بسته های هوش مصنوعی شما بستگی دارد. دستورالعمل‌های مربوط به زمان نصب و دنبال کردن سریع/طبق تقاضا را در زیر ببینید.

  8. [اختیاری] هدف گذاری دستگاه را برای ارائه مدل های مختلف به دستگاه های مختلف پیکربندی کنید .

  9. بسته نرم افزاری اندروید را با Gradle بسازید . در بسته نرم افزاری تولید شده، دایرکتوری سطح ریشه اکنون شامل موارد زیر است:

    • ai-pack-name/manifest/AndroidManifest.xml : شناسه بسته هوش مصنوعی و حالت تحویل را پیکربندی می کند
    • ai-pack-name/assets/your-model-directories : دایرکتوری حاوی تمام دارایی های ارائه شده به عنوان بخشی از بسته هوش مصنوعی است.

    Gradle مانیفست را برای هر بسته هوش مصنوعی تولید می کند و فهرست assets/ فهرست را برای شما خروجی می دهد.

پیکربندی تحویل زمان نصب

بسته‌های هوش مصنوعی که به‌عنوان زمان نصب پیکربندی شده‌اند، بلافاصله با راه‌اندازی برنامه در دسترس هستند. از Java AssetManager API برای دسترسی به بسته های هوش مصنوعی در این حالت استفاده کنید:

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

تحویل سریع و درخواستی را پیکربندی کنید

برای دانلود بسته های هوش مصنوعی با تحویل سریع یا درخواستی، از کتابخانه تحویل هوش مصنوعی Play استفاده کنید.

وابستگی خود را به کتابخانه تحویل هوش مصنوعی Play اعلام کنید

در فایل build.gradle برنامه خود، یک وابستگی به کتابخانه تحویل هوش مصنوعی Play اعلام کنید:

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

وضعیت را بررسی کنید

هر بسته هوش مصنوعی در یک پوشه جداگانه در حافظه داخلی برنامه ذخیره می شود. از متد getPackLocation() برای تعیین پوشه ریشه یک بسته هوش مصنوعی استفاده کنید. این متد مقادیر زیر را برمی گرداند:

ارزش برگشتی وضعیت
یک شیء معتبر AiPackLocation پوشه ریشه بسته هوش مصنوعی برای دسترسی فوری در assetsPath() آماده است.
null بسته‌های هوش مصنوعی یا بسته‌های هوش مصنوعی ناشناخته در دسترس نیستند

دریافت اطلاعات دانلود در مورد بسته های هوش مصنوعی

استفاده کنید
متد getPackStates() برای تعیین اندازه دانلود و اینکه آیا بسته در حال بارگیری است یا خیر.

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

getPackStates() یک روش ناهمزمان است که Task<AiPackStates> برمی گرداند. متد packStates() یک شی AiPackStates یک Map<String, AiPackState> را برمی گرداند. این نقشه شامل وضعیت هر بسته هوش مصنوعی درخواستی است که با نام آن کلید زده شده است:

Map<String, AiPackState> AiPackStates#packStates()

درخواست نهایی با موارد زیر نشان داده می شود:

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;
            });

روش‌های AiPackState زیر اندازه بسته هوش مصنوعی، مقدار دانلود شده تا کنون (در صورت درخواست) و مبلغی که قبلاً به برنامه منتقل شده است را ارائه می‌کند:

برای دریافت وضعیت یک بسته هوش مصنوعی، از متد status() استفاده کنید، که وضعیت را به صورت یک عدد صحیح که مربوط به یک فیلد ثابت در کلاس AiPackStatus است، برمی‌گرداند. بسته هوش مصنوعی که هنوز نصب نشده است وضعیت AiPackStatus.NOT_INSTALLED را دارد.

اگر درخواستی با شکست مواجه شد، از روش errorCode() استفاده کنید که مقدار بازگشتی آن مربوط به یک فیلد ثابت در کلاس AiPackErrorCode است.

نصب کنید

از متد fetch() برای دانلود یک بسته هوش مصنوعی برای اولین بار استفاده کنید یا برای تکمیل به روز رسانی یک بسته هوش مصنوعی تماس بگیرید:

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

این روش یک شی AiPackStates حاوی لیستی از بسته ها و حالت ها و اندازه های دانلود اولیه آنها را برمی گرداند. اگر بسته AI درخواست شده از طریق fetch() در حال بارگیری باشد، وضعیت دانلود برگردانده می شود و دانلود اضافی شروع نمی شود.

وضعیت های دانلود را مانیتور کنید

برای ردیابی پیشرفت نصب بسته های هوش مصنوعی باید یک AiPackStateUpdateListener پیاده سازی کنید. به‌روزرسانی‌های وضعیت در هر بسته برای پشتیبانی از ردیابی وضعیت بسته‌های هوش مصنوعی جداگانه تجزیه می‌شوند. می‌توانید قبل از تکمیل همه دانلودهای دیگر برای درخواستتان، استفاده از بسته‌های هوش مصنوعی موجود را شروع کنید.

void registerListener(AiPackStateUpdateListener listener)
void unregisterListener(AiPackStateUpdateListener listener)
دانلودهای بزرگ

اگر دانلود بزرگتر از 200 مگابایت باشد و کاربر از Wi-Fi استفاده نکند، دانلود شروع نمی شود تا زمانی که کاربر صریحاً رضایت خود را برای ادامه دانلود با استفاده از اتصال داده تلفن همراه اعلام کند. به همین ترتیب، اگر بارگیری زیاد باشد و کاربر Wi-Fi را از دست بدهد، دانلود متوقف می‌شود و برای ادامه با استفاده از اتصال داده تلفن همراه، رضایت صریح لازم است. یک بسته متوقف شده دارای وضعیت WAITING_FOR_WIFI است. برای راه اندازی جریان UI برای درخواست رضایت از کاربر، از متد showConfirmationDialog() استفاده کنید.

توجه داشته باشید که اگر برنامه این روش را فراخوانی نکند، دانلود متوقف می‌شود و تنها زمانی که کاربر به اتصال Wi-Fi بازگشته است، به‌طور خودکار از سر گرفته می‌شود.

تایید کاربر مورد نیاز است

اگر بسته ای دارای وضعیت REQUIRES_USER_CONFIRMATION باشد، دانلود ادامه نمی یابد تا زمانی که کاربر گفتگوی نشان داده شده با showConfirmationDialog() را نپذیرد. این وضعیت زمانی رخ می‌دهد که برنامه توسط Play شناسایی نشود—مثلاً اگر برنامه جانبی بارگذاری شده باشد. توجه داشته باشید که فراخوانی showConfirmationDialog() در این حالت باعث به‌روزرسانی برنامه می‌شود. پس از به روز رسانی، باید دوباره بسته های هوش مصنوعی را درخواست کنید.

در زیر نمونه ای از اجرای شنونده است:

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

همچنین، می‌توانید از متد getPackStates() برای دریافت وضعیت دانلودهای فعلی استفاده کنید. AiPackStates شامل پیشرفت دانلود، وضعیت دانلود و هر گونه کد خطای خطا است.

دسترسی به بسته های هوش مصنوعی

پس از اینکه درخواست دانلود به حالت COMPLETED رسید، می‌توانید با استفاده از تماس‌های سیستم فایل به بسته هوش مصنوعی دسترسی پیدا کنید. از متد getPackLocation() برای دریافت پوشه ریشه بسته هوش مصنوعی استفاده کنید.

بسته های هوش مصنوعی در فهرست assets در دایرکتوری ریشه بسته هوش مصنوعی ذخیره می شوند. با استفاده از روش راحتی assetsPath() می توانید مسیر دایرکتوری assets را دریافت کنید. برای رسیدن به یک دارایی خاص از روش زیر استفاده کنید:

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

هدف گذاری دستگاه را پیکربندی کنید

می‌توانید دستورالعمل‌های هدف‌گیری دستگاه را دنبال کنید تا دستگاه‌ها یا گروه‌هایی از دستگاه‌هایی را که باید بسته‌های هوش مصنوعی شما را دریافت کنند، مشخص کنید.

سایر روش‌های Play AI Delivery API

در زیر چند روش API اضافی وجود دارد که ممکن است بخواهید در برنامه خود استفاده کنید.

لغو درخواست

cancel() برای لغو درخواست بسته AI فعال استفاده کنید. توجه داشته باشید که این درخواست بهترین عملیات است.

یک بسته هوش مصنوعی را بردارید

از removePack() برای برنامه ریزی حذف بسته هوش مصنوعی استفاده کنید.

مکان های بسته های هوش مصنوعی متعدد را دریافت کنید

از getPackLocations() برای پرس و جو کردن وضعیت چندین بسته هوش مصنوعی به صورت انبوه استفاده کنید که نقشه بسته های هوش مصنوعی و مکان آنها را برمی گرداند. نقشه برگردانده شده توسط getPackLocations() حاوی یک ورودی برای هر بسته است که در حال حاضر دانلود شده و به روز شده است.

هدف گذاری دستگاه

هدف‌گیری دستگاه به شما کنترل دقیق‌تری بر روی بخش‌هایی از بسته برنامه شما به دستگاه‌های خاص تحویل می‌دهد. برای مثال، می‌توانید اطمینان حاصل کنید که یک مدل بزرگ فقط به دستگاه‌هایی با RAM بالا تحویل داده می‌شود یا می‌توانید نسخه‌های مختلف یک مدل را به دستگاه‌های مختلف تحویل دهید.

شما می توانید ویژگی های دستگاه مانند:

مروری بر مراحل مورد نیاز

مراحل زیر برای فعال کردن هدف گذاری دستگاه مورد نیاز است:

  1. گروه های دستگاه خود را در یک فایل XML تعریف کنید.
  2. مشخص کنید کدام بخش از بسته شما باید به کدام گروه دستگاه برود.
  3. [اختیاری] پیکربندی خود را به صورت محلی آزمایش کنید.
  4. بسته نرم افزاری خود (حاوی فایل XML) را در Google Play آپلود کنید.

نسخه پلاگین Android Gradle را بررسی کنید

برای استفاده از هدف گیری دستگاه، مطمئن شوید که نسخه پلاگین Android Gradle (AGP) شما حداقل 8.10.0-alpha01 باشد. این با Android Studio Meerkat 2 که در قناری است بسته بندی شده است.

این قابلیت را در افزونه Gradle اندروید فعال کنید

هدف گذاری دستگاه باید به صراحت در فایل gradle.properties شما فعال باشد:

android.experimental.enableDeviceTargetingConfigApi=true

یک فایل XML پیکربندی هدفمند دستگاه ایجاد کنید

فایل پیکربندی هدف گیری دستگاه یک فایل XML است که در آن گروه های دستگاه سفارشی خود را تعریف می کنید. به عنوان مثال، می توانید یک گروه دستگاه به نام qti_v79 تعریف کنید که شامل تمام دستگاه های دارای سیستم 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>

یک گروه دستگاه از حداکثر 5 انتخابگر دستگاه تشکیل شده است. یک دستگاه در صورتی در گروه دستگاه گنجانده می شود که هر یک از انتخابگرهای دستگاه خود را برآورده کند.

انتخابگر دستگاه می تواند یک یا چند ویژگی دستگاه داشته باشد. دستگاهی انتخاب می شود که با تمام ویژگی های دستگاه انتخابگر مطابقت داشته باشد.

اگر دستگاهی با چندین گروه مطابقت داشته باشد، محتوای گروهی که ابتدا در فایل XML تعریف شده است به آن ارائه می شود. ترتیبی که گروه ها را در فایل XML تعریف می کنید، ترتیب اولویت شماست.

اگر دستگاهی با هیچ گروهی مطابقت نداشته باشد، گروه «دیگر» پیش‌فرض را دریافت می‌کند. این گروه به طور خودکار ایجاد می شود و نباید به صراحت تعریف شود.

ویژگی های دستگاه موجود

  • device_ram : مورد نیاز رم دستگاه
    • min_bytes ( شامل) : حداقل RAM مورد نیاز (بر حسب بایت)
    • max_bytes ( انحصاری) : حداکثر RAM مورد نیاز (بر حسب بایت)
  • include_device_ids : مدل‌های دستگاهی که باید در این انتخابگر گنجانده شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هر ID_ID موجود در لیست مطابقت داشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • excluded_device_ids : مدل‌های دستگاهی که در این انتخابگر حذف می‌شوند (حداکثر 10000 دستگاه_ids در هر گروه) . اگر دستگاه با هیچ device_id در لیست مطابقت نداشته باشد، این ویژگی برآورده می شود.
    • build_brand : سازنده دستگاه
    • build_device : کد مدل دستگاه
  • require_system_features : ویژگی هایی که یک دستگاه باید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . یک دستگاه باید تمام ویژگی های سیستم را در این لیست داشته باشد تا این ویژگی را برآورده کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • forbidden_system_features : ویژگی هایی که یک دستگاه نباید توسط این انتخابگر گنجانده شود (حداکثر 100 ویژگی در هر گروه) . اگر دستگاهی دارای یکی از ویژگی های سیستم در این لیست باشد، این ویژگی را برآورده نمی کند.

    مرجع ویژگی های سیستم

    • نام : یک ویژگی سیستم
  • system-on-chip : سیستم روی تراشه‌هایی که باید در این انتخابگر گنجانده شود. یک دستگاه باید هر چیپ را در این لیست داشته باشد تا این ویژگی را برآورده کند.

در اینجا یک مثال نشان می دهد که تمام ویژگی های ممکن دستگاه را نشان می دهد:

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

کدهای رسمی سازنده دستگاه و مدل دستگاه

می‌توانید قالب‌بندی صحیح سازنده دستگاه و کد مدل را با استفاده از کاتالوگ دستگاه در کنسول Google Play، با یکی از موارد زیر پیدا کنید:

  • بازرسی دستگاه‌های جداگانه با استفاده از کاتالوگ دستگاه، و یافتن کد سازنده و مدل در مکان‌هایی که در مثال زیر نشان داده شده است (برای Google Pixel 4a، سازنده «Google» و کد مدل «sunfish» است)».

    صفحه پیکسل 4a در کاتالوگ دستگاه

    صفحه پیکسل 4a در کاتالوگ دستگاه

  • دانلود CSV دستگاه‌های پشتیبانی‌شده و استفاده از کد سازنده و مدل کد به ترتیب برای فیلدهای build_brand و build_device .

فایل پیکربندی هدفمندی دستگاه خود را در بسته برنامه خود قرار دهید

موارد زیر را به فایل build.gradle ماژول اصلی خود اضافه کنید:

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 مسیر فایل پیکربندی شما نسبت به ماژول اصلی است. این تضمین می کند که فایل پیکربندی شما با بسته نرم افزاری شما بسته بندی شده است.

بند deviceGroup تضمین می‌کند که فایل‌های APK تولید شده از بسته شما بر اساس گروه‌های دستگاه تقسیم می‌شوند.

از هدف گیری دستگاه برای بسته های هوش مصنوعی خود استفاده کنید

فقط با تحویل مدل‌های بزرگ خود به دستگاه‌هایی که می‌توانند آن‌ها را اجرا کنند، می‌توانید اندازه را روی دستگاه‌ها بهینه نگه دارید.

بسته‌های هوش مصنوعی خود را با استفاده از فهرست‌های بسته AI موجود که در مرحله آخر ایجاد شده‌اند، بر اساس گروه‌های دستگاه تقسیم کنید، و پوشه‌های مناسب (همانطور که در زیر توضیح داده شده است) را با استفاده از #group_myCustomGroup1، #group_myCustomGroup2، و غیره پس از رفع مشکل، پس از تعمیر قرار دهید. هنگام استفاده از بسته‌های AI در برنامه خود، نیازی به آدرس‌دهی پوشه‌ها با کلمات دیگر با postfix نیست.

بعد از مرحله قبل، ممکن است به صورت زیر باشد:

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

در این مثال، شما ai-pack-name/assets/image-classifier/ بدون هیچ پسوندی اشاره می کنید.

دستگاه‌های myCustomGroup1 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup1/ دریافت خواهند کرد، در حالی که دستگاه‌های myCustomGroup2 همه دارایی‌ها را تحت image-classifier#group_myCustomGroup2/ دریافت خواهند کرد.

دستگاه‌هایی که به myCustomGroup1 یا myCustomGroup2 تعلق ندارند، یک بسته ai-pack-name خالی دریافت خواهند کرد.

این به این دلیل است که دستگاه‌هایی که با هیچ گروه دستگاهی مطابقت ندارند، نوع پیش‌فرض بسته هوش مصنوعی شما را دریافت خواهند کرد. این شامل هر چیزی است که داخل یک فهرست با پسوند #group_suffix نیست.

هنگامی که بسته هوش مصنوعی را دانلود کردید، می توانید با استفاده از AssetManager برای بسته های زمان نصب یا AiPackManager برای بسته های سریع و درخواستی بررسی کنید که آیا مدل شما موجود است یا خیر. نمونه هایی برای انجام این کار برای همه حالت های تحویل در برنامه نمونه نشان داده شده است.

از هدف گذاری دستگاه برای ماژول های ویژگی خود استفاده کنید

همچنین می توانید از هدف گذاری دستگاه برای ماژول های ویژگی استفاده کنید. به جای تقسیم ماژول های ویژگی بر اساس گروه دستگاه، مشخص می کنید که آیا کل ماژول باید بر اساس عضویت در گروه دستگاه تحویل داده شود یا خیر.

برای ارائه یک ماژول ویژگی به دستگاه‌هایی که متعلق به myCustomGroup1 یا myCustomGroup2 هستند، AndroidManifest.xml آن را تغییر دهید:

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

به صورت محلی تست کنید

قبل از ایجاد نسخه برای بسته جدید خود، می‌توانید به صورت محلی با اشتراک‌گذاری برنامه داخلی یا Bundletool آزمایش کنید.

اشتراک گذاری داخلی برنامه

اشتراک‌گذاری داخلی برنامه به شما امکان می‌دهد از یک بسته برنامه برای ایجاد سریع یک URL استفاده کنید که می‌توانید روی آن ضربه بزنید تا دقیقاً همان چیزی را که Google Play برای آن دستگاه نصب می‌کرد، نصب کنید، اگر آن نسخه از برنامه در مسیر آزمایشی یا تولیدی پخش می‌شد.

به دستورالعمل های اشتراک گذاری داخلی برنامه نگاهی بیندازید.

Bundletool

از طرف دیگر، می‌توانید فایل‌های APK را با استفاده از bundletool (1.18.0 یا بالاتر) تولید کنید و آن‌ها را روی دستگاه خود بارگذاری کنید. این مراحل را برای آزمایش برنامه خود به صورت محلی با استفاده از bundletool دنبال کنید:

  1. بسته نرم افزاری خود را با Android Studio یا bundletool بسازید.

  2. APK با پرچم --local-testing ایجاد کنید:

    java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \
      --output=output.apks --local-testing
    
  3. یک دستگاه را وصل کنید و bundletool برای بارگذاری جانبی فایل‌های APK اجرا کنید:

    # 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
    

محدودیت‌های آزمایش محلی با bundletool

محدودیت‌های آزمایش محلی با bundletool به شرح زیر است:

  • بسته های fast-follow مانند بسته های on-demand عمل می کنند. به این معنی که هنگام بارگذاری جانبی برنامه، آنها به طور خودکار واکشی نمی شوند. وقتی برنامه شروع به کار کرد، توسعه دهندگان باید آنها را به صورت دستی درخواست کنند. این نیازی به تغییر کد در برنامه شما ندارد.
  • بسته‌ها به جای Play از حافظه خارجی واکشی می‌شوند، بنابراین نمی‌توانید نحوه عملکرد کدتان را در صورت بروز خطاهای شبکه آزمایش کنید.
  • آزمایش محلی سناریوی انتظار برای Wi-Fi را پوشش نمی دهد.
  • به روز رسانی ها پشتیبانی نمی شوند. قبل از نصب نسخه جدید بیلد خود، نسخه قبلی را به صورت دستی حذف نصب کنید.

بررسی کنید که APK های صحیح در حال نصب هستند

از روش زیر برای اطمینان از نصب APK های صحیح روی دستگاه استفاده کنید

adb shell pm path {packageName}

شما باید چیزی شبیه به:

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

توجه داشته باشید که در این لیست فقط فایل‌های APK را خواهید دید که از ماژول‌های ویژگی و بسته‌های هوش مصنوعی در زمان نصب ساخته شده‌اند. بسته‌های هوش مصنوعی درخواستی و سریع به‌عنوان APK نصب نمی‌شوند.

تست کنید و در گوگل پلی منتشر کنید

توصیه می‌کنیم برنامه خود را از سر تا سر در Google Play با یک مسیر آزمایشی داخلی آزمایش کنید.

هنگامی که این کار را انجام دادید، می‌توانید به‌روزرسانی برنامه‌تان را به‌صورت تدریجی برای تولید با عرضه‌های مرحله‌ای منتشر کنید.

نمونه برنامه با استفاده از Play for On-Device AI

برای دسترسی به برنامه نمونه ما با مدیر شریک Google Play خود تماس بگیرید.

نحوه استفاده از هر یک از حالت های تحویل و همچنین پیکربندی هدف گیری دستگاه را نشان می دهد. برای شروع به بخش تست محلی مراجعه کنید.

بازخورد ارائه دهید

شرکت کنندگان در برنامه دسترسی اولیه باید مشکلات را گزارش کرده و بازخورد ارائه کنند. می‌توانید با مدیر شریک Google Play خود تماس بگیرید یا با تیم هوش مصنوعی Play for On-Device تماس بگیرید.

درباره Android App Bundles بیشتر بیاموزید و مراجع AI Delivery SDK را بخوانید.