Android Studio × Gemini がもたらす開発体験の変革
Android アプリ開発の現場で、Gemini AI の存在感が急速に高まっています。Google は Android Studio に Gemini の機能を深く統合し、コード生成、リファクタリング提案、テスト自動作成、さらにはエージェントモードによる自律的な開発支援まで実現しています。
個人開発で Android アプリを作り続けてきた私自身、Code Assist と Agent Mode が入ってから、Kotlin の定型コードやテスト作成にかける時間が目に見えて減りました。初めて Gemini を Android Studio で使う方にも、コード補完は使っているがもっと踏み込みたい方にも、私が実際に役立てている使い方を、具体的なコード例とともに整理してお伝えします。
対象読者は以下の通りです。
- Android アプリを Kotlin / Jetpack Compose で開発している方
- AI コーディングアシスタントを開発ワークフローに組み込みたい方
- Gemini Code Assist の基本は知っているが、Agent Mode など高度な機能を試したい方
Android Studio で Gemini を有効にする手順
前提条件
Gemini の機能を利用するには、Android Studio の最新安定版(Narwhal 以降)が必要です。加えて、Google アカウントでのログインが必須となります。
セットアップの手順は次の通りです。
- Android Studio を起動し、File → Settings → Tools → Gemini を開く
- 「Enable Gemini」にチェックを入れる
- Google アカウントでサインイン(Workspace アカウントの場合は管理者の許可が必要な場合があります)
- 使用するモデルを選択する(Gemini 2.5 Pro が推奨。高速な応答が欲しい場合は Gemini 2.5 Flash も選択可能)
モデルの選び方
Android Studio 上では、タスクの性質に応じてモデルを切り替えられます。
- Gemini 2.5 Pro: 複雑なリファクタリング、アーキテクチャ設計の相談、大規模なコード生成に最適
- Gemini 2.5 Flash: インラインの補完やちょっとした質問への回答など、レスポンス速度を重視するケースに向いている
- Gemini 3.1 Pro(プレビュー): 最新モデルで推論精度がさらに向上。利用可能であれば試す価値あり
設定は Settings → Tools → Gemini → Model からいつでも変更できます。
実運用で効いた、公式ドキュメントに載っていない設定
Gemini を Android Studio に組み込んで数か月使い続けるなかで、補完の精度とトークン消費を左右するのは「どのモデルを選ぶか」よりも「どうコンテキストを渡すか」だと気づきました。ここでは、私が個人開発で実際に調整して効果があった点を共有します。
まず、補完精度に最も効いたのは、関連ファイルを開いた状態で作業することでした。
Code Assist は開いているタブをコンテキストに含めます。ViewModel を編集する際に、対応する UiState と Repository を同時に開いておくと、提案が一段と的確になります。私の環境では、関連ファイルを開いた場合と閉じた場合とで、Compose 画面の初回提案がそのまま使える割合が体感で 40% 前後変わりました。
次に、チャットへ渡す指示は「何を」だけでなく「どの制約で」を添えると手直しが激減します。
| 指示の書き方 | 結果 |
| 「検索画面を作って」 | 汎用的なUIが生成され、既存パターンに合わせる修正が必要 |
| 「検索画面を作って。状態は StateFlow、UI は Jetpack Compose、既存の MVVM に合わせて」 | そのまま採用できる頻度が明確に向上 |
曖昧な指示は、結局レビューと修正の時間に跳ね返ってきます。Compose と ViewModel をまたぐ実装の全体像は Gemini API × Jetpack Compose のAI統合ガイド でも扱っていますので、あわせてご覧ください。
一方で、トークン消費を抑えたい場面では、巨大なファイルを丸ごとコンテキストに含めない工夫が要ります。1,000 行を超えるファイルを開いたままチャットを多用すると、応答が遅くなり、無関係な箇所まで提案に混ざりがちでした。編集対象の関数だけを別ファイルに切り出す、あるいは選択範囲を明示してから質問する。この一手間で、応答速度と精度の両方が安定します。
Code Assist の基本 — インラインコード生成と補完
インライン補完
Gemini Code Assist の最も基本的な機能がインライン補完です。コードを書いている途中で、Gemini が文脈を読み取り、次に書くべきコードを提案してくれます。
// Jetpack Compose で商品リストを表示するコンポーザブル
@Composable
fun ProductList(products: List<Product>) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp)
) {
items(products) { product ->
ProductCard(product = product)
}
}
}
// Gemini が ProductCard の実装も提案してくれる
@Composable
fun ProductCard(product: Product) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = product.name,
style = MaterialTheme.typography.titleMedium
)
Spacer(modifier = Modifier.height(4.dp))
Text(
text = "¥${product.price}",
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.primary
)
}
}
}
Tab キーで提案を受け入れ、Esc キーで無視できます。補完の精度はプロジェクト全体のコンテキスト(開いているファイル、依存関係、既存コードのパターン)に基づいているため、プロジェクトが進むほど的確な提案が得られるようになります。
チャットパネルでの対話
Android Studio の右側パネルに表示される Gemini チャットでは、自然言語でコードに関する質問ができます。
たとえば、以下のような質問が効果的です。
- 「この ViewModel を Hilt でインジェクションできるようにリファクタリングして」
- 「Room データベースの Migration を 1→2 で書いて。users テーブルに email カラムを追加する」
- 「このコンポーザブルのプレビューを追加して」
チャットでは現在開いているファイルの内容が自動的にコンテキストとして渡されるため、ファイル名やコードを貼り付ける手間が省けます。
コード変換とリファクタリング支援
Java から Kotlin への変換
既存の Java コードを Kotlin に変換する際、Gemini は単純な構文変換だけでなく、Kotlin のイディオムに合わせた最適化も提案してくれます。
// Gemini による変換後 — null 安全性と拡張関数を活用
fun List<User>.filterActiveAdults(): List<User> {
return this.filter { user ->
user.isActive && (user.age ?: 0) >= 18
}.sortedByDescending { it.lastLoginAt }
}
// 変換前の Java コード:
// public List<User> filterActiveAdults(List<User> users) {
// return users.stream()
// .filter(u -> u.isActive() && u.getAge() != null && u.getAge() >= 18)
// .sorted(Comparator.comparing(User::getLastLoginAt).reversed())
// .collect(Collectors.toList());
// }
XML レイアウトから Jetpack Compose への移行
Gemini はレガシーな XML レイアウトを Jetpack Compose に変換する作業も得意です。チャットパネルで XML ファイルを参照しながら「この XML レイアウトを Compose に変換して」と指示するだけで、マテリアルデザイン3に準拠したコンポーザブルが生成されます。
// XML の ConstraintLayout から変換された Compose コード
@Composable
fun UserProfileScreen(user: User) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
AsyncImage(
model = user.avatarUrl,
contentDescription = "プロフィール画像",
modifier = Modifier
.size(120.dp)
.clip(CircleShape),
contentScale = ContentScale.Crop
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = user.displayName,
style = MaterialTheme.typography.headlineMedium
)
Text(
text = user.email,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
Agent Mode — 自律型AI開発アシスタント
Agent Mode とは
Agent Mode は、Gemini Code Assist の最も先進的な機能です。通常の Code Assist が「質問に答える」受動的なアシスタントであるのに対し、Agent Mode は指示に基づいて複数のファイルにまたがる変更を自律的に実行します。
Agent Mode を有効にするには、Gemini チャットパネルの上部にあるモード切替で「Agent」を選択します。
実践例 — MVVM アーキテクチャの自動構築
以下のような指示を Agent Mode に与えると、必要なファイルを自動で作成・編集してくれます。
「商品検索機能を追加してください。
- Repository パターンで Retrofit API を呼び出す
- ViewModel で StateFlow を使って状態管理する
- Jetpack Compose の検索画面を作成する
- Hilt で DI を構成する」
Agent Mode はこの指示に基づいて以下のファイルを自動生成します。
ProductRepository.kt — API呼び出しとキャッシュロジック
SearchViewModel.kt — 検索状態の管理
SearchScreen.kt — UI コンポーザブル
NetworkModule.kt — Hilt モジュールの更新
build.gradle.kts — 必要な依存関係の追加
各変更はプレビュー画面で確認でき、ファイルごとに承認・拒否を選択できます。
Agent Mode の効果的な使い方
Agent Mode を最大限に活用するためのポイントを紹介します。
- 具体的な技術スタックを明示する: 「Retrofit + Moshi + Coroutines」のように使用するライブラリを指定する
- 既存の設計パターンに言及する: 「プロジェクトの他の画面と同じ MVVM パターンで」と伝える
- 段階的に指示を出す: 一度に全てを任せるのではなく、「まず Repository 層だけ作って」→「次に ViewModel」と進める方が精度が高い
Agent Mode のさらに詳しい活用方法については、Gemini Code Assist を個人開発者が無料で使う方法 で詳しく解説しています。
Agent Mode を安全に運用するためのチェックリスト
Agent Mode は強力ですが、複数ファイルを一度に書き換えるため、レビューを怠ると思わぬ副作用が入り込みます。以下は、その副作用を早期に発見し回避するための手順です。私が MVVM 一式を生成させる際に、毎回確認している手順を挙げます。
- 生成前にブランチを切る: Agent Mode に任せる前に作業ブランチを分けます。差分が大きくなっても後から丸ごと戻せる状態を確保しておきます
- ファイル単位で承認する: 「全て承認」を避け、
build.gradle.kts などビルドに影響するファイルは特に中身を読んでから承認します
- 依存の追加を確認する: 提案された依存関係が既存のバージョンカタログと衝突しないか、
libs.versions.toml の差分を必ず見ます
- 生成直後にビルドを通す: 承認後すぐに
./gradlew assembleDebug を走らせ、コンパイルエラーがないかを確認してから次の指示に進みます
- テストを添える: 生成されたロジックには、続けて「このクラスの単体テストも書いて」と指示し、振る舞いを固定します
私の環境では、Repository・ViewModel・Compose 画面・Hilt モジュールの 4〜5 ファイルを一括生成させると、初回生成はおおむね 40〜60 秒で完了します。そのうち手直しが必要になるのは平均して 1〜2 ファイル程度で、多くは命名規約や既存パターンとの微妙なズレでした。この「ズレ」を減らす鍵が、前掲の具体的な指示出しにあります。個人開発で Google Play に出しているアプリの改修でも、この進め方に落ち着いてから、生成物のレビューにかかる負担がずいぶん軽くなりました。
テスト生成とデバッグ支援
単体テストの自動生成
Gemini はテスト対象のクラスやメソッドから、適切な単体テストを自動生成できます。テスト対象のファイルを開いた状態で、チャットから「このクラスの単体テストを書いて」と指示します。
// Gemini が生成したテストコード例
@OptIn(ExperimentalCoroutinesApi::class)
class SearchViewModelTest {
@get:Rule
val mainDispatcherRule = MainDispatcherRule()
private lateinit var viewModel: SearchViewModel
private val repository: ProductRepository = mockk()
@Before
fun setup() {
viewModel = SearchViewModel(repository)
}
@Test
fun `search returns products when query is valid`() = runTest {
// Given
val products = listOf(
Product(id = 1, name = "Pixel 9", price = 99800),
Product(id = 2, name = "Pixel Watch 3", price = 49800)
)
coEvery { repository.search("Pixel") } returns Result.success(products)
// When
viewModel.onSearchQueryChanged("Pixel")
advanceUntilIdle()
// Then
val state = viewModel.uiState.value
assertEquals(2, state.products.size)
assertFalse(state.isLoading)
assertNull(state.error)
}
@Test
fun `search shows error when repository fails`() = runTest {
// Given
coEvery { repository.search(any()) } returns
Result.failure(IOException("Network error"))
// When
viewModel.onSearchQueryChanged("test")
advanceUntilIdle()
// Then
val state = viewModel.uiState.value
assertTrue(state.products.isEmpty())
assertNotNull(state.error)
}
}
Logcat 解析によるデバッグ
Gemini は Android Studio の Logcat と連携し、クラッシュログやスタックトレースを分析して原因と修正案を提示してくれます。Logcat にエラーが表示されたら、エラーメッセージを選択して右クリック → 「Ask Gemini」を選ぶだけです。
たとえば IllegalStateException: Fragment not attached to a context のようなエラーに対して、Gemini は以下のような回答を返します。
- エラーの原因(非同期処理完了時に Fragment がすでに detach されている)
- 具体的な修正コード(
isAdded チェックの追加、viewLifecycleOwner.lifecycleScope の使用)
- 同様のバグを防ぐためのベストプラクティス
Gradle 設定と依存関係の管理
Gemini は build.gradle.kts の編集も支援します。新しいライブラリを追加したい場合、チャットで「Coil 3 の依存関係を追加して」と指示すると、バージョンカタログ(libs.versions.toml)との整合性も考慮した上で適切な記述を提案してくれます。
// libs.versions.toml への追加提案
// [versions]
// coil = "3.1.0"
//
// [libraries]
// coil-compose = { group = "io.coil-kt.coil3", name = "coil-compose", version.ref = "coil" }
// coil-network-okhttp = { group = "io.coil-kt.coil3", name = "coil-network-okhttp", version.ref = "coil" }
// build.gradle.kts (app)
dependencies {
implementation(libs.coil.compose)
implementation(libs.coil.network.okhttp)
}
バージョンの競合が起きた場合にも、Gemini は Resolution Strategy の提案やバージョンの互換性情報を教えてくれます。
使い分けの結論
Android Studio と Gemini の統合は、Android 開発のワークフローを大きく効率化する可能性を秘めています。インラインの補完から始めて、チャットによる対話的な開発、そして Agent Mode による自律的な開発支援へとステップアップしていくのがおすすめです。
まずは日常の開発で Code Assist を活用しながら、繰り返し作業やボイラープレートの多いタスクから Agent Mode を試してみてください。Gemini の基本的な使い方から知りたい方は Gemini Code Assist を個人開発者が無料で使う方法 も参考になります。また、VS Code ユーザーの方は Gemini Code Assist と VS Code の連携を深掘りする もあわせてご覧ください。
開発の現場でお役に立てば幸いです。お読みいただきありがとうございました。