使用指南

建構智慧型 Android 應用程式:使用 AppFunctions 整合至 Android 的智慧型系統

6 分鐘小故事
查看 Ben Weiss 的個人資料
Ben Weiss 開發人員關係工程師

歡迎回到「建構智慧型 Android 應用程式」系列網誌文章。我們將以基本的 Android 應用程式為基礎,逐步改造為個人化、智慧型和代理型體驗。在先前的文章中,我們探討了如何運用 Firebase AI Logic 建構雲端代管和混合式 AI 功能。

傳統行動裝置 UI 擅長處理需要專注的手動作業,而 Android 智慧系統則推出互補功能,進一步簡化複雜的多步驟動作。除了傳統使用者介面,AppFunctions 還提供強大的新進入點:裝置上的特權代理程式可以在背景存取應用程式功能。這項功能在使用者開車、走路或同時處理其他事務時特別實用。

在本文中,我們將說明如何使用 Android AppFunctions,在旅遊規劃應用程式 JetPacker 中設計及整合這些功能。我們會探討功能選擇背後的理由、討論用於加速開發的專用工具,並深入瞭解讓一切運作的程式碼。

設計 AI 功能:為使用者做出重要選擇

為選取要提供給智慧系統的功能,我們尋找的任務是語音或文字指令比輕觸螢幕更快。在這段並排螢幕錄影中,您可以清楚看到兩者的差異:左側是使用者輕觸多個畫面來記錄支出;右側則是透過具備權限的代理程式,在背景中即時完成相同工作。

我們首先選擇了費用追蹤。在旅途中記錄咖啡費用通常需要輕觸多次:解鎖手機、開啟應用程式、找到進行中的行程、前往「費用」分頁、輕觸「新增」按鈕、拍攝收據相片,然後檢查結果。透過以 AppFunctions 形式提供 addExpensegetExpenses 功能,系統代理程式可處理繁重的工作。當使用者說出「Add a five-dollar coffee expense to my Paris trip」(在巴黎行程中新增 $5 美元的咖啡費用) 時,代理程式會在背景自動搜尋正確的行程 ID 並插入費用,完全略過手動 UI 流程。

我們也優先處理行程管理功能。在行程滿檔的旅程中,如要找出下一個活動,通常需要捲動瀏覽密密麻麻的時間軸檢視畫面。只要向系統提供 getItineraryaddItineraryEvent,使用者就能直接詢問「我在巴黎的下一個行程是什麼?」,並立即獲得解答。

最後,我們著重於免持擷取附註。在繁忙的街道上行走時,打字輸入提醒事項或記事既困難又不安全。公開語音記事功能後,使用者就能說出「這趟航班很棒,我看到美麗的日落,而且睡得很好」,而具備權限的代理程式會自動轉錄並直接儲存到旅遊資料庫,方法是使用 addVoiceNote AppFunction。

Android MCP (由 AppFunctions 提供技術支援)

這項體驗完全建構在 Android MCP 上。根據這項設計,應用程式會做為本機 MCP 伺服器。您可直接向裝置端智慧系統提供應用程式功能,而非遠端 API。

Android AppFunctions API 可實現這個概念。這項工具會讀取註解的 Kotlin 函式,並編譯成型別安全且經過沙箱處理的工具定義,讓具備權限的代理程式可在裝置本機上探索及叫用這些工具。

Android MCP diagram.png
這張圖表顯示我們的應用程式、Android 平台和系統代理程式如何協調 AppFunctions。

在 Android MCP 模型中,應用程式會做為公開結構化工具的本機 MCP 伺服器,而 Android 平台則做為中央工具登錄。在 MCP 用戶端,代理程式應用程式獲得存取登錄的系統特殊權限後,就會向智慧系統註冊。

使用者與已註冊的代理程式互動時,代理程式的 LLM 會判斷要求是否可由 AppFunction 處理、查詢平台的 metadata,並在背景執行適當的已註冊函式。這種本機 MCP 用戶端/伺服器設計可讓您完全掌控:您可以選擇代理程式可存取的確切功能,確保應用程式的其餘資料保持私密。

我們如何運用 Android 技能加速開發

為簡化整合程序,我們運用了 AppFunctions 開發技能。AppFunctions 開發技能是完整的開發夥伴,這項工具引導我們完成整個生命週期:將 Kotlin 資料類別對應至序列化參數、產生必要的 Service 進入點、修正 KDoc 說明文件以確保 LLM 瞭解參數界線,以及使用 ADB 設定自動化測試。

向智慧系統提供應用程式功能

理論就說到這裡,現在來深入瞭解實作方式。

設定和依附元件設定

首先,請新增 AppFunctions 依附元件。一個用於 API,另一個用於 Kotlin 符號處理編譯器。

implementation("androidx.appfunctions:appfunctions:1.0.0-alpha10")
ksp("androidx.appfunctions:appfunctions-compiler:1.0.0-alpha10")

模擬自訂資料類型

與代理程式交換的任何自訂物件都必須使用 @AppFunctionSerializable 註解。在 TripSerializable.kt 檔案中,我們會定義行程資料模型:

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

使用 @AppFunction 註解提供功能

接著,技能會編寫執行資料庫查詢的 Kotlin 函式,並使用 @AppFunction 加上註解。我們可以在 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
}

由於 AppFunctions 預設會在 UI 執行緒上執行,因此我們使用 withContext(Dispatchers.IO) 切換至背景調度工具。此外,我們也修正 KDoc,使用明確的祈使動詞,並指定參數限制。這份文件會直接編譯到工具的結構定義中,供具備特殊權限的代理程式用來解析參數及處理執行階段錯誤。

服務進入點和 Hilt 整合

如要向智慧系統註冊這些功能,請建立延伸 AppFunctionService 的抽象基礎類別。我們使用 @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...
}

在編譯期間,KSP 會產生最終具體服務子類別 JetPackerAppFunctionService,並以 serviceName 參數宣告。我們也會在應用程式的資訊清單中註冊 app_metadata.xml。這個檔案提供 JetPacker 宣告的 AppFunction 全球作業規則。

測試及驗證 AppFunctions

實作完成後,請確認 AppFunctions 已註冊且運作正常。

如果執行 Android 17 以上版本的裝置或模擬器,您可以使用終端機的 ADB 指令列出及叫用函式。執行 adb shell cmd app_function list-app-functions 會顯示套件的所有已註冊函式。接著,您可以執行特定函式,並傳遞原始 JSON 參數字串,藉此執行 adb shell cmd app_function execute-app-function 來測試資料庫整合。

除了使用這些 ADB 指令,您也可以使用 AppFunctions 測試代理程式檢查設定、列出及執行 AppFunctions,甚至查看 AppFunctions 在實際對話流程中的行為。

總結

思考如何使用 AppFunctions 將應用程式功能提供給智慧系統時,我們需要稍微改變對程式碼和說明文件的想法。您可以透過 AppFunctions 為應用程式使用這項新的互動模式,讓代理程式存取應用程式功能。

首先,AppFunctions 開發技能是不可或缺的生命週期工具,可協助您探索功能、為應用程式導入及改善 AppFunctions。其次,KDoc 註解是編譯後的 API 資產,清楚的參數說明會直接影響系統代理的執行準確度。最後,Android MCP 提供本機優先執行功能,讓應用程式安全地與 AI 代理程式協作。

透過 AppFunctions 提供應用程式功能,讓應用程式準備好與智慧系統整合。歡迎與我們分享您如何因應 AI 代理時代調整應用程式!

瞭解詳情

請參閱本網誌文章系列的其餘部分:
第 1 部分:應用程式簡介和高階總覽。
第 2 部分:裝置端智慧功能。深入瞭解 ML Kit 的 GenAI API 和 Gemini Nano,建構以隱私權為優先考量的功能,例如行程摘要、收據剖析和本機音訊處理。
第 3 部分:混合式和雲端推理。瞭解如何使用 Firebase AI Logic,以 Google 地圖和網路環境等真實世界資料為大型語言模型回覆建立基準。
第 4 部分 (本文):系統整合。使用 AppFunctions 與 Android 智慧系統整合。
第 5 部分 (即將推出):應用程式內代理式工作流程。使用 A2UI 和 ADK 擴充應用程式,加入端對端預訂助理。

想進一步瞭解 Android 開發作業嗎?在 YouTubeLinkedIn 上追蹤 Android 開發人員!

本網誌文章中的所有程式碼片段均遵守下列著作權通知:

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
撰寫者:
繼續閱讀