← 기사 목록
日本語https://zenn.dev/topics/ai/feed

Antigravityを使ってAndroidアプリを作ってみた

추출된 키워드

26
Androidアプリ·5Antigravity 2.0·5Antigravity·5Google I/O 2026·4Navigation3·4MainNavigation·3Claude Code·3推奨アーキテクチャ·3Android Developer·3DataRepository·3MainScreenUiState·3UiState·3DefaultDataRepository·3MainScreenViewModel·3MainScreen·3Composable関数·3MainActivity·3Navigation·3Repository·3apk·3gradlew assembleDebug·3implementation_plan.md·3Codelab·3株式会社TRUSTDOCK·3ComponentActivity·2プロトタイプ·2

원문

5,245
Antigravityを使ってAndroidアプリを作ってみた

Antigravityを使ってAndroidアプリを作ってみた

こんにちは!
株式会社TRUSTDOCK Verification事業開発部Core eKYCグループにてモバイルアプリ向けSDKの開発をしている古川(a.k.a. ふるしん)です。
(社名は「とらすとどっく」と読みます)

Google I/O 2026でAntigravity 2.0が発表されました。 https://www.youtube.com/live/aqmpZocmR8o?si=cPAS6gBFSm-aSyTJ&t=879 https://antigravity.google Antigravityを使えば、プロンプトでAndroidアプリを作成・ビルド・実行することができます。
使い方はCodelabがあるので触ってみたらよいかと思います。

試しにHello Worldを作ってみようと思い、以下のプロンプトで実行しました。

画面上に「Hello, World!」と表示するアプリを実装して。
この文字列は画面上の中央に表示されます。

まずはアプリのディレクトリをどこに置くかを指示します。これは普段みなさんがAndroidアプリのプロジェクトを置くディレクトリパスを渡してあげればよいです。

プロンプトを実行すると以下のように処理が走り始めます。
まずは

implementation_plan.md
に実装計画が作成されます。
これを見て、良さそうであればProceedさせます。

実装が終われば

./gradlew assembleDebug
が実行され、エミュレータが起動してapkが実行されました。
この時、実機がUSBデバッグなどで繋がっていれば実機で実行することもできます。

出力された内容を見てみましょう。
ディレクトリとファイル構成はこのようになっていました。

最初からRepositoryやNavigationが用意されているのが印象的ですね。画面遷移はしないしデータの扱いもないアプリなのですが。Antigravityがデフォルトで用意してくれてるのかな。

ではコードを見てみます。
まずはMainActivityです。

class MainActivity : ComponentActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    enableEdgeToEdge()
    setContent {
      HelloWorldAppTheme { Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { MainNavigation() } }
    }
  }
}

改行が無いのが気になってしまいましたがそれは置いといて、表示する内容は

MainNavigation
というComposable関数に分かれていますね。これは別ファイルになっています。
@Composable
fun MainNavigation() {
  val backStack = rememberNavBackStack(Main)

  NavDisplay(
    backStack = backStack,
    onBack = { backStack.removeLastOrNull() },
    entryProvider =
      entryProvider {
        entry<Main> {
          MainScreen(onItemClick = { navKey -> backStack.add(navKey) }, modifier = Modifier.safeDrawingPadding().padding(16.dp))
        }
      },
  )
}

すごい。Navigation3を使っていますね。
ただ、tomlを見てみるとNavigation3のバージョンがちょっと古かったです。

nav3Core = "1.0.1" # 最新は1.1.2
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" }

次にMainScreenを見てみましょう。

@Composable
fun MainScreen(
  onItemClick: (NavKey) -> Unit,
  modifier: Modifier = Modifier,
  viewModel: MainScreenViewModel = viewModel { MainScreenViewModel(DefaultDataRepository()) },
) {
  val state by viewModel.uiState.collectAsStateWithLifecycle()
  when (state) {
    MainScreenUiState.Loading -> {
      // Blank
    }
    is MainScreenUiState.Success -> {
      MainScreen(data = (state as MainScreenUiState.Success).data, modifier = modifier)
    }
    is MainScreenUiState.Error -> {
      Text("Error loading data: ${(state as MainScreenUiState.Error).throwable.message}")
    }
  }
}

@Composable
internal fun MainScreen(data: List<String>, modifier: Modifier = Modifier) {
  Box(
    modifier = modifier.fillMaxSize(),
    contentAlignment = Alignment.Center
  ) {
    Text(text = "Hello, World!")
  }
}

@Preview(showBackground = true)
@Composable
fun MainScreenPreview() {
  HelloWorldAppTheme { MainScreen(listOf("Android")) }
}

@Preview(showBackground = true, widthDp = 340)
@Composable
fun MainScreenPortraitPreview() {
  HelloWorldAppTheme { MainScreen(listOf("Android")) }
}

ちゃんとPreviewも用意されていますね!
ただ引数として渡されているListは使っていないです。出力としてもプロンプトで「画面上に「Hello, World!」と表示するアプリを実装して。」としていたので使われていないのが正解です。
なので、もし表示したい場合があれば使えそうですが過剰実装な感じがしました。

他にはちゃんとViewModelが用意されていたり、UiStateも用意されています。

sealed interface MainScreenUiState {
  object Loading : MainScreenUiState

  data class Error(val throwable: Throwable) : MainScreenUiState

  data class Success(val data: List<String>) : MainScreenUiState
}

UiStateとしてロード中を考慮しているし、RepositoryもちゃんとInterfaceとして用意されていました。

interface DataRepository {
  val data: Flow<List<String>>
}

class DefaultDataRepository : DataRepository {
  override val data: Flow<List<String>> = flow { emit(listOf("Android")) }
}

まとめ

出力されたコードはこちらです。https://github.com/furusin/HelloWorldApp

コード全体を見てみて「なるほどまず簡単なアプリを作りたいときはAntigravityにちゃんと指示を出したらちゃんとアプリ作ってくれそうだな」という感覚になりました。
全体的にちゃんとAndroid Developerの公式が出している推奨アーキテクチャに沿った実装になっており「Androidエンジニアなら見ればわかる実装」になっている印象です。

今個人的に作ってみたいアプリがあるので、全部Antigravityに作ってもらうのはアリかもしれないなと思いました。
業務ではClaude Codeに実装を任せていますが、プロトタイプ程度であればAntigravityも大いに可能性はありそうです。