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

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

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

‫AppFunctions הן המקבילה לנייד של כלים בתוך 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 context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        title: String,
        dueDateTime: LocalDateTime? = null,
        location: String? = null
    ) : Task
    
  • מדיה ובידור

    • בקשת משתמש: "צור פלייליסט חדש עם אלבומי הג'אז הכי טובים מהשנה".
    • פעולת AppFunction: המתקשר מפעיל פונקציה ליצירת פלייליסט באפליקציית מוזיקה, ומעביר הקשר כמו 'אלבומי הג'אז המובילים לשנת 2026' כשאילתה ליצירת הפלייליסט באופן מיידי.
    /**
    *   Create a new music playlist based on a natural language query.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        query: String
    ): Playlist
    
  • תהליכי עבודה בין אפליקציות

    • בקשת משתמש: "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 context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        query: String
    ): List<EmailSummary>
    
    /**
    *   Add a list of items or ingredients to the user's active shopping list.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        items: List<String>
    ): ShoppingList
    
  • יומן ותזמון

    • בקשת משתמש: "תוסיף ליומן שלי את יום ההולדת של אמא שלי ביום שני הבא בשעה 18:00".
    • פעולת AppFunction: האפליקציה שאושרה עם יכולות של סוכן דיגיטלי מפעילה את הפונקציה 'יצירת אירוע' באפליקציית היומן, ומנתחת את ההקשר הרלוונטי כמו 'יום שני הבא' ו'18:00' כדי ליצור את הרשומה בלי שהמשתמש יצטרך לפתוח את היומן באופן ידני.
    /**
    *   Schedule a new event on the user's primary calendar.
    *
    *   @param context The execution context provided by the system.
    *   @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(
        context: AppFunctionContext,
        title: String,
        startDateTime: LocalDateTime
    ): Event
    

איך פועלות פונקציות של אפליקציות

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

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

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

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

אין צורך לאמת באפליקציה אם יש תמיכה בתכונה AppFunction. הטיפול בזה מתבצע אוטומטית בספריית Jetpack. לדוגמה, אפשר להשתמש ב-AppFunctionManager כדי לבדוק אם התכונה נתמכת.

דוגמה ל-AppFunctions באפליקציה לסיכום פגישות עם אפשרויות ליצירה, לעריכה ולרשימה של הערות:

/**
 * A note app's [AppFunction]s.
 */
class NoteFunctions(
    private val noteRepository: NoteRepository
) {
    /**
     * Lists all available notes.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun listNotes(appFunctionContext: AppFunctionContext): List<Note>? {
        return noteRepository.appNotes.ifEmpty { null }?.toList()
    }

    /**
     * Adds a new note to the app.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     * @param title The title of the note.
     * @param content The note's content.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createNote(
        appFunctionContext: AppFunctionContext,
        title: String,
        content: String
    ): Note {
        return noteRepository.createNote(title, content)
    }

    /**
     * Edits a single note.
     *
     * @param appFunctionContext The context in which the AppFunction is executed.
     * @param noteId The target note's ID.
     * @param title The note's title if it should be updated.
     * @param content The new content if it should be updated.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun editNote(
        appFunctionContext: AppFunctionContext,
        noteId: Int,
        title: String?,
        content: String?,
    ): Note? {
        return noteRepository.updateNote(noteId, title, content)
    }
}

/**
 * A note.
 */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Note(
    /** The note's identifier */
    val id: Int,
    /** The note's title */
    val title: String,
    /** The note's content */
    val content: String
)

שאלות נפוצות

בקטע הבא מפורטות תשובות לשאלות נפוצות בנושא 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, אפשר לדווח על בעיה ולמלא את הטופס של תוכנית הגישה המוקדמת.