Building the Android half of a Duet project needs the Android SDK and a JDK on your Mac, alongside Xcode. Modaal checks for both and, when something is missing, shows an Action needed: install the Android SDK banner with a button that installs it. This guide explains what the banner means, what the button installs, and how to verify the result. What Claude Code alone cannot do on Android is on modaal.dev.
Before you start
A Mac with Xcode set up
The Android toolchain installs alongside your iOS setup — Set up Xcode first if you haven’t.
Disk space for the toolchain
The SDK components, the emulator system image and the JDK are a multi-gigabyte download. The setup prints the exact total it downloaded in its final receipt.
No admin password, no Homebrew
Everything installs user-local, under your home folder. Nothing asks for elevation and nothing touches a system package manager.
Android Studio users keep their SDK
If a SDK is already on the machine, the setup respects it and adds only the components that are missing.
What the banner means
On a project with Android in scope, Modaal probes for the toolchain — the SDK components, the JDK, and an emulator. When any of them is missing, the workspace shows the Action needed: install the Android SDK banner with an Install button and the list of what is missing.What the button installs
The button opens Terminal and runs Modaal’s setup there, in a window you own — Google’s SDK licenses have to be accepted by you, and that happens in this window, not silently in the background. As of September 2026 the setup installs:
It also creates your first emulator — a Pixel 8 on API 36, named
Modaal_Pixel_8_API_36 — and pre-warms the Kotlin build toolchain the project compiles with (about a minute, ~440 MB), so the first real build doesn’t pay that cost.
At the end, the setup offers to add the SDK and JDK environment exports to your shell profile, so your own terminal sees the same toolchain Modaal uses. You can decline — Modaal doesn’t need it.
Where everything lives
- The SDK goes to
~/Library/Android/sdk— unless the machine already points at an SDK through the standardANDROID_SDK_ROOTorANDROID_HOMEvariables, in which case that location is used and only missing components are added. - The JDK goes to
~/Library/Java/JavaVirtualMachines, the user-local directory macOS resolves JDKs from — no admin password involved.
Verify it worked
Modaal picks the result up without a restart: the banner clears on the next prerequisites check, and the Run picker offers the new emulator alongside your iOS simulators. Ask Modaal to run the app on Android and it boots the emulator and launches your app there.What the banner can show
Common questions
I already have Android Studio — will this fight my setup?
I already have Android Studio — will this fight my setup?
No. The setup respects an existing SDK found through
ANDROID_SDK_ROOT or ANDROID_HOME, installs only missing components into it, and never removes anything. Your Android Studio projects keep working unchanged.The setup stopped at the license prompt
The setup stopped at the license prompt
Google’s SDK licenses must be accepted before components can install, and declining ends the run without installing them. Run the setup again from the banner’s button and answer y at the license prompt.
Something failed mid-run — is it safe to re-run?
Something failed mid-run — is it safe to re-run?
Yes. Re-running is the repair path: every step checks what is already in place before acting, so a second run finishes what the first one couldn’t and changes nothing that succeeded.
Do I need this for an iPhone-only project?
Do I need this for an iPhone-only project?
No. The Swift-flavor Duet template and the iOS-only templates build with Xcode alone — see the two Duet templates. The banner appears only when a project has Android in scope.
Do the Duet tutorials need this toolchain?
Do the Duet tutorials need this toolchain?
From Tutorial 2 onward, yes: that page builds the Compose app, and every later page runs it. Tutorial 1 needs a JDK only. The series index lists every prerequisite with the tutorial that first needs it.
Still stuck? Join our community on Discord — we’re happy to help you get set up.