סקירה כללית של AppFunctions

AppFunctions הוא פלטפורמת Android API עם ספריית Jetpack נלווית שמפשטת את השילוב של MCP ב-Android. הוא מאפשר לאפליקציות להתנהג כמו שרתי MCP במכשיר, ותורם פונקציות שפועלות ככלים לשימוש בתכונות פרואקטיביות, יחד עם סוכנים ועוזרים דיגיטליים, כמו Google Gemini. החל מ מאי 2026, השילוב של AppFunctions עם Gemini נמצא בתצוגה מקדימה פרטית עם בודקים מהימנים. אתם יכולים להתחיל להכין את האפליקציות שלכם עכשיו כדי להשתמש ב-AppFunctions ובכלי פיתוח.

הגדרת AppFunctions מאפשרת לאפליקציה לספק שירותים, נתונים ופעולות למאגר המידע שמוטמע ב-Android OS, וכך המשתמשים יכולים לבצע משימות באמצעות סוכנים ואינטראקציות ברמת המערכת.

פונקציות האפליקציה הן המקבילה בנייד לכלים ב-Model Context Protocol‏ (MCP). בדרך כלל, MCP קובע תקן לחיבור של סוכנים לכלים בצד השרת, אבל AppFunctions מספק את אותו מנגנון לאפליקציות ל-Android. כך תוכלו לחשוף את היכולות של האפליקציה שלכם כ'כלים' שאפשר לתזמן את השימוש בהם, שאפליקציות מורשות (מבצעות קריאה) יכולות לגלות ולהפעיל כדי למלא את כוונות המשתמשים. למתקשרים צריכה להיות ההרשאה EXECUTE_APP_FUNCTIONS כדי לגלות ולהפעיל פונקציות של אפליקציות, והם יכולים לכלול סוכנים, אפליקציות ועוזרים מבוססי-AI כמו Gemini.

התכונה AppFunctions זמינה במכשירים עם Android מגרסה 16 ומעלה.

תרחישים לדוגמה

‫AppFunctions מספקות מנגנון יעיל לאוטומציה של משימות ולייעול האינטראקציות של המשתמשים. כשאתם מאפשרים למשתמשים לגשת ליכולות של האפליקציה, הם יכולים להשיג מטרות מורכבות באמצעות שפה טבעית, ובדרך כלל לא צריכים להשתמש בממשק המשתמש כדי לנווט באופן ידני שלב אחר שלב.

התרחישים הבאים ממחישים איך אפשר להשתמש ב-AppFunctions כדי לשפר את חוויית המשתמש במגוון קטגוריות של אפליקציות:

  • ניהול משימות ופרודוקטיביות

    • בקשת משתמש: "תזכיר לי לאסוף את החבילה מהעבודה היום ב-17:00".
    • פעולת AppFunction: המתקשר מזהה את אפליקציית ניהול המשימות הרלוונטית ומפעיל פונקציה ליצירת משימה, ומערכת Gemini מאכלסת באופן אוטומטי את השדות של הכותרת, השעה והמיקום על סמך ההנחיה של המשתמש.

    /**
     * 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: המתקשר מפעיל פונקציה ליצירת פלייליסט באפליקציית מוזיקה, ומעביר הקשר כמו 'אלבומי הג&#39אז המובילים לשנת 2026' כשאילתה ליצירת הפלייליסט באופן מיידי.

    /**
     * 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()

  • תהליכי עבודה בין אפליקציות

    • בקשת משתמש: "Find the noodle recipe from Lisa's email and add the ingredients to my shopping list".
    • פעולת 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()

  • יומן ותזמון

    • בקשת משתמש: "תוסיף ליומן שלי את יום ההולדת של אמא שלי ביום שני הבא בשעה 18:00".
    • פעולת AppFunction: האפליקציה שאושרה עם יכולות של סוכן דיגיטלי מפעילה את הפונקציה 'יצירת אירוע' באפליקציית היומן, ומנתחת את ההקשר הרלוונטי כמו 'יום שני הבא' ו'18:00' כדי ליצור את הרשומה בלי שהמשתמש יצטרך לפתוח את היומן באופן ידני.

    /**
     * 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 מאפליקציות עם סוכן וההרצה שלהן. סביר להניח שסוכנים ישתמשו בכלים מרוחקים של MCP בצד השרת וב-AppFunctions מקומיות יחד כדי לטפל בבקשות של משתמשים. התהליך המפורט לשימוש ב-AppFunctions מקומיות הוא כדלקמן:

  • הצהרה על AppFunction: אפליקציית Android בנויה כך שהיא משתמשת ב-AppFunctions כדי להפוך את התכונות שלה לזמינות, כמו 'יצירת הערה' או 'שליחת הודעה'.
  • יצירת סכימה: ספריית AppFunctions Jetpack יוצרת קובץ סכימת XML שמפרט את כל פונקציות האפליקציה שהוגדרו באפליקציה. מערכת Android משתמשת בקובץ הזה כדי ליצור אינדקס של פונקציות האפליקציה הזמינות.
  • אחזור מטא-נתונים: הסוכן יכול לאחזר מטא-נתונים של AppFunction על ידי שליחת שאילתה. בנוסף ל-KDocs ספציפיים לפונקציות, מפתחים יכולים להגדיר דפוסים ומגבלות תפעוליים ברמת האפליקציה במטא-נתונים של האפליקציה, כדי להנחות את תזמור הסוכנים בכמה כלים.
  • בחירה והפעלה של AppFunction: על סמך ההנחיות של המשתמש, הסוכן בוחר ומפעיל את AppFunction המתאים עם הפרמטרים המתאימים.
תרשים שמציג את התהליך האופייני של AppFunctions מחשיפה לאפליקציה ועד להרצת הסוכן.
תרשים 1: תרשים שמציג את התהליך הטיפוסי של חשיפת AppFunctions וההרצה שלהן על ידי סוכן.

ספריית AppFunctions Jetpack מפשטת את החשיפה של הפונקציונליות של האפליקציה. בעזרת מעבד אנוטציות (Annotation processor), מוסיפים אנוטציות לפונקציות שרוצים להפוך לזמינות לסוכנים. לאחר מכן, המתקשרים יכולים למצוא את הפונקציות האלה שנוספו לאינדקס ולהפעיל אותן באמצעות AppFunctionManager.

לפני שמפעילים פונקציה, המתקשרים צריכים לוודא שהמכשיר תומך בתכונה AppFunctions. לשם כך, הם צריכים לנסות לאחזר מופע של AppFunctionManager. אחרי שהתמיכה תהיה זמינה, המתקשרים יוכלו לאמת אם פונקציה מסוימת מופעלת באפליקציית היעד באמצעות isAppFunctionEnabled(packageName,functionId). כדי לשלוח שאילתה לגבי הסטטוס של פונקציות בחבילות אחרות, צריך את android.permission.EXECUTE_APP_FUNCTIONSpermission.

האפליקציה לא נדרשת לאמת אם התכונה 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 כדי לוודא איך הכול פועל במכשירים שלכם.
  • משתמשים בכישורי הסוכן AppFunctions כדי להאיץ את תהליך הפיתוח בארבעת השלבים של מחזור החיים:
    • גילוי: ניתוח בסיס הקוד כדי לזהות ולהמליץ על תכונות בעלות ערך גבוה לניהול תהליכים מבוססי-AI.
    • הטמעה והגדרה: יצירת הטמעות של Kotlin והגדרת מטא נתונים של המערכת ותלות ב-build.
    • שיפור KDoc: אופטימיזציה של תיעוד הפונקציות והמאפיינים עבור סוכני AI ו-Android MCP.
    • בדיקה וניפוי באגים: צריך לספק פקודות ADB להערכה מקומית ולניפוי באגים במכשיר.
  • לצורך בדיקה ואימות משורת הפקודה, אפשר להשתמש בפקודות ADB כמו adb shell cmd app_function ... כדרך ישירה וקלה לבדיקת רישום פונקציות, לבדיקת תיאורי מטא-נתונים ולהפעלת פונקציות במכשיר.
  • כדי לראות את Android MCP בפעולה ולבדוק תהליכי עבודה מקצה לקצה בלי להשתמש בהנחיות, אתם יכולים להתקין את אפליקציית Android‏ AppFunctions testing agent ולהשתמש בה במכשיר שלכם.

שאלות נפוצות

בקטע הבא מפורטות תשובות לשאלות נפוצות בנושא AppFunctions.

אני מפתח אפליקציות. האם אפשר להטמיע את AppFunctions עוד היום?

כן, אפשר להטמיע ולבדוק את AppFunctions באפליקציה שלכם באמצעות ההנחיות שמפורטות בקטעים הקודמים.

מה ההבדל בין AppFunctions לבין MCP?

שתי האפשרויות מאפשרות לסוכני AI לתזמן כלים, אבל יש ביניהן הבדלים משמעותיים בארכיטקטורה, בזמן האחזור ובמאמץ הנדרש מהמפתחים. AppFunctions הן נקודות חיבור מובנות ברמת מערכת ההפעלה שבלעדיות ל-Android, והן מופעלות באופן מקומי. לעומת זאת, שרת MCP רגיל הוא פתרון שאינו תלוי בפלטפורמה, שמסתמך על ביצוע בענן ועל הלוך ושוב ברשת.

בקיצור, פיתוח באמצעות AppFunctions מאפשר לכם להשתמש במצב האפליקציה הקיים ישירות במכשיר, ולא דורש מכם לתחזק שירותים מחוץ לאפליקציית Android.

הטמעתי את AppFunctions באפליקציה שלי. למה לסוכן המערכת שלי אין גישה אליהן?

AppFunctions הן תכונה ניסיונית. כדי להעריך בקפידה את איכות החוויה הכוללת במהלך שלב הניסוי הזה, רק למספר מוגבל של אפליקציות וסוכני מערכת יש גישה לצינור המלא.

איך אפשר להכין את האפליקציה לזמינות לכלל המשתמשים (GA) של AppFunctions?

כדאי לחשוב אילו תכונות של האפליקציה רוצים לחשוף לאוטומציה מבוססת-סוכנים. אפשר להטמיע AppFunctions באפליקציה. כדי לעשות את זה, פועלים לפי השלבים בקטעים הקודמים בדף הזה ומוודאים שהן רשומות במכשיר על ידי קריאה ל-adb shell cmd app_function list-app-functions.

האם אפשר לקבל גישה מוקדמת לחוויית פיתוח מבוססת-סוכנים מקצה לקצה?

אנחנו מפעילים תוכנית גישה מוקדמת (EAP) כדי להוסיף אפליקציות נבחרות לבדיקה של חוויית המפתחים מקצה לקצה שנדרשת להשקת AppFunctions בייצור ב-Android. כדי להירשם לתוכנית הגישה המוקדמת לשילוב של AppFunctions, אפשר למלא את טופס ההרשמה הזה. ההרשמה לטופס ההתעניינות לא מעניקה לכם גישה אוטומטית לשילוב המלא. אם האפליקציה שלך תיבחר להשתתף בתוכנית הגישה המוקדמת, או כש-AppFunctions יהפוך לזמין לכולם, נשלח לך אימייל.

איך אפשר לשלוח משוב על AppFunctions?

כדי לשלוח משוב על ה-API, אפשר לדווח על בעיה ולמלא את הטופס של תוכנית הגישה המוקדמת.