طرق التنفيذ

إنشاء تطبيقات Android ذكية: الدمج في نظام Android الذكي باستخدام AppFunctions

يستغرق الاطّلاع على المقال 6 دقائق
عرض الملف الشخصي لـ "بن فايس"
Ben Weiss مهندسة علاقات المطوّرين

مرحبًا بك مجددًا في سلسلة منشورات المدونة "إنشاء تطبيقات Android ذكية"، حيث نأخذ تطبيق Android أساسيًا ونحوّله إلى تجربة مخصّصة وذكية واستباقية. في منشورنا السابق، استعرضنا كيفية الاستفادة من Firebase AI Logic لإنشاء ميزات مستنِدة إلى الذكاء الاصطناعي ومستضافة على السحابة الإلكترونية وميزات هجينة.

تتفوق واجهات المستخدم التقليدية للأجهزة الجوّالة في المهام المركّزة والعملية، ويقدّم نظام الذكاء الاصطناعي في Android ميزات تكميلية لتسهيل الإجراءات المعقّدة والمتعدّدة الخطوات. من خلال استكمال واجهات المستخدم التقليدية، توفّر AppFunctions نقطة دخول جديدة وفعّالة: يمكن لوكيل لديه امتيازات على الجهاز الوصول إلى ميزات التطبيق في الخلفية. يمكن أن يكون هذا مفيدًا بشكل خاص عندما يكون المستخدمون يقودون السيارة أو يمشون أو يقومون بمهام متعددة أخرى.

في هذه المقالة، سنوضّح لك كيف صمّمنا هذه الإمكانات ودمجناها في تطبيق تخطيط السفر JetPacker باستخدام Android AppFunctions. سنتعرّف على الأسباب الكامنة وراء خيارات الميزات، وسنناقش الأدوات المتخصّصة التي استخدمناها لتسريع عملية التطوير، وسنتعمّق في الرمز البرمجي الذي يجعل كل ذلك يعمل.

تصميم ميزات متوافقة مع الذكاء الاصطناعي: اتّخاذ خيارات مهمة للمستخدمين

لاختيار الميزات التي سيوفّرها نظام الذكاء، بحثنا عن المهام التي يكون فيها الطلب الصوتي أو النصي أسرع بشكل موضوعي من النقر على الشاشات. في تسجيل الشاشة جنبًا إلى جنب هذا، يمكنك رؤية هذا التباين بشكل مثالي: على اليمين، ينقر المستخدم على شاشات متعددة لتسجيل نفقة، وعلى اليسار، يتم إكمال المهمة نفسها على الفور في الخلفية من خلال وكيل لديه امتيازات.

كان خيارنا الأول هو تتبُّع النفقات. يتطلّب تسجيل نفقات القهوة أثناء رحلة عادةً بضع نقرات، مثل فتح قفل الهاتف وفتح التطبيق والعثور على الرحلة النشطة والانتقال إلى علامة التبويب "النفقات" والنقر على زر الإضافة والتقاط صورة للإيصال والتحقّق من النتيجة. من خلال توفير ميزتَي addExpense وgetExpenses كـ AppFunctions، يتولّى وكيل النظام تنفيذ المهام الصعبة. عندما يقول المستخدم "أريد إضافة نفقات بقيمة 5 دولارات أمريكية لشراء قهوة إلى رحلتي إلى باريس"، يبحث الوكيل تلقائيًا عن رقم تعريف الرحلة الصحيح في الخلفية ويُدرج النفقات، ويتخطّى بذلك مسار واجهة المستخدم اليدوي بالكامل.

أولينا أيضًا أهمية كبيرة لإدارة برامج الرحلات. للعثور على النشاط التالي في برنامج رحلة مزدحم، عليك عادةً التنقّل بين الأنشطة في عرض المخطط الزمني. من خلال تزويد النظام getItinerary وaddItineraryEvent، يمكن للمستخدم ببساطة طرح السؤال "ما هي الخطوة التالية التي سأتّخذها في باريس؟" والحصول على إجابة فورية.

أخيرًا، ركّزنا على تسجيل الملاحظات بدون استخدام اليدين. من الصعب وغير الآمن كتابة تذكيرات أو ملاحظات أثناء المشي في شارع مزدحم. يتيح توفير إمكانية تسجيل ملاحظة صوتية للمستخدم أن يقول: "كانت الرحلة رائعة، فقد شاهدتُ منظرًا جميلاً لغروب الشمس وتمكنتُ من النوم جيدًا"، ويقوم الوكيل المميّز تلقائيًا بتحويل الصوت إلى نص وحفظه مباشرةً في قاعدة بيانات السفر  باستخدام AppFunction addVoiceNote.

‫Android MCP المستند إلى AppFunctions

تستند هذه التجربة بأكملها إلى "منصة التجارة المتعددة القنوات" (MCP) على Android. بموجب هذا التصميم، يعمل التطبيق كخادم MCP محلي. بدلاً من واجهات برمجة التطبيقات عن بُعد، يمكنك توفير ميزات تطبيقك مباشرةً لنظام الذكاء على الجهاز.

‫Android AppFunctions هي واجهة برمجة التطبيقات التي تجعل هذا المفهوم حقيقة. تقرأ هذه المكتبة دوال Kotlin التي تمّت إضافة تعليقات توضيحية إليها وتجمعها في تعريفات أدوات آمنة ومحمية يمكن للوكيل المميّز اكتشافها واستدعاؤها محليًا على الجهاز.

Android MCP diagram.png
مخطّط يوضّح تطبيقاتنا ومنصة Android وعوامل النظام التي تنسّق وظائف التطبيقات

بموجب نموذج MCP على Android، يعمل تطبيقك كخادم MCP محلي يعرض أدوات منظَّمة، بينما تعمل منصة Android كسجل مركزي للأدوات. من جهة عميل MCP، يتم تسجيل تطبيقات الوكيل في نظام الذكاء بعد منحها أذونات مميزة على مستوى النظام للوصول إلى السجلّ.

عندما يتفاعل المستخدم مع وكيل مسجّل، يحدّد النموذج اللغوي الكبير ما إذا كان يمكن معالجة الطلب من خلال AppFunction، ويطلب بيانات وصفية من المنصة، وينفّذ الوظائف المسجّلة المناسبة في الخلفية. يمنحك تصميم خادم العميل المحلي MCP هذا إمكانية التحكّم الكامل: يمكنك اختيار الميزات التي يمكن للوكيل الوصول إليها بالضبط، مع الحفاظ على خصوصية بقية بيانات تطبيقك.

كيف ساهمت مهارات Android في تسريع عملية التطوير

لتبسيط عملية الدمج، استفدنا من مهارة تطوير AppFunctions. مهارة تطوير AppFunctions هي أداة تطوير متكاملة. وقد أرشدتنا خلال دورة الحياة بأكملها: ربط فئات بيانات Kotlin بتسلسل المَعلمات، وإنشاء نقاط دخول Service اللازمة، وتحسين مستندات KDoc لضمان فهم النموذج اللغوي الكبير لحدود المَعلمات، وإعداد الاختبارات المبرمَجة باستخدام ADB.

توفير ميزات التطبيق لنظام الذكاء الاصطناعي

بعد أن استعرضنا الجانب النظري، لننتقل إلى عملية التنفيذ.

الإعداد وضبط التبعيات

نبدأ بإضافة تبعيات AppFunctions. أحدهما لواجهة برمجة التطبيقات والآخر لمترجم Kotlin Symbol Processing.

implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")

نمذجة أنواع البيانات المخصّصة

يجب إضافة التعليق التوضيحي @AppFunctionSerializable إلى أي عنصر مخصّص يتم تبادله مع الوكيل. في ملف TripSerializable.kt، نحدّد نموذج بيانات الرحلة:

@AppFunctionSerializable(isDescribedByKDoc = true)
data class TripSerializable(
    /** The trip's unique identifier. */
    val id: String,
    /** The trip's title. */
    val title: String,
    /** The trip's destination location. */
    val location: String,
    /** The trip's start date in milliseconds. */
    val startDate: Long,
    /** The trip's end date in milliseconds. */
    val endDate: Long,
    /** A list of participants. */
    val participants: List<String>,
)

توفير الميزات باستخدام التعليق التوضيحي ‎ @AppFunction

بعد ذلك، كتبت المهارة دوال Kotlin التي تنفّذ طلبات البحث في قاعدة البيانات وأضافت إليها التعليق التوضيحي @AppFunction. يمكننا الاطّلاع على ذلك في searchTrip:

/**
 * Looks for trips based on optional filters like id, title (name), location, and dates.
 *
 * @param id The unique identifier of the trip.
 * @param title The title or name of the trip.
 * @param location The destination location.
 * @param startDate The minimum start date in milliseconds.
 * @param endDate The maximum end date in milliseconds.
 * @return A list of trips matching the filters.
 */
@AppFunction(isDescribedByKDoc = true)
suspend fun searchTrip(
    id: String? = null,
    title: String? = null,
    location: String? = null,
    startDate: Long? = null,
    endDate: Long? = null
): List<TripSerializable> {
    return withContext(Dispatchers.IO) {
    // implementation
}

بما أنّ AppFunctions يتم تشغيلها على سلسلة واجهة المستخدم تلقائيًا، نستخدم withContext(Dispatchers.IO) للتبديل إلى أداة إرسال في الخلفية. بالإضافة إلى ذلك، نعمل على تحسين KDoc لاستخدام أفعال أمر واضحة وتحديد قيود المَعلمات. يتم تجميع هذه المستندات مباشرةً في مخطط الأداة، الذي يستخدمه الموظف المفوَّض لحلّ المَعلمات والتعامل مع أخطاء وقت التشغيل.

نقطة دخول الخدمة وعملية الدمج مع Hilt

لتسجيل هذه الميزات في نظام الذكاء، ننشئ صنفًا أساسيًا مجرّدًا يوسّع AppFunctionService. نضيف إليها التعليق التوضيحي @AppFunctionServiceEntryPoint:

@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "JetPackerAppFunctionService",
    appFunctionXmlFileName = "jetpacker_app_function_service"
)
abstract class BaseJetPackerAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var tripDao: TripDao
    // DAOs and database references are injected here...
}

أثناء التجميع، تنشئ KSP الفئة الفرعية النهائية للخدمة الملموسة، JetPackerAppFunctionService، كما تم تعريفها باستخدام المَعلمة serviceName. نسجّل أيضًا app_metadata.xml في بيان التطبيق. يوفّر هذا الملف قواعد تشغيل عامة لـ AppFunctions المُعلَن عنها في JetPacker.

اختبار AppFunctions والتحقّق منها

بعد التنفيذ، عليك التأكّد من تسجيل AppFunctions وعملها بشكل صحيح.

على الأجهزة أو المحاكيات التي تعمل بالإصدار 17 من نظام التشغيل Android أو الإصدارات الأحدث، يمكنك استخدام أوامر ADB من نافذة الأوامر لإدراج وظائفك واستدعائها. يؤدي تنفيذ adb shell cmd app_function list-app-functions إلى عرض جميع الدوال المسجّلة للحزمة. يمكنك بعد ذلك تنفيذ دالة معيّنة واختبار عملية دمجها مع قاعدة البيانات من خلال تنفيذ adb shell cmd app_function execute-app-function مع تمرير سلسلة مَعلمات JSON غير مُعالَجة.

بدلاً من أوامر تصحيح الأخطاء عبر منفذ USB هذه، يمكنك أيضًا استخدام AppFunctions Testing Agent لفحص الإعدادات وعرض قائمة بـ AppFunctions وتنفيذها، ويمكنك حتى معرفة طريقة عمل AppFunctions في مسار محادثة حقيقي.

الخلاصة

عند التفكير في ميزات التطبيق التي يمكن المساهمة بها في نظام الذكاء باستخدام AppFunctions، يجب إجراء تغيير طفيف في طريقة تفكيرنا في التعليمات البرمجية والوثائق. تتيح لك AppFunctions استخدام نموذج التفاعل الجديد هذا للتطبيقات، ما يسمح باستخدام وكيل للوصول إلى ميزات التطبيق.

أولاً، مهارة تطوير AppFunctions هي أداة أساسية لدورة الحياة، وتساعدك في اكتشاف الميزات وتنفيذ AppFunctions وتحسينها لتطبيقاتك. ثانيًا، تعليقات KDoc هي أحد أصول واجهة برمجة التطبيقات المجمَّعة، وتؤثر أوصاف المَعلمات الواضحة بشكل مباشر في دقة تنفيذ وكيل النظام. أخيرًا، يوفّر Android MCP تنفيذًا محليًا أولاً، ما يتيح للتطبيقات التعاون بأمان مع وكلاء الذكاء الاصطناعي.

تساهم ميزات التطبيق من خلال AppFunctions في جعل تطبيقك جاهزًا لنظام الذكاء. يُرجى إعلامنا بالطريقة التي تعمل بها على تكييف تطبيقاتك مع عصر الذكاء الاصطناعي التوليدي.

مزيد من المعلومات

يمكنك الاطّلاع على الأجزاء الأخرى من سلسلة منشورات المدوّنة هذه:
الجزء 1: مقدّمة عن التطبيق ونظرة عامة شاملة.
الجزء 2: الذكاء الاصطناعي على الجهاز فقط. التعمّق في واجهات برمجة تطبيقات الذكاء الاصطناعي التوليدي في حزمة تعلّم الآلة وGemini Nano لإنشاء ميزات يركّز على الخصوصية، مثل تلخيص برامج الرحلات وتحليل الإيصالات ومعالجة الصوت محليًا
الجزء 3: الاستدلال المختلط والاستدلال المستند إلى السحابة الإلكترونية تعرَّف على كيفية استخدام Firebase AI Logic لتحديد مصدر إجابات نموذج لغوي كبير (LLM) استنادًا إلى بيانات من العالم الحقيقي، مثل "خرائط Google" وسياق الويب.
الجزء 4 (هذه المشاركة!): تكامل الأنظمة التكامل مع نظام الذكاء الاصطناعي في Android باستخدام AppFunctions
الجزء 5 (قريبًا): سير العمل المستند إلى الوكلاء داخل التطبيق توسيع نطاق التطبيق باستخدام مساعد حجز متكامل يستند إلى A2UI وADK

هل يهمّك معرفة المزيد عن تطوير تطبيقات Android؟ تابِع "مطوّرو تطبيقات Android" على YouTube أو LinkedIn.

تخضع جميع مقتطفات الرموز البرمجية في مشاركة المدونة هذه لإشعار حقوق الطبع والنشر التالي:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
من تأليف:
متابعة القراءة