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も大いに可能性はありそうです。