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 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 ได้โดยยื่นเรื่องและ ลงทะเบียนแสดงความสนใจในแบบฟอร์มโปรแกรมทดลองใช้ก่อนเปิดตัว