Tạo các ứng dụng Android thông minh: Tích hợp vào hệ thống thông minh của Android bằng AppFunctions
6 phút đọc
Chào mừng bạn quay lại loạt bài đăng trên blog "Tạo ứng dụng Android thông minh". Trong loạt bài này, chúng ta sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và có tác nhân. Trong bài đăng trước, chúng tôi đã khám phá cách tận dụng Firebase AI Logic để tạo các tính năng AI kết hợp và được lưu trữ trên đám mây.
Giao diện người dùng di động truyền thống có ưu điểm là tập trung vào các tác vụ thực tế, còn hệ thống thông minh của Android đang giới thiệu các tính năng bổ sung để giúp các thao tác phức tạp, nhiều bước trở nên dễ dàng hơn. Bằng cách bổ sung cho giao diện người dùng truyền thống, AppFunctions cung cấp một điểm truy cập mới mạnh mẽ: Một tác nhân đặc quyền trên thiết bị có thể truy cập vào các tính năng của ứng dụng ở chế độ nền. Điều này có thể đặc biệt hữu ích khi người dùng đang lái xe, đi bộ hoặc làm nhiều việc khác.
Trong bài viết này, chúng tôi sẽ trình bày cách chúng tôi thiết kế và tích hợp các chức năng này vào ứng dụng lập kế hoạch du lịch JetPacker bằng Android AppFunctions. Chúng ta sẽ khám phá lý do đằng sau các lựa chọn về tính năng, thảo luận về các công cụ chuyên dụng mà chúng tôi đã sử dụng để đẩy nhanh quá trình phát triển và tìm hiểu sâu về mã giúp mọi thứ hoạt động.
Thiết kế các tính năng có sử dụng AI: đưa ra những lựa chọn quan trọng cho người dùng
Để chọn những tính năng sẽ cung cấp cho hệ thống thông minh, chúng tôi đã tìm những tác vụ mà lệnh thoại hoặc lệnh văn bản nhanh hơn một cách khách quan so với việc nhấn vào màn hình. Trong bản ghi màn hình song song này, bạn có thể thấy độ tương phản này một cách hoàn hảo: ở bên trái, người dùng nhấn vào nhiều màn hình để ghi lại một khoản chi phí; ở bên phải, cùng một tác vụ được hoàn thành ngay lập tức ở chế độ nền thông qua một tác nhân đặc quyền.
Lựa chọn đầu tiên của chúng tôi là theo dõi chi phí. Việc ghi lại chi phí mua cà phê trong một chuyến đi thường mất khá nhiều thao tác – mở khoá điện thoại, mở ứng dụng, tìm chuyến đi đang hoạt động, chuyển đến thẻ chi phí, nhấn vào nút thêm, chụp ảnh biên nhận và kiểm tra kết quả. Bằng cách cung cấp các tính năng addExpense và getExpenses dưới dạng AppFunctions, tác nhân hệ thống sẽ xử lý những việc nặng nhọc. Khi người dùng nói "Thêm khoản chi phí 5 đô la cho cà phê vào chuyến đi Paris của tôi", tác nhân sẽ tự động tìm kiếm mã chuyến đi chính xác ở chế độ nền và chèn khoản chi phí đó, hoàn toàn bỏ qua quy trình giao diện người dùng thủ công.
Chúng tôi cũng ưu tiên việc quản lý hành trình. Để biết hoạt động tiếp theo trong một hành trình dày đặc, bạn thường phải di chuyển qua một chế độ xem dòng thời gian dày đặc. Bằng cách cung cấp getItinerary và addItineraryEvent cho hệ thống, người dùng chỉ cần hỏi "Tôi sẽ làm gì tiếp theo ở Paris?" và nhận được câu trả lời ngay lập tức.
Cuối cùng, chúng tôi tập trung vào tính năng ghi chú rảnh tay. Việc nhập lời nhắc hoặc ghi chú trong lúc đi bộ trên một con phố đông đúc là khó khăn và không an toàn. Việc cung cấp khả năng ghi chú bằng giọng nói cho phép người dùng nói "Chuyến bay thật tuyệt vời, tôi đã ngắm được cảnh hoàng hôn tuyệt đẹp và ngủ ngon", sau đó, đặc vụ có đặc quyền sẽ tự động chép lời và lưu trực tiếp vào cơ sở dữ liệu du lịch bằng AppFunction addVoiceNote.
MCP Android dựa trên AppFunctions
Toàn bộ trải nghiệm này được xây dựng trên MCP của Android. Theo thiết kế này, ứng dụng sẽ hoạt động như một máy chủ MCP cục bộ. Thay vì các API từ xa, bạn cung cấp trực tiếp các tính năng của ứng dụng cho hệ thống trí tuệ nhân tạo trên thiết bị.
Android AppFunctions là API hiện thực hoá khái niệm này. Nền tảng này đọc các hàm Kotlin được chú thích và biên dịch chúng thành các định nghĩa công cụ an toàn về kiểu, được cách ly mà tác nhân đặc quyền có thể khám phá và gọi cục bộ trên thiết bị.
Theo mô hình MCP của Android, ứng dụng của bạn đóng vai trò là một máy chủ MCP cục bộ cung cấp các công cụ có cấu trúc, trong khi nền tảng Android đóng vai trò là sổ đăng ký công cụ trung tâm. Ở phía máy khách MCP, các ứng dụng tác nhân được đăng ký với hệ thống thông minh sau khi được cấp quyền đặc quyền của hệ thống để truy cập vào sổ đăng ký.
Khi người dùng tương tác với một tác nhân đã đăng ký, LLM của tác nhân đó sẽ xác định xem yêu cầu có thể được xử lý bằng AppFunction hay không, truy vấn siêu dữ liệu của nền tảng và thực thi các hàm đã đăng ký thích hợp ở chế độ nền. Thiết kế máy chủ-máy khách MCP cục bộ này giúp bạn có toàn quyền kiểm soát: bạn chọn chính xác những tính năng mà tác nhân có thể truy cập, đồng thời giữ kín phần còn lại của dữ liệu trong ứng dụng.
Cách chúng tôi đẩy nhanh quá trình phát triển bằng các kỹ năng Android
Để đơn giản hoá quy trình tích hợp, chúng tôi đã tận dụng kỹ năng phát triển AppFunctions. Kỹ năng phát triển AppFunctions là một người bạn đồng hành hoàn hảo trong quá trình phát triển. Thư viện này hướng dẫn chúng tôi trong toàn bộ vòng đời: ánh xạ các lớp dữ liệu Kotlin để chuyển đổi các tham số nối tiếp, tạo các điểm truy cập Service cần thiết, tinh chỉnh tài liệu KDoc để đảm bảo LLM hiểu được ranh giới tham số và thiết lập kiểm thử tự động bằng ADB.
Cung cấp các tính năng của ứng dụng cho hệ thống thông minh
Đã đủ lý thuyết rồi, hãy bắt đầu triển khai thôi.
Thiết lập cấu hình và phần phụ thuộc
Chúng ta bắt đầu bằng cách thêm các phần phụ thuộc AppFunctions. Một cho API và một cho trình biên dịch Kotlin Symbol Processing.
implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")Mô hình hoá các loại dữ liệu tuỳ chỉnh
Mọi đối tượng tuỳ chỉnh được trao đổi với nhân viên hỗ trợ đều phải được chú thích bằng @AppFunctionSerializable. Trong tệp TripSerializable.kt, chúng ta sẽ xác định mô hình dữ liệu chuyến đi:
@AppFunctionSerializable(isDescribedByKDoc = true) data class TripSerializable( /** The trip's unique identifier. */ val id: String, /** The trip's title. */ val title: String, /** The trip's destination location. */ val location: String, /** The trip's start date in milliseconds. */ val startDate: Long, /** The trip's end date in milliseconds. */ val endDate: Long, /** A list of participants. */ val participants: List<String>, )
Cung cấp các tính năng bằng chú thích @AppFunction
Tiếp theo, kỹ năng này đã viết các hàm Kotlin thực hiện truy vấn cơ sở dữ liệu và chú giải các hàm đó bằng @AppFunction. Chúng ta có thể xem thông tin này trong searchTrip:
/** * Looks for trips based on optional filters like id, title (name), location, and dates. * * @param id The unique identifier of the trip. * @param title The title or name of the trip. * @param location The destination location. * @param startDate The minimum start date in milliseconds. * @param endDate The maximum end date in milliseconds. * @return A list of trips matching the filters. */ @AppFunction(isDescribedByKDoc = true) suspend fun searchTrip( id: String? = null, title: String? = null, location: String? = null, startDate: Long? = null, endDate: Long? = null ): List<TripSerializable> { return withContext(Dispatchers.IO) { // implementation }
Vì AppFunctions chạy trên luồng giao diện người dùng theo mặc định, nên chúng ta sử dụng withContext(Dispatchers.IO) để chuyển sang trình điều phối nền. Ngoài ra, chúng tôi tinh chỉnh KDoc để sử dụng các động từ mệnh lệnh rõ ràng và chỉ định các ràng buộc về tham số. Tài liệu này được biên dịch trực tiếp vào giản đồ của công cụ mà tác nhân đặc quyền dùng để phân giải các tham số và xử lý lỗi thời gian chạy.
Điểm truy cập dịch vụ và tích hợp Hilt
Để đăng ký các tính năng này với hệ thống thông minh, chúng ta sẽ tạo một lớp cơ sở trừu tượng mở rộng AppFunctionService. Chúng ta chú thích hàm này bằng @AppFunctionServiceEntryPoint:
@RequiresApi(36) @AndroidEntryPoint @AppFunctionServiceEntryPoint( serviceName = "JetPackerAppFunctionService", appFunctionXmlFileName = "jetpacker_app_function_service" ) abstract class BaseJetPackerAppFunctionService : AppFunctionService() { @Inject internal lateinit var tripDao: TripDao // DAOs and database references are injected here... }
Trong quá trình biên dịch, KSP sẽ tạo ra lớp con dịch vụ cụ thể cuối cùng, JetPackerAppFunctionService, như được khai báo bằng tham số serviceName. Chúng ta cũng đăng ký app_metadata.xml trong tệp kê khai của ứng dụng. Tệp này cung cấp các quy tắc hoạt động chung cho AppFunctions đã khai báo của JetPacker.
Kiểm thử và xác minh AppFunctions
Sau khi triển khai, bạn nên xác minh rằng AppFunction đã được đăng ký và hoạt động đúng cách.
Khi chạy các thiết bị hoặc trình mô phỏng có Android 17 trở lên, bạn có thể dùng các lệnh ADB từ thiết bị đầu cuối để liệt kê và gọi các hàm. Thao tác chạy adb shell cmd app_function list-app-functions sẽ hiển thị tất cả các hàm đã đăng ký cho gói của bạn. Sau đó, bạn có thể thực thi một hàm cụ thể và kiểm thử quá trình tích hợp cơ sở dữ liệu của hàm đó bằng cách chạy adb shell cmd app_function execute-app-function trong khi truyền một chuỗi tham số JSON thô.
Thay vì dùng các lệnh ADB này, bạn cũng có thể sử dụng Tác nhân kiểm thử AppFunctions để kiểm tra cấu hình, liệt kê và thực thi AppFunctions, thậm chí xem cách AppFunctions hoạt động trong một luồng trò chuyện thực tế.
Kết thúc
Khi nghĩ về các tính năng của ứng dụng có thể đóng góp cho hệ thống thông minh bằng AppFunctions, chúng ta cần thay đổi một chút về cách nghĩ về mã và tài liệu. AppFunctions cho phép bạn sử dụng mô hình tương tác mới này cho các ứng dụng, cho phép sử dụng một tác nhân để truy cập vào các tính năng của ứng dụng.
Trước tiên, kỹ năng phát triển AppFunctions là một công cụ thiết yếu trong vòng đời, giúp bạn khám phá các tính năng, triển khai và tinh chỉnh AppFunctions cho ứng dụng của mình. Thứ hai, chú thích KDoc là một thành phần API được biên dịch; nội dung mô tả rõ ràng về tham số sẽ ảnh hưởng trực tiếp đến độ chính xác khi thực thi của tác nhân hệ thống. Cuối cùng, MCP Android cung cấp hoạt động thực thi ưu tiên cục bộ, cho phép các ứng dụng cộng tác an toàn với các tác nhân AI.
Việc đóng góp các tính năng của ứng dụng thông qua AppFunctions giúp ứng dụng của bạn sẵn sàng cho hệ thống thông minh. Hãy cho chúng tôi biết cách bạn điều chỉnh ứng dụng của mình cho phù hợp với kỷ nguyên dựa trên tác nhân!
Tìm hiểu thêm
Hãy xem các phần khác trong loạt bài đăng này trên blog:
Phần 1: Giới thiệu về ứng dụng và thông tin tổng quan cấp cao.
Phần 2: Trí thông minh trên thiết bị. Tìm hiểu sâu về các API GenAI của Bộ công cụ học máy và Gemini Nano để xây dựng các tính năng ưu tiên quyền riêng tư như tóm tắt hành trình, phân tích biên nhận và xử lý âm thanh cục bộ.
Phần 3: Suy luận kết hợp và trên đám mây. Khám phá cách sử dụng Firebase AI Logic để đưa ra câu trả lời dựa trên LLM trong dữ liệu thực tế như Google Maps và bối cảnh web.
Phần 4 (bài đăng này!): Tích hợp hệ thống. Tích hợp với hệ thống thông tin thông minh của Android bằng AppFunctions.
Phần 5 (sắp ra mắt): Quy trình làm việc dựa trên tác nhân trong ứng dụng. Mở rộng ứng dụng bằng một trợ lý đặt phòng toàn diện dựa trên A2UI và ADK.
Bạn muốn tìm hiểu thêm về hoạt động phát triển trên Android? Theo dõi Android Developers trên YouTube hoặc LinkedIn!
Tất cả đoạn mã trong bài đăng này trên blog đều tuân theo thông báo bản quyền sau đây:
Copyright 2026 Google LLC. SPDX-License-Identifier: Apache-2.0
-
Hướng dẫnChào mừng bạn quay lại loạt bài đăng trên blog "Tạo ứng dụng Android thông minh", nơi chúng ta sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và có tác nhân. Trong bài đăng trước, chúng tôi đã giới thiệu Jetpacker, ứng dụng minh hoạ mà chúng tôi sẽ sử dụng trong suốt loạt bài này.
Caren Chang • 6 phút đọc -
Hướng dẫnChào mừng bạn quay lại loạt bài đăng trên blog "Tạo ứng dụng Android thông minh", nơi chúng ta sẽ lấy một ứng dụng Android cơ bản và biến đổi ứng dụng đó thành một trải nghiệm được cá nhân hoá, thông minh và có tác nhân.
Thomas Ezan, Jolanda Verhoef, Caren Chang • 8 phút đọc -
Hướng dẫnJetpacker là một ứng dụng trình diễn kỹ thuật do nhóm của chúng tôi xây dựng từ đầu cho Google I/O năm nay (được xây dựng bằng Antigravity). Về cơ bản, Jetpacker giúp người dùng lên kế hoạch, khám phá và tận hưởng chuyến phiêu lưu lớn tiếp theo.
Jolanda Verhoef • 4 phút đọc
Nhận thông tin chi tiết mới nhất về hoạt động phát triển trên Android trong hộp thư đến của bạn mỗi tuần.