AppFunctions เป็น API ของแพลตฟอร์ม Android พร้อมด้วย ไลบรารี Jetpack ที่มาพร้อมกันเพื่อลดความซับซ้อนในการผสานรวม Android MCP โดยช่วยให้แอปของคุณทำงานเหมือนเซิร์ฟเวอร์ MCP ในอุปกรณ์ ซึ่งมีฟังก์ชันที่ทำหน้าที่เป็นเครื่องมือสำหรับฟีเจอร์เชิงรุก รวมถึง Agent และ Assistant เช่น Google Gemini ณ เดือนพฤษภาคม 2026 การผสานรวม AppFunctions กับ Gemini อยู่ในเวอร์ชันทดลองใช้แบบส่วนตัวกับผู้ทดสอบที่เชื่อถือได้ คุณสามารถเริ่มเตรียมแอปให้พร้อมใช้ AppFunctions และเครื่องมือการพัฒนาได้แล้วตอนนี้
การกำหนด AppFunctions เหล่านี้จะช่วยให้แอปของคุณให้บริการ ข้อมูล และการดำเนินการแก่รีจิสทรีที่สร้างขึ้นในระบบปฏิบัติการ Android ซึ่งช่วยให้ผู้ใช้ทำงานให้เสร็จสมบูรณ์ผ่าน Agent และการโต้ตอบระดับระบบได้
AppFunctions ทำหน้าที่เป็นเครื่องมือที่เทียบเท่ากับเครื่องมือใน Model Context
Protocol (MCP) สำหรับอุปกรณ์เคลื่อนที่ แม้ว่าโดยทั่วไปแล้ว MCP จะกำหนดมาตรฐานวิธีที่ Agent เชื่อมต่อกับเครื่องมือฝั่งเซิร์ฟเวอร์ แต่ AppFunctions ก็มีกลไกเดียวกันสำหรับแอป Android ซึ่งช่วยให้คุณแสดงความสามารถของแอปเป็น "เครื่องมือ" ที่จัดระเบียบได้ ซึ่งแอปที่ได้รับอนุญาต (ผู้เรียก) สามารถค้นพบและเรียกใช้เพื่อตอบสนองความตั้งใจของผู้ใช้ ผู้เรียกต้องมีสิทธิ์ EXECUTE_APP_FUNCTIONS จึงจะ
ค้นพบและเรียกใช้ AppFunctions ได้ และอาจรวมถึง Agent, แอป และ AI
Assistant เช่น 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 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เวิร์กโฟลว์ข้ามแอป
- คำขอของผู้ใช้: "ค้นหาสูตรก๋วยเตี๋ยวจากอีเมลของ Lisa แล้วเพิ่ม ส่วนผสมลงในรายการช็อปปิ้งของฉัน"
- การดำเนินการของ 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ปฏิทินและการกำหนดเวลา
- คำขอของผู้ใช้: "เพิ่มปาร์ตี้วันเกิดของแม่ลงในปฏิทินของฉันในวัน จันทร์หน้าเวลา 6 โมงเย็น"
- การดำเนินการของ AppFunction: แอปที่ได้จากตัวแทนที่ได้รับอนุมัติจะเรียกใช้ฟังก์ชัน "สร้างกิจกรรม" ของแอปปฏิทิน โดยแยกวิเคราะห์บริบทที่เกี่ยวข้อง เช่น "วันจันทร์หน้า" และ "6 โมงเย็น" เพื่อสร้างรายการโดยที่ผู้ใช้ไม่ต้องเปิดปฏิทินด้วยตนเอง
/** * 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
แผนภาพต่อไปนี้แสดงขั้นตอนทั่วไปที่แอปแชร์ AppFunctions กับ Agent และเรียกใช้ AppFunctions ในภายหลัง Agent มีแนวโน้มที่จะพิจารณาทั้งเครื่องมือ MCP ระยะไกลฝั่งเซิร์ฟเวอร์และ AppFunctions ในเครื่องพร้อมกันเมื่อจัดการคำขอของผู้ใช้ ขั้นตอนโดยละเอียดสำหรับการใช้ AppFunctions ในเครื่องมีดังนี้
- การประกาศ AppFunction: แอป Android ได้รับการสร้างขึ้นเพื่อใช้ AppFunctions ในการ ทำให้ฟีเจอร์ต่างๆ พร้อมใช้งาน เช่น "สร้างโน้ต" หรือ "ส่งข้อความ"
- การสร้างสคีมา: ไลบรารี AppFunctions Jetpack จะสร้างไฟล์สคีมา XML ที่แสดงรายการ AppFunctions ที่ประกาศไว้ทั้งหมดในแอป ระบบปฏิบัติการ Android ใช้ไฟล์นี้เพื่อจัดทำดัชนี AppFunctions ที่พร้อมใช้งาน
- การดึงข้อมูลเมตา: Agent สามารถดึงข้อมูลเมตาของ AppFunction ได้โดยการ ค้นหาข้อมูลเมตา
- การเลือกและการเรียกใช้ AppFunction: Agent จะเลือกและเรียกใช้ AppFunction ที่เหมาะสมพร้อมพารามิเตอร์ที่เหมาะสมตามข้อความแจ้งของผู้ใช้
ไลบรารี AppFunctions Jetpack ช่วยลดความซับซ้อนในการแสดงฟังก์ชันการทำงานของแอป
โดยใช้โปรเซสเซอร์สำหรับคำอธิบายประกอบเพื่อใส่คำอธิบายประกอบฟังก์ชันที่ต้องการให้เอเจนต์ใช้ได้ จากนั้นผู้เรียกจะค้นพบและเรียกใช้ฟังก์ชันที่จัดทำดัชนีเหล่านี้ได้โดยใช้ 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 อย่างไร
ทั้ง 2 อย่างช่วยให้ AI Agent จัดระเบียบเครื่องมือได้ แต่มีสถาปัตยกรรม เวลาในการตอบสนอง และความพยายามของนักพัฒนาแอปที่จำเป็นแตกต่างกันอย่างมาก AppFunctions เป็นฮุกระดับระบบปฏิบัติการในตัวที่ใช้ได้เฉพาะใน Android ซึ่งทำงานในเครื่อง ในทางตรงกันข้าม เซิร์ฟเวอร์ MCP มาตรฐานเป็นโซลูชันที่ไม่ขึ้นกับแพลตฟอร์ม ซึ่งอาศัยการดำเนินการบนคลาวด์และการรับส่งข้อมูลผ่านเครือข่าย
กล่าวโดยย่อ การพัฒนาด้วย AppFunctions ช่วยให้คุณใช้สถานะแอปที่มีอยู่บนอุปกรณ์ได้โดยตรง และไม่จำเป็นต้องดูแลบริการภายนอกแอป Android
ฉันใช้ AppFunctions ในแอปแล้ว ทำไม Agent ของระบบจึงเข้าถึง AppFunctions ไม่ได้
AppFunctions เป็นฟีเจอร์ทดลอง เพื่อให้ประเมินคุณภาพของประสบการณ์โดยรวมได้อย่างรอบคอบในระยะทดลองนี้ มีเพียงแอปและ Agent ของระบบจำนวนจำกัดเท่านั้นที่เข้าถึงไปป์ไลน์ทั้งหมดได้
ฉันจะเตรียมแอปให้พร้อมสำหรับเวอร์ชันสำหรับผู้ใช้ทั่วไปของ AppFunctions ได้อย่างไร
พิจารณาฟีเจอร์ของแอปที่ต้องการแสดงให้การทำงานอัตโนมัติของ Agent
คุณสามารถใช้ AppFunctions ในแอปได้ โดยทำตามขั้นตอนในส่วนก่อนหน้าของหน้านี้ และตรวจสอบว่าได้ลงทะเบียนไว้ในอุปกรณ์โดยเรียกใช้ adb shell cmd app_function list-app-functions
ฉันจะรับสิทธิ์เข้าถึงประสบการณ์ของนักพัฒนาแอปที่ได้จากตัวแทนแบบครบวงจรได้ไหม
เรากำลังจัดโปรแกรมทดลองใช้ก่อนเปิดตัว (EAP) เพื่อให้แอปที่เลือกเข้าร่วมทดสอบประสบการณ์ของนักพัฒนาแอปแบบครบวงจรที่จำเป็นสำหรับการเปิดตัว AppFunctions ในเวอร์ชันที่ใช้งานจริงบน Android คุณสามารถลงทะเบียนแสดงความสนใจในการผสานรวม AppFunctions ผ่านแบบฟอร์มการลงทะเบียน EAP นี้ การลงทะเบียนแสดงความสนใจไม่ได้หมายความว่าคุณจะได้รับสิทธิ์เข้าถึงการผสานรวมทั้งหมดโดยอัตโนมัติ เราจะส่งอีเมลถึงคุณหากแอปของคุณได้รับเลือกให้เข้าร่วม EAP หรือแจ้งให้คุณทราบเมื่อ AppFunctions พร้อมให้บริการแก่สาธารณะ
ฉันจะแสดงความคิดเห็นเกี่ยวกับ AppFunctions ได้อย่างไร
คุณสามารถแสดงความคิดเห็นเกี่ยวกับ API ได้โดยการยื่นปัญหาและ ลงทะเบียนแสดงความสนใจในแบบฟอร์มโปรแกรมทดลองใช้ก่อนเปิดตัว