Tổng quan về AppFunction

AppFunctions là một API nền tảng Android đi kèm với thư viện Jetpack để đơn giản hoá quá trình tích hợp MCP Android. Nó cho phép các ứng dụng của bạn hoạt động như các máy chủ MCP trên thiết bị, đóng góp các chức năng đóng vai trò là công cụ để các tính năng chủ động sử dụng cùng với các tác nhân và trợ lý, chẳng hạn như Google Gemini. Kể từ tháng 5 năm 2026, tính năng tích hợp AppFunctions với Gemini sẽ ở chế độ xem trước riêng tư với những người kiểm thử đáng tin cậy. Bạn có thể bắt đầu chuẩn bị ứng dụng ngay bây giờ để sử dụng AppFunctions và các công cụ phát triển.

Bằng cách xác định các AppFunction 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à hành động cho sổ đăng ký được tích hợp vào 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 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ùng một cơ chế 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 (người 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 AppFunction, đồng thời có thể bao gồm các tác nhân, ứng dụng và trợ lý AI như Gemini.

AppFunctions có trên 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 mở rộng 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 thay thế 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.

    /**
     * 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()

  • 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".
    • Hành động 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 âm 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 danh sách phát ngay lập tức.

    /**
     * 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()

  • 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.

    /**
     * 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()

  • 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.

    /**
     * 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()

Cách hoạt động của AppFunctions

Sơ đồ sau đây minh hoạ quy trình điển hình 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 để sử dụng AppFunction nhằm cung cấp các tính năng, chẳng hạn như "Tạo ghi chú" hoặc "Gửi tin nhắn".
  • Tạo lược đồ: Thư viện AppFunctions Jetpack tạo một tệp lược đồ 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 đó. Ngoài KDoc dành riêng cho từng chức năng, nhà phát triển có thể xác định các mẫu hoạt động và ràng buộc ở cấp ứng dụng trong siêu dữ liệu ứng dụng để hướng dẫn việc điều phối tác nhân trên nhiều công cụ.
  • Lựa chọn và thực thi AppFunction: Dựa trên lời nhắc 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.
Luồng AppFunctions thông thường từ việc hiển thị ứng dụng đến việc thực thi tác nhân.
Hình 1: Quy trình điển hình về cách AppFunctions được hiển thị và sau đó được thực thi bởi một tác nhân.

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, bạn chú giải các hàm mà bạn muốn cung cấp cho các tác nhân. 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.

Trước khi gọi một hàm, người gọi phải xác minh rằng thiết bị hỗ trợ tính năng AppFunctions bằng cách cố gắng truy xuất một phiên bản của AppFunctionManager. Sau khi được hỗ trợ, các phương thức gọi có thể xác minh xem một hàm cụ thể có được bật trong ứng dụng mục tiêu hay không bằng cách sử dụng isAppFunctionEnabled(packageName,functionId). Để truy vấn trạng thái của các hàm trong những gói khác, bạn cần có android.permission.EXECUTE_APP_FUNCTIONSpermission.

Ứ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ẽ tự động được xử lý trong thư viện Jetpack. Ví dụ: AppFunctionManager có thể xác minh xem tính năng này có được hỗ trợ hay không.

Sau đâ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ú:

@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,
)

Mẫu, kỹ năng và công cụ kiểm thử

Chúng tôi đã cung cấp những tài nguyên sau đây để giúp bạn nâng cao kỹ năng về AppFunctions:

  • Khám phá mẫu AppFunctions để xác minh và khám phá cách mọi thứ hoạt động trên thiết bị của bạn.
  • Sử dụng kỹ năng của tác nhân AppFunctions để đẩy nhanh quá trình phát triển trong vòng đời gồm 4 bước:
    • Khám phá: Phân tích toàn bộ mã nguồn của bạn để xác định và đề xuất các tính năng có giá trị cao cho việc điều phối AI.
    • Triển khai và định cấu hình: Tạo các hoạt động triển khai Kotlin, đồng thời định cấu hình siêu dữ liệu hệ thống và các phần phụ thuộc của bản dựng.
    • Tinh chỉnh KDoc: Tối ưu hoá tài liệu về hàm và thuộc tính cho các tác nhân AI và MCP Android.
    • Kiểm thử và gỡ lỗi: Cung cấp các lệnh ADB để đánh giá cục bộ và gỡ lỗi trên thiết bị.
  • Để kiểm thử và xác minh bằng dòng lệnh, hãy dùng các lệnh ADB như adb shell cmd app_function ... làm cách thức trực tiếp và đơn giản để kiểm thử việc đăng ký hàm, kiểm tra nội dung mô tả siêu dữ liệu và thực thi các hàm trên thiết bị.
  • Để trải nghiệm MCP trên Android trong thực tế và kiểm thử quy trình làm việc toàn diện mà không cần bất kỳ lời nhắc nào, hãy cài đặt và sử dụng ứng dụng Android tác nhân kiểm thử AppFunctions trên thiết bị của bạn.

Câu hỏi thường gặp

Phần sau đây giải đáp các câu hỏi thường gặp về AppFunctions.

Tôi là một nhà phát triển ứng dụng. Tôi có thể triển khai AppFunctions ngay hôm nay không?

Có, bạn có thể triển khai và kiểm thử AppFunctions trong ứng dụng của mình bằng cách làm theo hướng dẫn được trình bày chi tiết trong các phần trước.

AppFunctions và MCP có gì khác nhau?

Cả hai đều cho phép các tác nhân AI điều phối các công cụ, nhưng có sự khác biệt đáng kể về cấu trúc, độ trễ và nỗ lực cần thiết của nhà phát triển. AppFunctions là các lệnh gọi ở cấp hệ điều hành được tích hợp dành riêng cho Android và thực thi cục bộ. Ngược lại, máy chủ MCP tiêu chuẩn là một giải pháp độc lập với nền tảng, dựa vào việc thực thi trên đám mây và các chuyến khứ hồi trên mạng.

Nói tóm lại, việc phát triển bằng AppFunctions cho phép bạn sử dụng trực tiếp trạng thái ứng dụng hiện có trên thiết bị và không yêu cầu bạn duy trì các dịch vụ bên ngoài ứng dụng Android.

Tôi đã triển khai AppFunctions trong ứng dụng của mình. Tại sao tác nhân hệ thống của tôi không truy cập được vào các AppFunctions đó?

AppFunctions là một tính năng thử nghiệm. Để đánh giá cẩn thận chất lượng của trải nghiệm tổng thể trong giai đoạn thử nghiệm này, chỉ một số ít ứng dụng và tác nhân hệ thống mới có thể truy cập vào toàn bộ quy trình.

Làm cách nào để chuẩn bị ứng dụng cho giai đoạn phát hành rộng rãi AppFunctions?

Hãy cân nhắc những tính năng nào trong ứng dụng mà bạn muốn cung cấp cho tính năng tự động hoá dựa trên tác nhân. Bạn có thể triển khai AppFunctions trong ứng dụng của mình. Để làm như vậy, hãy làm theo các bước trong các phần trước đó trên trang này và xác minh rằng chúng đã được đăng ký trên thiết bị bằng cách gọi adb shell cmd app_function list-app-functions.

Tôi có thể được sử dụng sớm trải nghiệm nhà phát triển dựa trên tác nhân từ đầu đến cuối không?

Chúng tôi đang triển khai một Chương trình tiếp cận sớm (EAP) để tích hợp một số ứng dụng nhất định vào quá trình kiểm thử trải nghiệm toàn diện dành cho nhà phát triển cần thiết để ra mắt AppFunctions cho phiên bản phát hành công khai trên Android. Bạn có thể đăng ký tham gia chương trình tiếp cận sớm để tích hợp AppFunctions thông qua biểu mẫu đăng ký tham gia EAP này. Khi đăng ký bày tỏ sự quan tâm, bạn KHÔNG tự động có quyền truy cập vào toàn bộ quy trình tích hợp. Chúng tôi sẽ gửi email cho bạn nếu ứng dụng của bạn được chọn tham gia chương trình tiếp cận sớm hoặc để thông báo cho bạn khi AppFunctions được cung cấp công khai.

Làm cách nào để tôi có thể gửi ý kiến phản hồi về AppFunctions?

Bạn có thể gửi ý kiến phản hồi về API bằng cách báo cáo vấn đề và đăng ký tham gia Chương trình tiếp cận sớm thông qua biểu mẫu.