ภาพรวมของ AppFunctions

AppFunctions เป็น API ของแพลตฟอร์ม Android พร้อมด้วย ไลบรารี Jetpack ที่มาด้วยกันเพื่อลดความซับซ้อนในการผสานรวม Android MCP โดยจะช่วยให้แอปของคุณทำงานได้เหมือนเซิร์ฟเวอร์ MCP ในอุปกรณ์ ซึ่งมีฟังก์ชันที่ทำหน้าที่เป็นเครื่องมือสำหรับฟีเจอร์เชิงรุก รวมถึงเอเจนต์และผู้ช่วย เช่น Google Gemini ณ เดือนพฤษภาคม 2026 การผสานรวม AppFunctions กับ Gemini อยู่ในการแสดงตัวอย่างส่วนตัวกับผู้ทดสอบที่เชื่อถือได้ คุณสามารถเริ่มเตรียมแอปของคุณให้พร้อมใช้งาน AppFunctions และเครื่องมือการพัฒนาได้แล้วตอนนี้

การกำหนด AppFunctions เหล่านี้จะช่วยให้แอปของคุณให้บริการ ข้อมูล และการดำเนินการแก่รีจิสทรีที่สร้างขึ้นในระบบปฏิบัติการ Android ซึ่งช่วยให้ผู้ใช้ทำงานให้เสร็จสมบูรณ์ได้ผ่านเอเจนต์และการโต้ตอบระดับระบบ

AppFunctions ทำหน้าที่เป็นเครื่องมือที่เทียบเท่ากับเครื่องมือใน Model Context Protocol (MCP) สำหรับอุปกรณ์เคลื่อนที่ แม้ว่าโดยปกติแล้ว MCP จะกำหนดมาตรฐานวิธีที่เอเจนต์เชื่อมต่อกับเครื่องมือฝั่งเซิร์ฟเวอร์ แต่ AppFunctions ก็มีกลไกเดียวกันสำหรับแอป Android ซึ่งจะช่วยให้คุณแสดงความสามารถของแอปเป็น "เครื่องมือ" ที่จัดระเบียบได้ ซึ่งแอปที่ได้รับอนุญาต (ผู้เรียก) สามารถค้นพบและเรียกใช้เพื่อตอบสนองความตั้งใจของผู้ใช้ ผู้เรียกต้องมีสิทธิ์ EXECUTE_APP_FUNCTIONS เพื่อ ค้นพบและเรียกใช้ AppFunctions และสามารถรวมเอเจนต์ แอป และผู้ช่วย AI เช่น Gemini

AppFunctions พร้อมใช้งานในอุปกรณ์ที่ใช้ Android 16 ขึ้นไป

ตัวอย่าง Use Case

AppFunctions มีกลไกที่มีประสิทธิภาพในการทำงานโดยอัตโนมัติและเพิ่มประสิทธิภาพการโต้ตอบกับผู้ใช้ การเปิดความสามารถของแอปจะช่วยให้ผู้ใช้บรรลุเป้าหมายที่ซับซ้อนได้โดยใช้ภาษาธรรมชาติ ซึ่งมักจะแทนที่ความจำเป็นในการนำทางด้วย UI แบบทีละขั้นตอนด้วยตนเอง

สถานการณ์ต่อไปนี้แสดงให้เห็นว่า AppFunctions สามารถใช้เพื่อขับเคลื่อนประสบการณ์การใช้งานภายในแอปหลากหลายประเภทได้อย่างไร

  • การจัดการงานและประสิทธิภาพการทำงาน

    • คำขอของผู้ใช้: "เตือนให้ฉันไปรับสินค้าที่ทำงานวันนี้ตอน 5 โมงเย็น".
    • การดำเนินการของ 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: ผู้เรียกจะเรียกใช้ฟังก์ชันการสร้างเพลย์ลิสต์ ภายในแอปเพลง โดยส่งบริบท เช่น "อัลบั้มเพลงแจ๊สยอดนิยมประจำปี 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()

  • เวิร์กโฟลว์ข้ามแอป

    • คำขอของผู้ใช้: "ค้นหาสูตรก๋วยเตี๋ยวจากอีเมลของ Lisa แล้วเพิ่ม ส่วนผสมลงในรายการช็อปปิ้งของฉัน"
    • การดำเนินการของ 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()

  • ปฏิทินและการกำหนดเวลา

    • คำขอของผู้ใช้: "เพิ่มงานปาร์ตี้วันเกิดของแม่ลงในปฏิทินของฉันในวัน จันทร์หน้าเวลา 6 โมงเย็น"
    • การดำเนินการของ AppFunction: แอปที่ได้จากตัวแทนที่ได้รับอนุมัติจะเรียกใช้ฟังก์ชัน "สร้างกิจกรรม" ของแอปปฏิทิน โดยแยกวิเคราะห์บริบทที่เกี่ยวข้อง เช่น "วันจันทร์หน้า" และ "6 โมงเย็น" เพื่อสร้างรายการโดยที่ผู้ใช้ไม่ต้องเปิดปฏิทินด้วยตนเอง

    /**
     * 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 กับเอเจนต์และเรียกใช้ AppFunctions ในภายหลัง เอเจนต์มีแนวโน้มที่จะพิจารณาทั้งเครื่องมือ MCP ระยะไกลฝั่งเซิร์ฟเวอร์และ AppFunctions ในเครื่องร่วมกันเมื่อจัดการคำขอของผู้ใช้ โฟลว์โดยละเอียดสำหรับการใช้ AppFunctions ในเครื่องมีดังนี้

  • การประกาศ AppFunction: แอป Android ได้รับการสร้างขึ้นเพื่อใช้ AppFunctions เพื่อ ทำให้ฟีเจอร์ต่างๆ พร้อมใช้งาน เช่น "สร้างโน้ต" หรือ "ส่งข้อความ"
  • การสร้างสคีมา: ไลบรารี AppFunctions Jetpack จะสร้างไฟล์สคีมา XML ที่แสดงรายการ AppFunctions ที่ประกาศไว้ทั้งหมดในแอป ระบบปฏิบัติการ Android ใช้ไฟล์นี้เพื่อจัดทำดัชนี AppFunctions ที่พร้อมใช้งาน
  • การดึงข้อมูลเมตา: เอเจนต์สามารถดึงข้อมูลเมตาของ AppFunction ได้โดย การค้นหาข้อมูลเมตา นอกเหนือจาก KDoc เฉพาะฟังก์ชันแล้ว นักพัฒนายังสามารถกำหนดรูปแบบการทำงานและข้อจำกัดระดับแอปในข้อมูลเมตาของแอปเพื่อแนะนำการจัดระเบียบเอเจนต์ในเครื่องมือหลายรายการ
  • การเลือกและการเรียกใช้ AppFunction: เอเจนต์จะ เลือกและเรียกใช้ AppFunction ที่เหมาะสมพร้อมพารามิเตอร์ที่เหมาะสม ตามข้อความแจ้งของผู้ใช้
โดยปกติแล้วโฟลว์ AppFunctions จะเริ่มจากการแสดงแอปไปจนถึงการดำเนินการของเอเจนต์
รูปที่ 1: โฟลว์ทั่วไปของวิธีที่เอเจนต์แสดงและ เรียกใช้ AppFunctions ในภายหลัง

ไลบรารี AppFunctions Jetpack ช่วยลดความซับซ้อนในการแสดงฟังก์ชันการทำงานของแอป ด้วยโปรเซสเซอร์คำอธิบายประกอบ คุณสามารถใส่คำอธิบายประกอบฟังก์ชันที่ต้องการให้เอเจนต์ใช้ได้ จากนั้นผู้เรียกจะค้นพบและเรียกใช้ฟังก์ชันที่จัดทำดัชนีเหล่านี้ได้โดยใช้ 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 เพื่อเร่ง การพัฒนาตลอดวงจร 4 ขั้นตอน ได้แก่
    • การค้นพบ: วิเคราะห์ฐานโค้ดเพื่อระบุและแนะนำ ฟีเจอร์ที่มีคุณค่าสูงสำหรับการจัดระเบียบ AI
    • การใช้งานและการกำหนดค่า: สร้างการใช้งาน Kotlin และกำหนดค่าข้อมูลเมตาของระบบและทรัพยากร Dependency ในการสร้าง
    • การปรับแต่ง KDoc: เพิ่มประสิทธิภาพเอกสารประกอบฟังก์ชันและพร็อพเพอร์ตี้สำหรับ AI Agent และ Android MCP
    • การทดสอบและการแก้ไขข้อบกพร่อง: จัดเตรียมคำสั่ง ADB สำหรับการประเมินในเครื่องและการแก้ไขข้อบกพร่องในอุปกรณ์
  • สำหรับการทดสอบและการตรวจสอบบรรทัดคำสั่ง ให้ใช้คำสั่ง ADB เช่น adb shell cmd app_function ... ซึ่งเป็นวิธีที่ตรงไปตรงมาและมีน้ำหนักเบาในการทดสอบการลงทะเบียนฟังก์ชัน ตรวจสอบคำอธิบายข้อมูลเมตา และเรียกใช้ฟังก์ชัน ในอุปกรณ์
  • หากต้องการสัมผัสประสบการณ์การใช้งาน Android MCP และทดสอบเวิร์กโฟลว์แบบครบวงจรโดยไม่ต้องมีข้อความแจ้ง ให้ติดตั้งและใช้แอป Android ของเอเจนต์ทดสอบ AppFunctions ในอุปกรณ์

คำถามที่พบบ่อย

ส่วนต่อไปนี้จะตอบคำถามที่พบบ่อยเกี่ยวกับ AppFunctions

ฉันเป็นนักพัฒนาแอป ฉันจะใช้ AppFunctions ได้ไหมวันนี้

ได้ คุณสามารถใช้และทดสอบ AppFunctions ภายในแอปได้โดยทำตามคำแนะนำที่ระบุไว้โดยละเอียดในส่วนก่อนหน้า

AppFunctions และ MCP แตกต่างกันอย่างไร

ทั้ง 2 อย่างช่วยให้ AI Agent จัดระเบียบเครื่องมือได้ แต่มีสถาปัตยกรรม เวลาในการตอบสนอง และความพยายามที่นักพัฒนาแอปต้องใช้แตกต่างกันอย่างมาก AppFunctions เป็นฮุกระดับระบบปฏิบัติการในตัวที่ใช้ได้เฉพาะกับ Android ซึ่งจะทำงานในเครื่อง ในทางตรงกันข้าม เซิร์ฟเวอร์ MCP มาตรฐานเป็นโซลูชันที่ไม่ขึ้นกับแพลตฟอร์ม ซึ่งอาศัยการทำงานบนระบบคลาวด์และการรับส่งข้อมูลผ่านเครือข่าย

กล่าวโดยย่อ การพัฒนาด้วย AppFunctions ช่วยให้คุณใช้สถานะแอปที่มีอยู่ได้โดยตรงในอุปกรณ์ และไม่จำเป็นต้องดูแลบริการภายนอกแอป Android

ฉันใช้ AppFunctions ในแอปแล้ว ทำไมเอเจนต์ระบบของฉันจึงเข้าถึง AppFunctions ไม่ได้

AppFunctions เป็นฟีเจอร์รุ่นทดลอง เพื่อให้ประเมินคุณภาพของประสบการณ์การใช้งานโดยรวมได้อย่างรอบคอบในระยะทดลองนี้ มีเพียงแอปและเอเจนต์ระบบจำนวนจำกัดเท่านั้นที่เข้าถึงไปป์ไลน์ทั้งหมดได้

ฉันจะเตรียมแอปให้พร้อมสำหรับเวอร์ชันสำหรับผู้ใช้ทั่วไปของ AppFunctions ได้อย่างไร

พิจารณาฟีเจอร์ของแอปที่ต้องการแสดงให้การทำงานอัตโนมัติที่ได้จากตัวแทน คุณสามารถใช้ AppFunctions ในแอปได้ โดยทำตามขั้นตอนในส่วนก่อนหน้าของหน้านี้ และตรวจสอบว่าได้ลงทะเบียนในอุปกรณ์แล้วโดยเรียกใช้ adb shell cmd app_function list-app-functions

ฉันจะได้รับสิทธิ์เข้าถึงประสบการณ์การใช้งานแบบครบวงจรสำหรับนักพัฒนาแอปที่ได้จากตัวแทนก่อนใครได้ไหม

เรากำลังจัดโปรแกรมทดลองใช้ก่อนเปิดตัว (EAP) เพื่อให้แอปที่เลือกเข้าร่วมทดสอบประสบการณ์การใช้งานแบบครบวงจรสำหรับนักพัฒนาแอปที่จำเป็นต่อการเปิดตัว AppFunctions ในเวอร์ชันที่ใช้งานจริงบน Android คุณสามารถลงทะเบียนแสดงความสนใจในการผสานรวม AppFunctions ผ่านแบบฟอร์มลงทะเบียน EAP นี้ การลงทะเบียนแสดงความสนใจไม่ได้หมายความว่าคุณจะได้รับสิทธิ์เข้าถึงการผสานรวมทั้งหมดโดยอัตโนมัติ เราจะส่งอีเมลถึงคุณหากแอปของคุณได้รับเลือกให้เข้าร่วม EAP หรือแจ้งให้คุณทราบเมื่อ AppFunctions พร้อมใช้งานแบบสาธารณะ

ฉันจะแสดงความคิดเห็นเกี่ยวกับ AppFunctions ได้อย่างไร

คุณสามารถแสดงความคิดเห็นเกี่ยวกับ API ได้โดยยื่นเรื่องและ ลงทะเบียนแสดงความสนใจในแบบฟอร์มโปรแกรมทดลองใช้ก่อนเปิดตัว