AppFunctions cho phép ứng dụng Android của bạn chia sẻ các phần chức năng cụ thể mà hệ thống cũng như nhiều trợ lý và tác nhân AI có thể khám phá và gọi. Bằng cách xác định các hàm này, bạn cho phép ứng dụng của mình cung cấp các dịch vụ, dữ liệu và thao tác cho hệ điều hành Android, cho phép người dùng hoàn thành các tác vụ thông qua các tác nhân AI và hoạt động tương tác ở cấp hệ thống.
AppFunctions đóng vai trò tương đương với các công cụ trên thiết bị di động trong Giao thức ngữ cảnh mô hình (MCP). Mặc dù MCP thường chuẩn hoá cách các tác nhân kết nối với các công cụ phía máy chủ, nhưng AppFunctions cung cấp cơ chế tương tự cho các ứng dụng Android. Điều này cho phép bạn hiển thị các chức năng của ứng dụng dưới dạng "công cụ" có thể điều phối mà các ứng dụng được uỷ quyền (trình gọi) có thể khám phá và thực thi để đáp ứng ý định của người dùng. Người gọi phải có quyền EXECUTE_APP_FUNCTIONS để khám phá và thực thi AppFunctions, đồng thời có thể bao gồm các tác nhân, ứng dụng và trợ lý AI như Gemini.
AppFunctions hoạt động với các thiết bị chạy Android 16 trở lên.
Ví dụ về các trường hợp sử dụng
AppFunctions cung cấp một cơ chế mạnh mẽ để tự động hoá các tác vụ và đơn giản hoá hoạt động tương tác của người dùng. Bằng cách cho thấy các chức năng của ứng dụng, bạn cho phép người dùng hoàn thành các mục tiêu phức tạp bằng ngôn ngữ tự nhiên, thường bỏ qua nhu cầu điều hướng từng bước theo cách thủ công bằng giao diện người dùng của bạn.
Các tình huống sau đây minh hoạ cách AppFunctions có thể được dùng để thúc đẩy trải nghiệm trong nhiều danh mục ứng dụng:
- Quản lý công việc và tăng năng suất
- Yêu cầu của người dùng: "Nhắc tôi đến lấy gói hàng tại nơi làm việc hôm nay lúc 5 giờ chiều".
- Hành động AppFunction: Phương thức gọi xác định ứng dụng quản lý tác vụ có liên quan và gọi một hàm để tạo tác vụ, tự động điền các trường tiêu đề, thời gian và vị trí dựa trên câu lệnh của người dùng.
- Truyền thông và giải trí
- Yêu cầu của người dùng: "Tạo một danh sách phát mới gồm những album nhạc jazz hàng đầu của năm nay".
- Thao tác AppFunction: Phương thức gọi thực thi một hàm tạo danh sách phát trong một ứng dụng nhạc, truyền ngữ cảnh như "các đĩa nhạc jazz hàng đầu năm 2026" làm truy vấn để tạo và khởi chạy nội dung ngay lập tức.
- Quy trình công việc trên nhiều ứng dụng
- Yêu cầu của người dùng: "Tìm công thức mì trong email của Lisa và thêm các nguyên liệu vào danh sách mua sắm của tôi".
- Thao tác AppFunction: Yêu cầu này sử dụng các hàm từ nhiều ứng dụng. Trước tiên, người gọi sử dụng chức năng tìm kiếm của ứng dụng email để truy xuất nội dung. Sau đó, ứng dụng này sẽ trích xuất các thành phần có liên quan và gọi chức năng của một ứng dụng danh sách mua sắm để điền danh sách của người dùng.
- Lịch và lên lịch
- Yêu cầu của người dùng: "Thêm tiệc sinh nhật của mẹ vào lịch của tôi vào 6 giờ tối thứ Hai tuần sau".
- Hành động AppFunction: Ứng dụng có tính chất đại lý đã được phê duyệt sẽ gọi chức năng "tạo sự kiện" của ứng dụng lịch, phân tích cú pháp ngữ cảnh liên quan như "thứ Hai tới" và "6 giờ chiều" để tạo mục nhập mà không cần người dùng mở lịch theo cách thủ công.
Cách hoạt động của AppFunctions
AppFunctions là một tính năng nền tảng Android 16 và thư viện Jetpack đi kèm cho phép các ứng dụng hiển thị các chức năng cụ thể để người gọi (chẳng hạn như ứng dụng trợ lý) truy cập và thực thi trên thiết bị.
Sơ đồ sau đây minh hoạ quy trình thông thường về cách các ứng dụng chia sẻ AppFunction với một tác nhân và sau đó thực thi. Các tác nhân có thể xem xét cả công cụ MCP từ xa phía máy chủ và AppFunctions cục bộ cùng nhau khi xử lý các yêu cầu của người dùng. Sau đây là quy trình chi tiết để sử dụng AppFunctions cục bộ:
- Khai báo AppFunction: Ứng dụng Android được tạo để hiển thị AppFunction của ứng dụng, chẳng hạn như "Tạo ghi chú" hoặc "Gửi tin nhắn".
- Tạo giản đồ: Thư viện AppFunctions Jetpack tạo một tệp giản đồ XML liệt kê tất cả AppFunctions đã khai báo trong ứng dụng. Hệ điều hành Android dùng tệp này để lập chỉ mục các AppFunctions có sẵn.
- Truy xuất siêu dữ liệu: Tác nhân có thể truy xuất siêu dữ liệu AppFunction bằng cách truy vấn siêu dữ liệu đó.
- Lựa chọn và thực thi AppFunction: Dựa trên câu lệnh của người dùng, tác nhân sẽ chọn và thực thi AppFunction phù hợp với các tham số thích hợp.
Thư viện AppFunctions Jetpack giúp đơn giản hoá việc hiển thị chức năng của ứng dụng.
Với trình xử lý chú giải, nhà phát triển chú giải các hàm mà họ muốn hiển thị. Sau đó, người gọi có thể khám phá và gọi các hàm được lập chỉ mục này bằng cách sử dụng AppFunctionManager.
Ứng dụng của bạn không bắt buộc phải xác minh xem tính năng AppFunction có được hỗ trợ hay không; việc này sẽ được tự động xử lý trong thư viện Jetpack. Ví dụ: AppFunctionManager có thể xác minh xem tính năng có được hỗ trợ hay không.
Dưới đây là ví dụ về AppFunctions cho một ứng dụng ghi chú có các chức năng tạo, chỉnh sửa và liệt kê ghi chú.
class NoteFunctions(
private val noteRepository: NoteRepository
) {
/**
* A note.
*
* @param id The note's ID.
* @param title The note's title.
* @param content The note's content.
*/
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Note(val id: Int, val title: String, val content: String)
/**
* 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 if (noteRepository.appNotes.isEmpty()) null else viewModel.appNotes
}
/**
* 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 new 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: String,
title: String?,
content: String,
): Note? {
return noteRepository.updateNote(noteId, title, content)
}
}