AppFunctions یک میانای برنامهسازی کاربردی پلاتفرم Android با کتابخانه Jetpack همراه است که ادغام Android MCP را ساده میکند. این ویژگی به برنامههای شما امکان میدهد مانند سرورهای MCP دروندستگاهی عمل کنند و توابعی را ارائه دهند که بهعنوان ابزارهایی برای استفاده توسط ویژگیهای پیشفعال همراه با عوامل و دستیارها، مانند Google Gemini، عمل میکنند. از ماه مه ۲۰۲۶، ادغام AppFunctions با Gemini در پیشنمایش خصوصی با آزمایشگران مورد اعتماد است. اکنون میتوانید آمادهسازی برنامههایتان را برای استفاده از «عملکردهای برنامه» و ابزارهای توسعه شروع کنید.
با تعریف کردن این «کارکردهای برنامه»، به برنامهتان امکان میدهید خدمات، دادهها، و کنشهایی را به ثبت داخلی سیستمعامل Android ارائه دهد و به کاربران اجازه میدهد ازطریق عاملها و تعاملات سطح سیستم کارها را تکمیل کنند.
AppFunctions معادل تلفن همراه ابزارهای موجود در پروتکل بافتار مدل (MCP) است. درحالیکه MCP بهطور سنتی نحوه اتصال نمایندگان به ابزارهای سمت سرور را استانداردسازی میکند، AppFunctions همان سازوکار را برای برنامههای Android فراهم میکند. این کار به شما امکان میدهد قابلیتهای برنامهتان را بهعنوان «ابزارهای» قابلهماهنگی نمایان کنید که برنامههای مجاز (تماسگیرندگان) میتوانند آنها را برای برآورده کردن اهداف کاربر کشف و اجرا کنند. تماسگیرندگان باید اجازه EXECUTE_APP_FUNCTIONS را برای
کشف و اجرای AppFunctions داشته باشند و میتوانند شامل کارگزاران، برنامهها، و
دستیاران هوش مصنوعی مانند Gemini باشند.
«عملکردهای برنامه» در دستگاههای دارای Android 16 یا بالاتر دردسترس است.
موارد استفاده نمونه
«عملکردهای برنامه» سازوکار قدرتمندی برای خودکارسازی کردن کارها و سادهسازی تعاملات کاربر ارائه میدهد. با باز کردن قابلیتهای برنامهتان، به کاربران امکان میدهید بااستفاده از زبان طبیعی به اهداف پیچیده دست یابند، که اغلب نیاز به پیمایش گامبهگام و دستی با میانای کاربر شما را برطرف میکند.
سناریوهای زیر نشان میدهد که چگونه میتوان از AppFunctions برای ایجاد تجربههایی در دستههای مختلف برنامه استفاده کرد:
مدیریت تکلیف و بهرهوری
- درخواست کاربر: «به من یادآوری کن امروز ساعت ۵ بعدازظهر بستهام را در محل کار تحویل بگیرم».
- کنش AppFunction: تماسگیرنده برنامه مدیریت تکلیف مربوطه را شناسایی میکند و تابعی را برای ایجاد تکلیف فراخوانی میکند و بهطور خودکار فیلدهای عنوان، زمان، و مکان را براساس پیامواره کاربر تکمیل میکند.
/** * Create a new task or reminder with a title, due time, and location. * * @param title The descriptive title of the task (e.g., "Pick up my package"). * @param dueDateTime The specific date and time when the task should be completed. * @param location The physical location associated with the task (e.g., "Work"). * @return The created Task */ @AppFunction(isDescribedByKDoc = true) suspend fun createTask( title: String, dueDateTime: LocalDateTime? = null, location: String? = null, ): Task = TODO()
رسانه و سرگرمی
- درخواست کاربر: «فهرست پخش جدیدی با آلبومهای برتر جاز از امسال بساز».
- کنش AppFunction: تماسگیرنده تابع ایجاد فهرست پخش را در برنامه موسیقی اجرا میکند و بافتهایی مثل «آلبومهای برتر جاز برای سال ۲۰۲۶» را بهعنوان پُرسمان برای تولید فوری فهرست پخش ارسال میکند.
/** * Create a new music playlist based on a natural language query. * * @param query The description used to generate the playlist (e.g., "top jazz albums from 2026"). * @return The final created playlist based on songs. */ @AppFunction(isDescribedByKDoc = true) suspend fun createPlaylistFromQuery( query: String, ): Playlist = TODO()
جریانهای کار بینبرنامهای
- درخواست کاربر: «دستور پخت رشته فرنگی را از ایمیل لیزا پیدا کن و مواد لازم را به فهرست خریدم اضافه کن».
- کنش AppFunction: این درخواست از عملکردهای چند برنامه استفاده میکند. ابتدا، تماسگیرنده از عملکرد جستجوی برنامه ایمیل برای بازیابی محتوا استفاده میکند. سپس، مواد تشکیلدهنده مربوطه را استخراج میکند و تابع برنامه فهرست خرید را فرا میخواند تا فهرست کاربر را تکمیل کند.
/** * Search for emails matching a query or sender name to retrieve content like recipes. * * @param query The search term or contact name (e.g., "Lisa noodle recipe"). * @return A list of matching email summaries containing the requested information. */ @AppFunction(isDescribedByKDoc = true) suspend fun searchEmails( query: String, ): List<EmailSummary> = TODO() /** * Add a list of items or ingredients to the user's active shopping list. * * @param items The names of the ingredients or products to add to the list. * @return The final shopping list with new items added */ @AppFunction(isDescribedByKDoc = true) suspend fun addItemsToShoppingList( items: List<String>, ): ShoppingList = TODO()
تقویم و زمانبندی
- درخواست کاربر: «جشن تولد مامان را برای دوشنبه بعدی ساعت ۶ بعدازظهر به تقویمم اضافه کن».
- کنش AppFunction: برنامه کارگزاری تأییدشده تابع «ایجاد رویداد» برنامه تقویم را فرا میخواند و با تجزیه کردن بافتار مربوطه مثل «دوشنبه آینده» و «۶ بعدازظهر» ورودی را ایجاد میکند بدون اینکه کاربر نیاز داشته باشد تقویم را بهصورت دستی باز کند.
/** * Schedule a new event on the user's primary calendar. * * @param title The name of the calendar event (e.g., "Mom's birthday party"). * @param startDateTime The specific date and time the event is scheduled to begin. * @return The created Event object. */ @AppFunction(isDescribedByKDoc = true) suspend fun createCalendarEvent( title: String, startDateTime: LocalDateTime, ): Event = TODO()
نحوه عملکرد AppFunctions
نمودار زیر جریان معمول نحوه همرسانی AppFunctions توسط برنامهها با عامل و سپس اجرای آنها را نشان میدهد. کارگزاران احتمالاً هنگام رسیدگی به درخواستهای کاربر، ابزارهای MCP از دور سمت سرور و AppFunctions محلی را با هم درنظر میگیرند. جریان دقیق استفاده از «عملکردهای برنامه» محلی به این صورت است:
- اعلامیه AppFunction: برنامه Android برای استفاده از AppFunctions ساخته شده است تا ویژگیهایش را دردسترس قرار دهد، مثلاً «ایجاد یادداشت» یا «ارسال پیام».
- تولید طرحواره: کتابخانه AppFunctions Jetpack فایل طرحواره XML تولید میکند که همه AppFunctions اعلامشده در برنامه را فهرست میکند. سیستمعامل Android از این فایل برای نمایهگذاری AppFunctions دردسترس استفاده میکند.
- بازیابی فراداده: عامل میتواند با پُرسمان کردن فراداده AppFunction آن را بازیابی کند. علاوهبر «اسناد K» مختص عملکرد، توسعهدهندگان میتوانند الگوهای عملیاتی و محدودیتهای سطح برنامه را در فراداده برنامه تعریف کنند تا هماهنگی عامل را در ابزارهای متعدد هدایت کنند.
- انتخاب و اجرای AppFunction: براساس پیاموارههای کاربر، دستیار «کارکرد برنامه» مناسب را با پارامترهای مناسب انتخاب و اجرا میکند.
کتابخانه AppFunctions Jetpack نمایش عملکرد برنامهتان را ساده میکند.
با پردازشگر گزارمان، توابعی را که میخواهید برای
نمایندگان دردسترس قرار دهید گزارمانگذاری میکنید. سپس تماسگیرندگان میتوانند این توابع نمایهشده را بااستفاده از AppFunctionManager پیدا و فراخوانی کنند.
پیشاز فراخوانی یک تابع، تماسگیرندگان باید با تلاش برای بازیابی نمونهای از
AppFunctionManager، تأیید کنند که دستگاه از ویژگی
AppFunctions پشتیبانی میکند. پساز پشتیبانی شدن، تماسگیرندگان میتوانند بااستفاده از isAppFunctionEnabled(packageName,functionId) بررسی کنند که آیا عملکرد خاصی در برنامه هدف فعال است یا نه. پرسش وضعیت توابع در بستههای دیگر به اجازه
android.permission.EXECUTE_APP_FUNCTIONS نیاز دارد.
برنامه شما ملزم به درستیسنجی پشتیبانی از ویژگی AppFunction نیست؛
این کار بهطور خودکار در کتابخانه Jetpack انجام میشود. برای مثال،
AppFunctionManager میتواند بررسی کند که آیا ویژگی پشتیبانی میشود یا نه.
در اینجا مثالی از AppFunctions برای برنامه یادداشتبرداری با قابلیتهای ایجاد، ویرایش، و فهرست کردن یادداشتها آورده شده است:
@RequiresApi(36) @AndroidEntryPoint @AppFunctionServiceEntryPoint( serviceName = "TaskAppFunctionService", appFunctionXmlFileName = "task_app_function_service", ) abstract class BaseTaskAppFunctionService : AppFunctionService() { @Inject internal lateinit var taskRepository: TaskRepository /** * Creates a task based on [createTaskParams]. * * @param createTaskParams The parameter to describe how to create the task. */ @AppFunction(isDescribedByKDoc = true) suspend fun createTask( createTaskParams: CreateTaskParams, ): Task = withContext(Dispatchers.IO) { // Developers can use predefined exceptions to let the agent know // why it failed. if (createTaskParams.title == null && createTaskParams.content == null) { throw AppFunctionInvalidArgumentException("Title or content should be non-null") } val id = taskRepository.createTask( createTaskParams.title, createTaskParams.content ) return@withContext taskRepository .getTask(id) ?.toTask() ?: throw AppFunctionElementNotFoundException("Task not found for ID = $id") } // Maps internal TaskEntity private fun TaskEntity.toTask() = Task(id = id, title = title, content = description) }
/** The parameter to create the task. */ @AppFunctionSerializable(isDescribedByKDoc = true) data class CreateTaskParams( /** The title of the task. */ val title: String?, /** The content of the task. */ val content: String?, ) /** The user-created task. */ @AppFunctionSerializable(isDescribedByKDoc = true) data class Task( /** The ID of the task. */ val id: String, /** The title of the task. */ val title: String, /** The content of the task. */ val content: String, )
نمونهها، مهارت، و ابزارهای آزمایش
برای کمک به شما در ارتقای مهارتهایتان در «عملکردهای برنامه»، موارد زیر را دردسترس قرار دادهایم:
- برای درستیسنجی و کاوش نحوه عملکرد همه چیز در دستگاههایتان، نمونه AppFunctions را کاوش کنید.
- از مهارت عامل AppFunctions برای تسریع
توسعه در چرخه حیات چهار مرحلهای استفاده کنید:
- کشف: پایگاه کدتان را تجزیهوتحلیل کنید تا ویژگیهای باارزش برای هماهنگی هوش مصنوعی را شناسایی و توصیه کنید.
- پیادهسازی و پیکربندی: پیادهسازیهای Kotlin را تولید کنید و فرادادههای سیستم و وابستگیهای ساخت را پیکربندی کنید.
- بهینهسازی KDoc: بهینهسازی مستندات تابع و دارایی برای عاملهای هوش مصنوعی و Android MCP.
- آزمایش و اشکالزدایی: دستورات ADB را برای ارزیابی محلی و اشکالزدایی در دستگاه ارائه دهید.
- برای آزمایش و درستیسنجی خط فرمان، از فرمانهای ADB مثل
adb shell cmd app_function ...بهعنوان روشی مستقیم و سبک برای آزمایش ثبت عملکرد، بازرسی شرح فراداده، و اجرای عملکردها در دستگاه استفاده کنید.
پرسشگان (FAQ)
بخش زیر به پرسشگان درباره «عملکردهای برنامه» میپردازد.
من توسعهدهنده نرمافزار هستم. آیا میتوانم امروز AppFunctions را پیادهسازی کنم؟
بله، با پیروی از راهنماییهای مفصل در بخشهای قبلی، میتوانید «کارکردهای برنامه» را در برنامهتان پیادهسازی و آزمایش کنید.
تفاوت بین AppFunctions و MCP چیست؟
هر دو به عاملهای هوش مصنوعی اجازه میدهند ابزارها را هماهنگ کنند، اما در معماری، تأخیر، و تلاش توسعهدهنده موردنیاز تفاوتهای قابلتوجهی دارند. «عملکردهای برنامه» قلابهای سطح سیستمعامل داخلی هستند که منحصراً در Android اجرا میشوند. درمقابل، سرور MCP استاندارد راهحلی مستقل از پلاتفرم است که به اجرای ابری و سفرهای رفتوبرگشت شبکه متکی است.
بهطور خلاصه، توسعه با «عملکردهای برنامه» به شما امکان میدهد از وضعیت برنامه موجود مستقیماً در دستگاه استفاده کنید و نیازی نیست سرویسهایی را خارج از برنامه Android خود نگهداری کنید.
«توابع برنامه» را در برنامهام پیادهسازی کردهام. چرا عامل سیستم من نمیتواند به آنها دسترسی داشته باشد؟
AppFunctions یک ویژگی آزمایشی است. برای ارزیابی دقیق کیفیت تجربه کلی در این مرحله آزمایشی، فقط تعداد محدودی از برنامهها و کارگزاران سیستم میتوانند به کل خط لوله دسترسی داشته باشند.
چگونه میتوانم برنامهام را برای دردسترس عموم قرار گرفتن «عملکردهای برنامه» آماده کنم؟
درنظر بگیرید کدام ویژگیهای برنامهتان را میخواهید برای خودکارسازی عامل نمایان کنید.
میتوانید «کارکردهای برنامه» را در برنامهتان پیادهسازی کنید. برای انجام این کار، مراحل بخشهای
قبلی این صفحه را دنبال کنید و با فراخوانی adb shell cmd app_function list-app-functions، تأیید کنید که این کارکردها در
دستگاه ثبت شدهاند.
آیا میتوانم به تجربه توسعهدهنده عاملگرای سرتاسری دسترسی زودرس داشته باشم؟
درحال اجرای «برنامه دسترسی زودرس» (EAP) برای اضافه کردن برنامههای منتخب به آزمایش تجربه توسعهدهنده سرتاسری موردنیاز برای راهاندازی AppFunctions در محیط تولید در Android هستیم. ازطریق این فرم ثبتنام برنامه دسترسی زودرس میتوانید علاقه خود را برای ادغام کردن AppFunctions ثبت کنید. با ثبت علاقه خود، بهطور خودکار به ادغام کامل دسترسی پیدا نمیکنید. اگر برنامه شما برای «برنامه دسترسی زودهنگام» انتخاب شود، یا وقتی «عملکردهای برنامه» بهصورت عمومی دردسترس قرار گیرد، به شما ایمیل خواهیم زد.
چگونه میتوانم درباره AppFunctions بازخورد ارائه دهم؟
میتوانید با ثبت مشکل و ثبت علاقه خود در فرم «برنامه دسترسی زودرس»، بازخورد خود را درباره API ارائه دهید.