مقدّمة
توفّر مبادرة Play for On-device AI مزايا مجموعة حزمات تطبيق Android وميزة "العرض على Google Play" لتوزيع نماذج الذكاء الاصطناعي المخصّصة، ما يتيح لك تحسين أداء النموذج بدون أي تكلفة إضافية وبدون تعقيدات إضافية في المنظومة المتكاملة. تتيح لك هذه الطريقة نشر عنصر واحد على Play يحتوي على الرمز البرمجي ومواد العرض ونماذج الذكاء الاصطناعي، والاختيار من بين عدد من أوضاع العرض وخيارات الاستهداف.
المزايا
- يمكنك تحميل عنصر نشر واحد إلى Google Play وتفويض عمليات الاستضافة والعرض والتحديث والاستهداف إلى Play بدون أي تكلفة إضافية.
- يمكنك إرسال نماذج تعلُّم الآلة في وقت التثبيت أو عند الطلب أو من خلال العرض الانسيابي السريع.
- يمكن أن يضمن التسليم في وقت التثبيت توفُّر نموذج كبير جدًا عند فتح تطبيقك. سيتم تثبيت النموذج كحزمة APK.
- يتم عرض المحتوى تلقائيًا في الخلفية بعد تثبيت تطبيقك. قد يفتح المستخدمون تطبيقك قبل تنزيل النموذج بالكامل. سيتم تنزيل النموذج إلى مساحة التخزين الداخلية لتطبيقك.
- يتيح لك العرض عند الطلب طلب النموذج أثناء التشغيل، وهو مفيد إذا كان النموذج مطلوبًا فقط لبعض مسارات المستخدِمين. سيتم تنزيل النموذج إلى مساحة التخزين الداخلية لتطبيقك.
- يمكنك تقديم أنواع من نماذج الذكاء الاصطناعي تستهدف أجهزة معيّنة استنادًا إلى طراز الجهاز أو خصائص النظام أو ذاكرة الوصول العشوائي (RAM).
- يمكنك إبقاء تحديثات التطبيقات صغيرة ومحسّنة باستخدام ميزة تصحيح الأخطاء التلقائية في Play، ما يعني أنّه لن يكون عليك تنزيل سوى الاختلافات في الملفات.
الاعتبارات
- يعني استخدام ميزة "الذكاء الاصطناعي على الجهاز فقط" في Play أنّك توافق على البنود الواردة في اتفاقية المطوّرين للنشر على Google Play وبنود خدمة حزمة تطوير البرامج Play Core.
- من المتوقّع أن يقدّم المطوّرون المشاركون في برنامج الاستخدام التجريبي تقييمًا لميزة "الذكاء الاصطناعي على الجهاز" في Play، وأن يقدّموا ملاحظاتهم إلى Google Play.
- لا يمكن استخدام النماذج التي نزّلها تطبيق "الذكاء الاصطناعي على الجهاز فقط" من Play إلا من خلال التطبيق الذي ينزيل النموذج. يجب عدم تقديم النماذج لتطبيقات أخرى، على سبيل المثال، من خلال ربط الخدمة.
- يمكن أن يصل حجم حِزم الذكاء الاصطناعي الفردية إلى 1.5 غيغابايت، استنادًا إلى أحجام تنزيل الملفات المضغوطة. الحد الأقصى لحجم التطبيق التراكمي لأي إصدار من تطبيقك تم إنشاؤه من حِزمة تطبيقك هو 4 غيغابايت.
- على التطبيقات التي يزيد حجمها عن 1 غيغابايت ضبط الحد الأدنى لمستوى حزمة تطوير البرامج (SDK) على 21 أو إصدار أحدث.
- خلال فترة استخدام البرنامج قبل إطلاقه، يمكن أن تتغيّر ميزات "الذكاء الاصطناعي على الجهاز" في Play.
كيفية استخدام منصة Play المخصّصة للذكاء الاصطناعي على الجهاز فقط
تستخدِم ميزة "الذكاء الاصطناعي على الجهاز فقط" في Play حِزم الذكاء الاصطناعي. يمكنك حزم النماذج المخصّصة الجاهزة للتوزيع في حِزم الذكاء الاصطناعي في حِزمة تطبيقك. يمكنك اختيار ما إذا كان يجب عرض حِزمة الذكاء الاصطناعي أثناء التثبيت أو المتابعة السريعة أو عند الطلب.
من خلال تجميع حِزم الذكاء الاصطناعي مع حِزمة تطبيقك، يمكنك استخدام جميع أدوات الاختبار والإصدار الحالية في Play، مثل مسارات الاختبار والطرح على مراحل لإدارة توزيع تطبيقك باستخدام النماذج المخصّصة.
يتم تحديث حِزم الذكاء الاصطناعي مع البرنامج الثنائي للتطبيق. إذا لم يُجري إصدار تطبيقك الجديد تغييرات على حزمة الذكاء الاصطناعي، تضمن عملية تصحيح الأخطاء التلقائية في Play عدم اضطرار المستخدم إلى إعادة تنزيلها. سينزّل Play فقط ما تم تعديله عند تحديث التطبيق.
لا تحتوي حزم الذكاء الاصطناعي إلا على النماذج. لا يُسمح باستخدام Java/Kotlin والمكتبات المجمَّعة من رموز برمجية أصلية. إذا كنت بحاجة إلى شحن مكتبات أو رموز لتشغيل نموذج تعلُّم الآلة، عليك نقلها إلى الوحدة الأساسية أو وحدة الميزة. يمكنك ضبط وحدة الميزات بحيث تتضمّن إعدادات التنزيل والاستهداف نفسها في حزمة الذكاء الاصطناعي.
استخدام LiteRT وMediaPipe مع حزم الذكاء الاصطناعي
يمكنك استخدام LiteRT وMediaPipe مع حِزم الذكاء الاصطناعي. حزِّم نموذجك في حزمة ذكاء اصطناعي، ثمّ استخدِمه باتّباع تعليمات الحِزم التي يتم عرضها عند اكتمال التثبيت أو الحِزم التي يتم عرضها فور اكتمال التثبيت والحِزم عند الطلب.
قراءات إضافية:
- بدء استخدام LiteRT
- يوضّح نموذج التطبيق كيفية حزم نموذج LiteRT في حزمة الذكاء الاصطناعي وتحميله أثناء التشغيل.
- هناك العديد من نماذج LiteRT المُدرَّبة مسبقًا التي يمكنك استخدامها في حِزم الذكاء الاصطناعي للبدء.
- البدء في استخدام MediaPipe
- بالنسبة إلى الحِزم التي يتم عرضها فورًا والحِزم عند الطلب، يمكنك استخدام ملف برمجي
AssetCache.java
لتحميل مواد العرض (مثل
.binarypb
) حسب مسارات الملفات. - بالنسبة إلى الحِزم التي يتم تثبيتها، يمكنك استخدام AndroidAssetUtil.java.
- بالنسبة إلى الحِزم التي يتم عرضها فورًا والحِزم عند الطلب، يمكنك استخدام ملف برمجي
AssetCache.java
لتحميل مواد العرض (مثل
بدء استخدام حِزم الذكاء الاصطناعي
في ما يلي كيفية بدء استخدام ميزة "الذكاء الاصطناعي على الجهاز فقط" في Play على مستوى عالٍ:
- قدِّم معرّف حساب المطوّر الخاص بك على Play إلى Google Play للانضمام إلى البرنامج التجريبي المفتوح.
- حزِّم نماذجك في حِزم الذكاء الاصطناعي ضمن حِزمة تطبيق Android وحدِّد كيفية إرسال حِزم الذكاء الاصطناعي.
- [اختياري] إذا أردت عرض نماذج مختلفة على أجهزة مختلفة، يمكنك ضبط استهداف الأجهزة ل حِزم الذكاء الاصطناعي. على سبيل المثال، يمكنك إرسال حزمة الذكاء الاصطناعي (AI) "أ" إلى ملف نموذج جهاز معيّن، وحزمة الذكاء الاصطناعي (AI) "ب" إلى الأجهزة التي تتضمّن ذاكرة وصول عشوائي (RAM) بسعة 6 غيغابايت على الأقل، ولن تتلقّى جميع الأجهزة الأخرى أي نموذج.
- [اختياري] إذا كنت تستخدم ميزة "العرض عند الطلب" أو ميزة "العرض السريع"، يمكنك دمج مكتبة "عرض الذكاء الاصطناعي في Play" في تطبيقك لتنزيل حِزم الذكاء الاصطناعي عند الحاجة.
- اختبِر حِزمة تطبيقك واطرَحها على Google Play.
أدخِل رقم تعريف حساب المطوّر على Play.
بما أنّ هذه الميزة متوفّرة في مرحلة الاستخدام التجريبي، يجب أن يكون حساب المطوّر الخاص بك مدرَجًا في القائمة المسموح بها للاستفادة من ميزة "الذكاء الاصطناعي على الجهاز" في Play. أكِّد معرّفات حسابات المطوّرين على Play وأسماء حِزم التطبيقات لدى مدير الشركاء في Google Play أو أحد أعضاء فريق الذكاء الاصطناعي على الأجهزة. حدِّد ما إذا كنت ستستهدف نماذجك على أجهزة معيّنة (هذه هي الخطوة 3 من القسم السابق). في الوقت الحالي، ندعو شركاء Play المحدّدين لاختبار هذه الميزة.
التحقّق من إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android
لاستخدام حِزم الذكاء الاصطناعي، تأكَّد من أنّ إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) هو 8.8 على الأقل. تم تجميع هذا الإصدار مع الإصدار 2 من Ladybug في "استوديو Android".
استخراج النموذج إلى حزمة ذكاء اصطناعي
لا يلزم استخدام "استوديو Android" لتنفيذ الخطوات التالية.
- في دليل المستوى الأعلى من مشروعك، أنشئ دليلاً لحزمة الذكاء الاصطناعي. يُستخدَم اسم هذا الدليل كاسم حزمة الذكاء الاصطناعي. يجب أن تبدأ أسماء حِزم الذكاء الاصطناعي بحرف، ويمكن أن تحتوي على أحرف وأرقام وشرطات سفلية فقط.
في دليل حزمة الذكاء الاصطناعي، أنشئ ملفًا بتنسيق
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 ]" } }
في ملف
build.gradle
للتطبيق في المشروع، أضِف اسم كل حزمة ذكاء اصطناعي في مشروعك كما هو موضّح أدناه:// In the app build.gradle file: android { ... assetPacks = [":ai-pack-name", ":ai-pack2-name"] }
في ملف
settings.gradle
الخاص بالمشروع، أدرِج جميع حِزم الذكاء الاصطناعي في مشروعك كما هو موضّح أدناه:// In the settings.gradle file: include ':app' include ':ai-pack-name' include ':ai-pack2-name'
ضمن حزمة الذكاء الاصطناعي، أنشئ دليلاً باسم
src/main/assets/
.ضَع النماذج في الدليل
src/main/assets
. يمكنك إنشاء أدلة فرعية هنا أيضًا. يجب أن تبدو بنية الدليل لتطبيقك الآن على النحو التالي:build.gradle
settings.gradle
app/
ai-pack-name/build.gradle
ai-pack-name/src/main/assets/your-model-directories
أضِف رمزًا لتحميل النماذج وتشغيلها. تعتمد طريقة إجراء ذلك على وضع عرض حِزم الذكاء الاصطناعي. اطّلِع على تعليمات وقت التثبيت والمتابعة السريعة/عند الطلب أدناه.
[اختياري] ضبط إعدادات استهداف الأجهزة لعرض نماذج مختلفة على أجهزة مختلفة
إنشاء مجموعة حزمات تطبيق Android باستخدام Gradle في حِزمة التطبيق التي تم إنشاؤها، يتضمّن الدليل على مستوى الجذر الآن ما يلي:
-
ai-pack-name/manifest/AndroidManifest.xml
: لضبط المعرّف ووضع التسليم لحزمة الذكاء الاصطناعي -
ai-pack-name/assets/your-model-directories
: دليل يحتوي على كل مواد العرض التي تم إرسالها كجزء من حزمة الذكاء الاصطناعي
ينشئ Gradle البيان لكل حزمة ذكاء اصطناعي ويُخرج الدليل
assets/
نيابةً عنك.-
ضبط التسليم في وقت التثبيت
تكون حِزم الذكاء الاصطناعي التي تم ضبطها على أنّها في وقت التثبيت متاحة على الفور عند تشغيل التطبيق. استخدِم واجهة برمجة تطبيقات Java AssetManager للوصول إلى حِزم الذكاء الاصطناعي التي يتم عرضها في هذا الوضع:
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
يحتوي على قائمة بالحِزم وحالات تنزيلها الأولية وأحجامها.
إذا كان يتم حاليًا تنزيل حزمة الذكاء الاصطناعي التي تم طلبها من خلال fetch()
، يتم عرض حالة التنزيل ولا يتم بدء عملية تنزيل إضافية.
مراقبة حالات التنزيل
يجب تنفيذ
AiPackStateUpdateListener
لتتبُّع مستوى تقدّم تثبيت حِزم الذكاء الاصطناعي. يتم تقسيم تعديلات الحالة
حسب الحزمة لتسهيل تتبُّع حالة حِزم الذكاء الاصطناعي الفردية. يمكنك
بدء استخدام حِزم الذكاء الاصطناعي المتاحة قبل اكتمال كل عمليات التنزيل الأخرى لطلبك.
void registerListener(AiPackStateUpdateListener listener) void unregisterListener(AiPackStateUpdateListener listener)
عمليات التنزيل الكبيرة
إذا كان حجم الملف الذي يتم تنزيله أكبر من 200 ميغابايت ولم يكن المستخدم متصلاً بشبكة Wi-Fi، لن يبدأ تنزيله إلا بعد أن يمنح المستخدم موافقته صراحةً على مواصلة التنزيل باستخدام اتصال بيانات الجوّال. وبالمثل، إذا كان حجم الملف كبيرًا و
فقد المستخدم اتصال Wi-Fi، سيتم إيقاف عملية التنزيل مؤقتًا ويجب الحصول على موافقة صريحة للمتابعة باستخدام اتصال بيانات الجوّال. تظهر الحالة
WAITING_FOR_WIFI
للحزمة التي تم إيقافها مؤقتًا. لبدء مسار واجهة المستخدم لطلب الموافقة من المستخدم، استخدِم 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
ضمن الدليل الجذر لحزمة الذكاء الاصطناعي.
يمكنك الحصول على مسار الدليل assets
باستخدام الطريقة المختصرة
assetsPath()
.
استخدِم الطريقة التالية للحصول على المسار إلى مادة عرض معيّنة:
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
في ما يلي بعض طرق واجهة برمجة التطبيقات الإضافية التي قد تحتاج إلى استخدامها في تطبيقك.
إلغاء الطلب
استخدِم الرمز
cancel()
لإلغاء طلب حزمة ذكاء اصطناعي نشط. يُرجى العِلم أنّ هذا الطلب يُنفَّذ بأفضل ما يمكن.
إزالة حزمة الذكاء الاصطناعي
استخدِم
removePack()
لتحديد موعد إزالة حزمة الذكاء الاصطناعي.
الحصول على مواقع جغرافية لحِزم متعددة مستندة إلى الذكاء الاصطناعي
استخدِم
getPackLocations()
للتحقّق من حالة حِزم الذكاء الاصطناعي المتعدّدة بشكل مجمّع، ما يؤدي إلى عرض خريطة لحِزم الذكاء الاصطناعي
ومواقعها الجغرافية. تحتوي الخريطة التي يعرضها getPackLocations()
على
إدخال لكل حزمة تم تنزيلها حاليًا وتعديلها.
استهداف الأجهزة
يمنحك استهداف الأجهزة إمكانية التحكّم بشكل أدق في أجزاء حِزمة تطبيقك التي يتم إرسالها إلى أجهزة معيّنة. على سبيل المثال، يمكنك التأكّد من عدم عرض نموذج كبير إلا على الأجهزة التي تتضمّن ذاكرة وصول عشوائي (RAM) كبيرة، أو يمكنك عرض إصدارات مختلفة من النموذج على أجهزة مختلفة.
يمكنك استهداف خصائص الأجهزة، مثل:
- مكونات النظام مثبَّتة على شريحة
- طراز الجهاز
- ذاكرة الوصول العشوائي للجهاز
- ميزات النظام
نظرة عامة على الخطوات المطلوبة
يجب اتّباع الخطوات التالية لتفعيل استهداف الأجهزة:
- حدِّد مجموعات الأجهزة في ملف XML.
- حدِّد أجزاء الحزمة التي يجب أن تنتقل إلى مجموعات الأجهزة التي تريدها.
- [اختياري] اختبِر الإعدادات محليًا.
- حمِّل حِزمك (التي تحتوي على ملف XML) إلى Google Play.
التحقّق من إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android
لاستخدام ميزة استهداف الأجهزة، تأكَّد من أنّ إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) هو 8.10.0-alpha01 على الأقل. يتم تجميع هذا الإصدار مع الإصدار Meerkat 2 من "استوديو Android"، وهو متوفّر في الإصدار canary.
تفعيل هذه الميزة في "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
يجب تفعيل استهداف الأجهزة صراحةً في ملف 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: متطلبات ذاكرة الوصول العشوائي (RAM) للجهاز
- min_bytes (شاملة): الحد الأدنى لذاكرة الوصول العشوائي المطلوبة (بالبايت)
- max_bytes (حصري): الحد الأقصى لسعة ذاكرة الوصول العشوائي المطلوبة (بالبايت)
- included_device_ids: طُرز الأجهزة التي سيتم تضمينها في هذا العنصر المحدّد
(10,000 معرّف جهاز كحد أقصى لكل مجموعة). يتم استيفاء هذا السمة إذا كان
device يتطابق مع أي device_id في القائمة.
- build_brand: الشركة المصنّعة للجهاز
- build_device: رمز طراز الجهاز
- excluded_device_ids: طُرز الأجهزة المطلوب استبعادها في هذا العنصر المحدّد
(10,000 معرّف جهاز كحد أقصى لكل مجموعة). يتم استيفاء هذه السمة إذا كان
device لا يتطابق مع أي device_id في القائمة.
- build_brand: الشركة المصنّعة للجهاز
- build_device: رمز طراز الجهاز
required_system_features: الميزات التي يجب أن يمتلكها الجهاز ليتم تضمينها من خلال هذا العنصر المحدد (100 ميزة كحد أقصى لكل مجموعة) يجب أن يتضمّن الجهاز جميع ميزات النظام الواردة في هذه القائمة لاستيفاء هذه السمة.
- الاسم: ميزة نظام
forbidden_system_features: الميزات التي يجب ألا يتم تضمينها في الجهاز باستخدام هذا العنصر المحدّد (100 ميزة كحد أقصى لكل مجموعة) إذا كان الجهاز يتضمّن أيًا من ميزات النظام الواردة في هذه القائمة، يعني ذلك أنّه لا يستوفي هذا السمة.
- الاسم: ميزة نظام
منظومة على رقاقة: منظومة على رقاقة ليتم تضمينها في هذا الاختيار يجب أن يحتوي الجهاز على أي شريحة في هذه القائمة لاستيفاء هذه السمة.
- manufacturer: الشركة المصنّعة للمنظومة على الرقاقة
- model: نموذج المنظومة على الرقاقة
في ما يلي مثال يعرض جميع خصائص الجهاز الممكنة:
<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 Console، وذلك من خلال:
فحص الأجهزة الفردية باستخدام "قائمة الأجهزة" والعثور على رمز الشركة المصنّعة والطراز في المواضع الموضّحة في المثال أدناه (بالنسبة إلى Google Pixel 4a، الشركة المصنّعة هي "Google" ورمز الطراز هو "sunfish")
تنزيل ملف CSV للأجهزة المتوافقة، واستخدام Manufacturer و Model Code لـ 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 التي تم إنشاؤها من حِزمك حسب مجموعات الأجهزة.
استخدام ميزة استهداف الأجهزة لحِزم الذكاء الاصطناعي
يمكنك الحفاظ على تحسين الحجم على الأجهزة من خلال إرسال النماذج الكبيرة فقط إلى الأجهزة التي يمكنها تشغيلها.
يمكنك تقسيم حِزم الذكاء الاصطناعي حسب مجموعات الأجهزة من خلال أخذ أدلة حِزم الذكاء الاصطناعي الحالية التي تم إنشاؤها في الخطوة الأخيرة، وإضافة اللاحقة المناسبة إلى المجلدات (على النحو الموضّح أدناه) باستخدام #group_myCustomGroup1 و#group_myCustomGroup2 وما إلى ذلك. عند استخدام حِزم الذكاء الاصطناعي في تطبيقك، لن تحتاج إلى الإشارة إلى المجلدات باستخدام اللاحقة (بمعنى آخر، تتم إزالة اللاحقة تلقائيًا أثناء عملية الإنشاء ).
بعد الخطوة السابقة، قد يبدو الأمر على النحو التالي:
...
.../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 باستخدام IDE IDE
bundletool
(الإصدار 1.18.0 أو الإصدارات الأحدث) وتحميلها باستخدام طريقة التثبيت من مصدر غير معروف
على جهازك. اتّبِع الخطوات التالية لاختبار تطبيقك محليًا باستخدام
bundletool:
أنشئ حزمة تطبيقك باستخدام "استوديو Android" أو أداة bundletool.
أنشئ حِزم APK باستخدام العلامة
--local-testing
:java -jar bundletool-all.jar build-apks --bundle=path/to/your/bundle.aab \ --output=output.apks --local-testing
وصِّل جهازًا وشغِّل
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
ننصحك باختبار تطبيقك بالكامل على Google Play باستخدام مسار اختبار داخلي.
بعد إجراء ذلك، يمكنك إصدار تحديث تطبيقك تدريجيًا في قناة الإصدار العلني باستخدام عمليات الطرح على مراحل.
مثال على تطبيق يستخدم ميزات "منصة Play المخصّصة للذكاء الاصطناعي على الجهاز فقط"
يُرجى التواصل مع مدير الشركاء المعيّن لك في Google Play للحصول على إذن بالوصول إلى نموذج التطبيق.
ويوضّح كيفية استخدام كلّ من أوضاع العرض بالإضافة إلى إعداد استهداف الأجهزة. اطّلِع على قسم الاختبار على الجهاز للبدء.
تقديم تعليقات
على المشاركين في برنامج الاستخدام التجريبي الإبلاغ عن المشاكل وتقديم ملاحظاتهم. يمكنك التواصل مع مدير الشركاء في Google Play أو مع فريق Play لتكنولوجيات الذكاء الاصطناعي على الأجهزة.
محتوى ذو صلة
اطّلِع على مزيد من المعلومات حول مجموعة حزمات تطبيق Android وقراءة مراجع حزمة تطوير البرامج (SDK) لعرض الإعلانات الذكية.