ハウツー

インテリジェントな Android アプリを構築する: AppFunctions を使用して Android のインテリジェンス システムに統合する

所要時間: 6 分
Ben Weiss のプロフィールを表示
Ben Weiss Developer Relations Engineer

ブログ投稿シリーズ「インテリジェントな Android アプリを構築する」にようこそ。このシリーズでは、基本的な Android アプリをパーソナライズされたインテリジェントなエージェント エクスペリエンスに変換します。前回の投稿では、Firebase AI Logic を活用してクラウドホスト型とハイブリッド型の AI 機能を構築する方法について説明しました。

従来のモバイル UI は、集中して行うハンズオン タスクに優れています。Android インテリジェンス システムでは、複雑なマルチステップ アクションをさらに簡単にするための補完的な機能が導入されています。AppFunctions は、従来のユーザー インターフェースを補完することで、強力な新しいエントリ ポイントを提供します。デバイス上の特権エージェントは、バックグラウンドでアプリの機能にアクセスできます。これは、ユーザーが運転中や歩行中など、マルチタスクを行っている場合に特に役立ちます。

この記事では、Android AppFunctions を使用して、これらの機能を旅行プランニング アプリ JetPacker に設計して統合する方法を紹介します。機能の選択の根拠、開発を加速するために使用した専用ツール、すべてを機能させるコードについて説明します。

AI 対応の機能を設計する: ユーザーにとって重要な選択を行う

インテリジェンス システムに提供する機能を選択するために、画面をタップするよりも音声コマンドやテキスト コマンドの方が客観的に速いタスクを探しました。この並列画面録画では、このコントラストが完璧に示されています。左側では、ユーザーが複数の画面をタップして経費を記録しています。右側では、特権エージェントがバックグラウンドで同じタスクを瞬時に完了しています。

最初に選択したのは経費の追跡でした。旅行中にコーヒーの費用を記録するには、通常、スマートフォンをロック解除し、アプリを開き、アクティブな旅行を見つけ、費用のタブに移動し、追加ボタンをタップし、領収書の写真を撮り、結果を確認するなど、かなりの数のタップが必要です。addExpensegetExpenses の機能を AppFunction として提供することで、システム エージェントが重い処理を担います。ユーザーが「パリ旅行に 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 で処理できるかどうかを判断し、プラットフォームのメタデータをクエリして、適切な登録済み関数をバックグラウンドで実行します。このローカル MCP クライアント サーバー設計により、エージェントがアクセスできる機能を正確に選択し、アプリの残りのデータを非公開に保つことができます。

Android スキルで開発を加速した方法

統合プロセスを効率化するために、AppFunctions の開発スキルを活用しました。AppFunctions 開発スキルは、開発を完全にサポートします。このガイドでは、Kotlin データクラスをマッピングしてパラメータをシリアル化する、必要な Service エントリ ポイントを生成する、KDoc ドキュメントを調整して LLM がパラメータの境界を理解できるようにする、ADB を使用して自動テストを設定するなど、ライフサイクル全体を説明しています。

インテリジェンス システムへのアプリ機能の提供

理論はここまでにして、実装について詳しく見ていきましょう。

構成と依存関係の設定

まず、AppFunctions の依存関係を追加します。1 つは API 用、もう 1 つは Kotlin Symbol Processing コンパイラ用です。

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 は serviceName パラメータで宣言された最終的な具象サービス サブクラス JetPackerAppFunctionService を生成します。また、アプリのマニフェストに app_metadata.xml を登録します。このファイルは、JetPacker の宣言された AppFunction のグローバルな運用ルールを提供します。

AppFunctions のテストと検証

実装が完了したら、AppFunction が登録され、正しく機能していることを確認する必要があります。

Android 17 以降を搭載したデバイスまたはエミュレータを実行している場合は、ターミナルから ADB コマンドを使用して関数を一覧表示し、呼び出すことができます。adb shell cmd app_function list-app-functions を実行すると、パッケージに登録されているすべての関数が表示されます。その後、特定の関数を実行し、未加工の JSON パラメータ文字列を渡しながら adb shell cmd app_function execute-app-function を実行して、データベース統合をテストできます。

これらの ADB コマンドの代わりに、AppFunctions Testing Agent を使用して、構成の検査、AppFunctions の一覧表示と実行、実際の会話フローでの AppFunctions の動作の確認を行うこともできます。

終了

AppFunctions を使用してインテリジェンス システムに提供できるアプリの機能を検討する際は、コードとドキュメントに対する考え方を少し変える必要があります。AppFunctions を使用すると、アプリでこの新しいインタラクション モデルを使用できます。これにより、エージェントを使用してアプリの機能にアクセスできます。

まず、AppFunctions 開発スキルは、アプリの機能の発見、アプリの AppFunctions の実装と改良に役立つ、ライフサイクルに不可欠なツールです。第 2 に、KDoc コメントはコンパイル済みの API アセットです。パラメータの説明が明確であれば、システム エージェントの実行精度に直接影響します。最後に、Android MCP はローカル ファーストの実行を提供し、アプリが AI エージェントと安全に連携できるようにします。

AppFunctions を通じてアプリの機能を投稿すると、アプリがインテリジェンス システムに対応できるようになります。エージェントの時代に向けてアプリをどのように適応させているか、ぜひお聞かせください。

詳細

このブログ投稿シリーズの他のパートもご覧ください。
パート 1: アプリの概要と概要。
パート 2: オンデバイス インテリジェンス。ML Kit の GenAI API と Gemini Nano を詳しく見て、旅程の要約、領収書の解析、ローカル音声処理などのプライバシーを優先した機能を構築します。
パート 3: ハイブリッドとクラウドの推論。Firebase AI Logic を使用して、LLM の回答を Google マップやウェブ コンテキストなどの実際のデータにグラウンディングする方法について説明します。
パート 4(この投稿): システム インテグレーション。AppFunctions を使用して Android インテリジェンス システムと統合する。
パート 5(近日公開): アプリ内エージェント ワークフロー。A2UI と ADK を活用したエンドツーエンドの予約アシスタントでアプリを拡張します。

Android 開発についてさらに詳しく知りたい場合は、YouTube または LinkedIn で Android デベロッパーをフォローしてください。

このブログ投稿のすべてのコード スニペットには、次の著作権に関する通知が適用されます。

Copyright 2026 Google LLC.
SPDX-License-Identifier: Apache-2.0
作成者:
続きを読む