はじめに
2026年4月、Google は Gemma 4 を Android AICore Developer Preview として公開しました。この仕組みを使うと、クラウドへの通信なしに端末上で LLM を動かし、アプリに AI 機能を組み込めます。
ML Kit Prompt API を通じて Kotlin から数行で推論を呼び出せるのが特徴です。本記事では公開情報・公式ドキュメントをもとに、セットアップから実装パターンまでを解説します。
この記事で学べること
- Gemma 4 AICore Developer Preview の概要とモデルスペック
- ML Kit Prompt API を使ったオンデバイス推論の実装方法
- E2B/E4B モデルの使い分け方針
- ストリーミングレスポンスの実装パターン
対象読者
- Android アプリに AI 機能を追加したい開発者
- プライバシー重視のオンデバイス推論に興味がある方
- Gemini API の代替をオフライン環境向けに探している方
前提環境
- Android Studio(最新安定版推奨)
- minSdk 26 以上
- Kotlin 1.9.x 以上
- テスト端末: Pixel 7 以上(または AICore 対応の Samsung Galaxy 端末)
TL;DR
- Gemma 4 が Android AICore の Developer Preview に登場。ML Kit 経由でオンデバイス推論が可能
- モデルは E2B(高速・低遅延)と E4B(高精度)の 2 種類
- 前世代比で最大 4 倍高速・バッテリー消費 60% 削減
- 依存:
com.google.mlkit:genai-prompt:1.0.0-beta2、minSdk 26 - 対応端末: Pixel 7+、AICore 対応の Samsung Galaxy 端末(それ以外は CPU フォールバック)
Gemma 4 AICore とは
AICore は Google が Android に組み込んだ AI 推論エンジンです。Gemini Nano のオンデバイス実行基盤として設計されており、2026 年 4 月から Gemma 4 の Developer Preview が利用できるようになりました。
AICore を使うことで次の利点があります:
| 特徴 | 詳細 |
|---|---|
| プライバシー | データが端末の外に出ない |
| オフライン動作 | ネットワーク接続不要 |
| 低レイテンシ | クラウド往復なしで高速応答 |
| コスト | API 課金が発生しない |
モデルスペック
Gemma 4 AICore では 2 つのサイズが提供されています。
| モデル | 用途 | 相対速度 |
|---|---|---|
| Gemma 4 E2B | リアルタイム補完・高速応答 | E4B の 3 倍高速 |
| Gemma 4 E4B | 複雑な推論・要約・意図分類 | 標準 |
どちらも 140 以上の言語をサポートし、テキスト・画像・音声のマルチモーダル入力に対応しています(Developer Preview 時点での実装範囲は ML Kit ドキュメントを参照)。
対応デバイス
| デバイス | 実行方式 |
|---|---|
| Pixel 7 以上 | AICore(GPU/NPU 加速) |
| AICore 対応の Samsung Galaxy 端末 | AICore(GPU/NPU 加速) |
| その他の Android デバイス | CPU フォールバック |
AI 加速器が利用できない端末でも動作しますが、レスポンス速度は遅くなります。
セットアップ
1. 依存関係の追加
build.gradle.kts(アプリモジュール)に以下を追加します。
dependencies {
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")
}
2. AndroidManifest.xml の設定
インターネット権限を追加します(モデルのダウンロードに必要)。
<uses-permission android:name="android.permission.INTERNET" />
3. minSdk の確認
build.gradle.kts(アプリモジュール)で minSdk が 26 以上であることを確認します。
android {
defaultConfig {
minSdk = 26
// ...
}
}
ML Kit Prompt API の実装
機能可用性の確認
推論を呼び出す前に、端末が Gemma 4 AICore に対応しているかどうかを確認します。非対応端末でそのまま呼び出すとエラーになるため、この確認は必須です。
import com.google.mlkit.genai.prompt.FeatureStatus
import com.google.mlkit.genai.prompt.Generation
class OnDeviceAiHelper {
fun isOnDeviceAiAvailable(): Boolean {
return try {
val status = Generation.getClient().checkStatus()
status == FeatureStatus.AVAILABLE
} catch (e: Exception) {
false
}
}
}
FeatureStatus.AVAILABLE が返った場合のみ推論を実行します。それ以外(DOWNLOADING、DOWNLOADABLE、UNAVAILABLE 等)の場合はユーザーに状況を伝えるか、クラウド API へのフォールバックを検討します。
基本的な推論(generateContent)
import com.google.mlkit.genai.prompt.Generation
private val generativeModel = Generation.getClient()
private suspend fun executePrompt(prompt: String): Result<String> {
return try {
val response = generativeModel.generateContent(prompt)
val text = response.candidates.firstOrNull()?.text.orEmpty()
Result.success(text)
} catch (e: Exception) {
Result.failure(e)
}
}
ユースケース実装例
テキスト要約の実装例です。
suspend fun summarizeText(content: String): Result<String> {
return executePrompt("""
以下のテキストを箇条書き3〜5個で要約してください。
本文のみ返してください。
テキスト:
$content
""".trimIndent())
}
タイトル提案の実装例です。
suspend fun suggestTitle(content: String): Result<String> {
return executePrompt("""
以下の文章に適した短いタイトルを1つ提案してください。
タイトルのみ返してください。
文章:
$content
""".trimIndent())
}
ストリーミングレスポンス
長い出力をリアルタイムでユーザーに表示したい場合は generateContentStream を使います。
suspend fun summarizeStreaming(
content: String,
onPartialResult: (String) -> Unit
): Result<String> {
return try {
val prompt = """
以下のテキストを要約してください:
$content
""".trimIndent()
val fullResponse = StringBuilder()
generativeModel.generateContentStream(prompt).collect { chunk ->
val newText = chunk.candidates.firstOrNull()?.text.orEmpty()
fullResponse.append(newText)
onPartialResult(fullResponse.toString())
}
Result.success(fullResponse.toString())
} catch (e: Exception) {
Result.failure(e)
}
}
onPartialResult コールバックで UI を更新すると、トークンが生成されるたびに表示が更新されます。
E2B / E4B の使い分け
Generation.getClient() はデフォルトでデバイスに最適なモデルを自動選択します。AICore Developer Preview では GenerateContentRequest のオプションでモデルの優先度(速度重視 / 精度重視)を指定できます。
import com.google.mlkit.genai.prompt.GenerateContentRequest
import com.google.mlkit.genai.prompt.TextPart
// 精度重視(E4B 相当)
val request = generateContentRequest(TextPart(prompt)) {
temperature = 0.2f // 低温で安定した出力
}
val response = generativeModel.generateContent(request)
モデルの性能特性は以下の通りです。
| モデル | 特性 | 向いているユースケース |
|---|---|---|
| E2B | 3 倍高速・低遅延 | リアルタイム補完、キーボード候補 |
| E4B | 高精度・深い推論 | テキスト要約、意図分類、翻訳(長文) |
注意点
初回推論のウォームアップ
初回の generateContent 呼び出しはモデルのロードに数十秒〜約1分かかる場合があります。アプリ起動時にバックグラウンドでウォームアップリクエストを送ることで、ユーザーが実際に使うタイミングのレイテンシを削減できます。
BUSY エラーへの対応
端末リソースが不足している場合、BUSY エラーが返ることがあります。エクスポネンシャルバックオフでリトライするのが推奨パターンです。
suspend fun executeWithRetry(prompt: String, maxRetries: Int = 3): Result<String> {
repeat(maxRetries) { attempt ->
val result = runCatching { generativeModel.generateContent(prompt) }
if (result.isSuccess) {
return Result.success(result.getOrThrow().candidates.firstOrNull()?.text.orEmpty())
}
kotlinx.coroutines.delay(500L * (attempt + 1))
}
return Result.failure(Exception("Max retries exceeded"))
}
プロンプト設計の指針
小規模モデルはプロンプトの形式に敏感です。次の点に注意します。
- 出力形式を明示する: 「箇条書きで返してください」「タイトルのみ返してください」など
- 具体的に指示する: 曖昧な指示はハルシネーションのリスクが高まる
- 出力長を制限する: 長大な出力を求めるとレスポンスが不安定になる場合がある
Developer Preview の制限
2026 年 5 月時点の Developer Preview では以下は未実装です(今後追加予定):
- Tool calling(関数呼び出し)
- Structured output(JSON モード)
- System prompts
- Thinking mode
本番アプリへの組み込みは GA 後を推奨します。
まとめ
- Gemma 4 AICore Developer Preview で Android のオンデバイス LLM が現実的な選択肢になった
- ML Kit Prompt API は
com.google.mlkit:genai-prompt:1.0.0-beta2から利用でき、Kotlin で数行の実装から始められる - E2B(高速)と E4B(高精度)の 2 モデルをユースケースに応じて選択
- 初回ウォームアップと BUSY エラー対策を実装しておくと本番品質に近づく
- Tool calling・Structured output は今後のアップデートで追加予定
プライバシーを重視したオフライン AI、低コストの端末内推論など、クラウド API を補う用途で活用できます。
参考リンク
- AICore Developer Preview — Google Developers — セットアップ手順の公式ガイド
- Gemma 4: Byte for byte, the most capable open models — Google Blog — Gemma 4 全体の技術詳細
- Gemma 4 in the AICore Developer Preview — Android Developers Blog — AICore Developer Preview 発表記事
- Building Your First On-Device AI Feature with Gemma 4 and the ML Kit Prompt API — Medium — 実装パターンの参考記事(依存関係バージョンは公式ドキュメントを優先すること)


