使用指南

建構智慧型 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,自動轉錄並直接儲存到旅遊資料庫。

由 AppFunctions 支援的 Android MCP

這項體驗完全建構在 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
撰寫者:
繼續閱讀