مقدّمة
توفّر ميزة "الذكاء الاصطناعي على الجهاز" في Play مزايا مجموعة حزمات تطبيق Android وميزة التوزيع من Google Play لتوزيع نماذج مخصّصة للتعلم الآلي، ما يتيح لك تحسين أداء النماذج مع تقليل تعقيد منظومة الأجهزة بدون أي تكلفة إضافية. تتيح لك هذه الميزة نشر عنصر مجمَّع واحد على Play يحتوي على الرموز البرمجية ومواد العرض ونماذج تعلُّم الآلة، كما تتيح لك الاختيار من بين عدد من أوضاع التسليم وخيارات الاستهداف.
المزايا
- يمكنك تحميل عنصر نشر واحد إلى Google Play وتفويض عملية الاستضافة والتسليم والتحديثات والاستهداف إلى Play بدون أي تكلفة إضافية.
- يمكنك عرض نماذج تعلُّم الآلة عند التثبيت أو العرض الانسيابي السريع أو عند الطلب.
- يمكن أن تضمن ميزة "التسليم عند التثبيت" توفُّر نموذج كبير جدًا عند فتح تطبيقك. سيتم تثبيت النموذج كحزمة APK.
- يتم التنزيل فور اكتمال التثبيت تلقائيًا في الخلفية بعد تثبيت تطبيقك. قد يفتح المستخدمون تطبيقك قبل أن يتم تنزيل النموذج بالكامل. سيتم تنزيل النموذج إلى مساحة التخزين الداخلية للتطبيق.
- يتيح لك التنزيل عند الطلب طلب النموذج في وقت التشغيل، وهو أمر مفيد إذا كان النموذج مطلوبًا فقط لبعض مسارات المستخدمين. سيتم تنزيل النموذج إلى مساحة التخزين الداخلية للتطبيق.
- تقديم صيغ من نماذج تعلُّم الآلة تستهدف أجهزة معيّنة استنادًا إلى طراز الجهاز أو خصائص النظام أو ذاكرة الوصول العشوائي
- يمكنك الحفاظ على حجم تحديثات التطبيقات صغيرًا وتحسينها من خلال ميزة التصحيح التلقائي في Play، ما يعني أنّه يجب تنزيل الاختلافات في الملفات فقط.
الاعتبارات
- باستخدام "الذكاء الاصطناعي على الجهاز" من Play، أنت توافق على البنود الواردة في اتفاقية المطوّرين للنشر على Google Play وبنود خدمة حزمة تطوير البرامج (SDK) الخاصة بمجموعة Play Core.
- يجب أن تستخدم تطبيقاتك فقط النماذج التي نزّلها Play للذكاء الاصطناعي على الجهاز. يجب عدم توفير النماذج للتطبيقات الأخرى.
- يمكن أن يصل حجم حِزم الذكاء الاصطناعي الفردية إلى 1.5 غيغابايت، وذلك استنادًا إلى أحجام التنزيل المضغوطة. يبلغ الحد الأقصى لحجم التطبيق التراكمي لأي إصدار من تطبيقك تم إنشاؤه من حزمة تطبيقك 4 غيغابايت.
- يجب ضبط الحد الأدنى لمستوى حزمة تطوير البرامج (SDK) على 21 أو مستوى أعلى في التطبيقات التي يزيد حجمها عن 1 غيغابايت.
كيفية استخدام Play المخصصة للذكاء الاصطناعي على الجهاز فقط
تستخدِم منصة Play المخصصة للذكاء الاصطناعي على الجهاز فقط حِزم الذكاء الاصطناعي. يمكنك تجميع النماذج المخصّصة الجاهزة للتوزيع في حِزم الذكاء الاصطناعي ضمن حِزمة تطبيقك. يمكنك اختيار ما إذا كان يجب عرض حزمة الذكاء الاصطناعي أثناء التثبيت أو العرض الانسيابي السريع أو عند الطلب.
من خلال تجميع حِزم الذكاء الاصطناعي مع حزمة تطبيقك، يمكنك استخدام جميع أدوات الاختبار والإصدار الحالية في Play، مثل مسارات الاختبار وعمليات الطرح على مراحل، لإدارة توزيع تطبيقك باستخدام النماذج المخصّصة.
يتم تحديث حِزم الذكاء الاصطناعي مع البرنامج الثنائي للتطبيق. إذا لم يتضمّن إصدار تطبيقك الجديد أي تغييرات في حزمة الذكاء الاصطناعي، ستضمن عملية التصحيح التلقائي في Play عدم اضطرار المستخدم إلى إعادة تنزيلها. سيقوم Play بتنزيل التغييرات فقط عند تعديل التطبيق.
لا تحتوي حِزم الذكاء الاصطناعي إلا على نماذج. لا يُسمح باستخدام مكتبات Java/Kotlin والمكتبات المجمَّعة من رموز برمجية أصلية. إذا كنت بحاجة إلى شحن مكتبات أو رموز لتشغيل نموذج تعلُّم الآلة، يمكنك نقلها إلى الوحدة الأساسية أو وحدة الميزات. يمكنك ضبط وحدة الميزات لتتضمّن إعدادات التنزيل والاستهداف نفسها التي تتضمّنها حزمة الذكاء الاصطناعي.
استخدام LiteRT وMediaPipe مع حِزم الذكاء الاصطناعي
يمكنك استخدام LiteRT وMediaPipe مع حِزم الذكاء الاصطناعي. يمكنك تجميع النموذج في حزمة ذكاء اصطناعي ثم الوصول إليه باستخدام التعليمات الخاصة بحِزم وقت التثبيت أو حِزم العرض الانسيابي السريع وعند الطلب.
قراءات إضافية:
- بدء استخدام LiteRT
- يوضّح تطبيق العيّنة كيفية تجميع نموذج LiteRT في حزمة الذكاء الاصطناعي وتحميله في وقت التشغيل.
- هناك العديد من نماذج LiteRT المُدرَّبة مسبقًا التي يمكنك استخدامها في حِزم الذكاء الاصطناعي للبدء.
- بدء استخدام MediaPipe
- بالنسبة إلى حِزم "الجلب السريع" و"عند الطلب"، يمكنك استخدام
AssetCache.java
لتحميل مواد العرض (مثل
.binarypb
) من خلال مسارات الملفات. - بالنسبة إلى حِزم وقت التثبيت، يمكنك استخدام AndroidAssetUtil.java.
- بالنسبة إلى حِزم "الجلب السريع" و"عند الطلب"، يمكنك استخدام
AssetCache.java
لتحميل مواد العرض (مثل
بدء استخدام حِزم الذكاء الاصطناعي
في ما يلي الخطوات العامة التي يمكنك اتّباعها لبدء استخدام "منصة Play المخصصة للذكاء الاصطناعي على الجهاز فقط":
- يمكنك تجميع النماذج في حِزم الذكاء الاصطناعي ضمن "حزمة تطبيق Android" وتحديد طريقة تسليم حِزم الذكاء الاصطناعي.
- [اختياري] إذا أردت عرض نماذج مختلفة على أجهزة مختلفة، يمكنك ضبط استهداف الأجهزة لحِزم الذكاء الاصطناعي. على سبيل المثال، يمكنك توفير حزمة الذكاء الاصطناعي A لطراز جهاز معيّن، وحزمة الذكاء الاصطناعي B للأجهزة التي تتضمّن ذاكرة وصول عشوائي بسعة 6 غيغابايت على الأقل، وعدم توفير أي نموذج لجميع الأجهزة الأخرى.
- [اختياري] إذا كنت تستخدم ميزة "العرض عند الطلب" أو ميزة "العرض السريع"، يمكنك دمج مكتبة Play AI Delivery Library في تطبيقك لتنزيل حِزم الذكاء الاصطناعي حسب الحاجة.
- اختبِر حِزمة تطبيقك وأصدِرها على Google Play.
التحقّق من إصدار "المكوّن الإضافي لنظام Gradle المتوافق مع Android"
لاستخدام حِزم الذكاء الاصطناعي، تأكَّد من أنّ إصدار المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) هو 8.8 على الأقل. يتم تضمين هذا الإصدار في Android Studio Ladybug 2.
استخراج النموذج إلى حزمة ذكاء اصطناعي
لا يلزم استخدام "استوديو 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
أضِف رمزًا لتحميل نماذجك وتشغيلها. تعتمد طريقة تنفيذ ذلك على وضع تسليم حِزم الذكاء الاصطناعي. اطّلِع على تعليمات install-time و fast-follow/on-demand أدناه.
[اختياري] ضبط استهداف الأجهزة لتقديم نماذج مختلفة على أجهزة مختلفة
إنشاء "مجموعة حزمات تطبيق 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 AI Delivery.
تعريف التبعية على مكتبة Play AI Delivery
في ملف build.gradle
الخاص بتطبيقك، أدرِج تبعية لمكتبة Play AI Delivery:
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 على الأقل. يتم توفير هذه الأداة مع "استوديو Android" (الإصدار Meerkat 2 والإصدارات الأحدث). نزِّل أحدث إصدار ثابت من "استوديو Android".
تفعيل هذه الميزة في "المكوّن الإضافي لنظام 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 (exclusive): الحد الأقصى لذاكرة الوصول العشوائي المطلوبة (بالبايت)
- included_device_ids: طُرز الأجهزة التي سيتم تضمينها في أداة الاختيار هذه
(الحدّ الأقصى هو 10,000 device_id لكل مجموعة) يتم استيفاء هذه السمة إذا كان الجهاز يطابق أي device_id في القائمة.
- build_brand: الشركة المصنّعة للجهاز
- build_device: رمز طراز الجهاز
- excluded_device_ids: طُرز الأجهزة التي سيتم استبعادها في أداة الاختيار هذه
(الحد الأقصى هو 10,000 device_id لكل مجموعة) يتم استيفاء هذه السمة إذا لم يتطابق الجهاز مع أي device_id في القائمة.
- build_brand: الشركة المصنّعة للجهاز
- build_device: رمز طراز الجهاز
required_system_features: الميزات التي يجب أن يتضمّنها الجهاز ليتم تضمينه في أداة الاختيار هذه (100 ميزة كحد أقصى لكل مجموعة) يجب أن يتضمّن الجهاز جميع ميزات النظام الواردة في هذه القائمة لاستيفاء هذه السمة.
- استبدِل name بميزة نظام.
forbidden_system_features: الميزات التي يجب ألا يتضمّنها الجهاز ليتم تضمينه في أداة الاختيار هذه (100 ميزة كحد أقصى لكل مجموعة) إذا كان الجهاز يتضمّن أيًا من ميزات النظام الواردة في هذه القائمة، لن يستوفي هذا الشرط.
- استبدِل name بميزة نظام.
system-on-chip: شرائح النظام التي سيتم تضمينها في أداة الاختيار هذه. يجب أن يتضمّن الجهاز أي شريحة من هذه القائمة لاستيفاء هذه السمة.
- 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 للأجهزة المتوافقة واستخدام الشركة المصنّعة ورمز الطراز للحقلَين 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 باستخدام
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 المخصصة للذكاء الاصطناعي على الجهاز فقط"
نزِّل التطبيق النموذجي.
ويوضّح كيفية استخدام كل وضع من أوضاع العرض بالإضافة إلى إعدادات استهداف الأجهزة. يُرجى الاطّلاع على قسم الاختبار المحلي للبدء.
محتوى ذو صلة
يمكنك الاطّلاع على مزيد من المعلومات حول مجموعة حزمات تطبيق Android وقراءة المراجع الخاصة بحزمة تطوير البرامج (SDK) الخاصة بخدمة "التسليم المستند إلى الذكاء الاصطناعي".