Flutter development environment on Fedora 44 (mise + Android Studio)
Published 18 July 2026
- date
- env
- linux Fedora 44 Workstation (GNOME), zsh, x86_64 macos N/A
- tags
Set up a complete Flutter toolchain on Fedora 44 / GNOME using mise as the runtime version manager, with the Android SDK installed in the default location ~/Android/Sdk so that flutter doctor detects it without extra configuration. The end state: flutter doctor reports No issues found, with Android, web and Linux desktop targets available.
1. Overview
Three distinct layers are involved. Keeping them separate is what makes the setup predictable:
| Layer | Managed by | Location |
|---|---|---|
| Flutter & Dart SDK, JDK, Node | mise | ~/.local/share/mise/installs/ |
| Native build toolchain (clang, CMake, Ninja, GTK) | dnf | system |
| Android SDK, platform-tools, emulator | Android Studio | ~/Android/Sdk |
mise does not manage the Android SDK. Android Studio installs it, and Flutter is told
where to find it. The default path ~/Android/Sdk is the one Flutter probes first — using
anything else means flutter doctor will report the Android toolchain as missing until you
configure the path manually.
2. Install mise
Two supported methods. Pick one and stick to it — mixing them leads to two competing binaries.
Option A — Official RPM repository (recommended)
System-wide install, updated together with the rest of the system via dnf upgrade.
sudo sh -c 'echo -e "[mise]\nname=mise\nbaseurl=https://mise.jdx.dev/rpm\nenabled=1\ngpgcheck=1\ngpgkey=https://mise.jdx.dev/gpg-key.pub" > /etc/yum.repos.d/mise.repo'sudo dnf install miseOption B — Standalone script (no root)
Installs into ~/.local/bin, touches nothing outside your home directory.
curl https://mise.run | shUpdates are then handled by mise self-update instead of dnf.
Note — A community COPR repository (
jdxcode/mise) also exists, but its own maintainer recommends the official install instead. There is no reason to prefer it.
Verify:
mise --version3. Activate mise in your shell
This step is mandatory and is the single most common source of “command not found” later on.
Installing a tool with mise does not put it on your PATH — the shell activation hook does.
For zsh:
echo 'eval "$(mise activate zsh)"' >> ~/.zshrcFor bash:
echo 'eval "$(mise activate bash)"' >> ~/.bashrcReload the current shell:
exec zshIf you use a framework such as oh-my-zsh, the
mise activateline must come after the framework is sourced in.zshrc. Otherwise the framework rewritesPATHand the mise shims are shadowed.
Confirm the shims directory is now on your path:
echo $PATH | tr ':' '\n' | grep mise4. Declare and install the toolchain
Declarative configuration is preferable to a series of imperative commands: the file is reproducible, versionable, and doubles as documentation of the machine’s state.
mkdir -p ~/.config/misecat > ~/.config/mise/config.toml << 'EOF'[tools]flutter = "latest"java = ["21.0.2", "25.0.2"]node = ["22.23.1", "24.18.0"]firebase = "latest"gcloud = "latest"EOFmise installmise lsThe first entry in each list is the one exposed on PATH; the others stay installed and
available for per-project pinning.
Dart ships inside the Flutter SDK — do not install it separately.
What to leave out of mise
| Tool | Why not mise |
|---|---|
| Python | Fedora 44 already ships Python 3.14 as the system python3. Use venv per project. |
| pnpm | Use corepack enable pnpm (bundled with Node), then mise reshim. |
| Android SDK | Installed and updated by Android Studio, see section 7. |
Per-project pinning
Writes a local mise.toml that overrides the global configuration:
cd my-projectmise use flutter@stable java@21.0.2Verify Flutter is reachable
mise reshimwhich flutterflutter --versionwhich flutter must resolve to ~/.local/share/mise/shims/flutter. If it returns nothing,
the shell activation from section 3 is not loaded — open a new terminal.
Never run
flutterwithsudo. It writes to its own cache under<flutter-sdk>/bin/cache, which lives in your home directory. Running as root breaks the cache permissions and Flutter will fail afterwards as a normal user.
5. Linux desktop build dependencies
Required only if you target Linux desktop. Flutter reports Debian package names; these are the Fedora equivalents.
sudo dnf install clang cmake ninja-build gtk3-devel pkgconf-pkg-config egl-utilspkgconf-pkg-config is not listed by flutter doctor but is needed to resolve GTK compiler
flags at build time.
egl-utils provides eglinfo, which only silences the driver-information warning. It is
not a build dependency — builds succeed without it.
Optional, for diagnosing GPU acceleration:
sudo dnf install glx-utils6. Install Android Studio
Android Studio is required even if you write all your code in IntelliJ IDEA: it is the supported way to install and update the Android SDK, platform-tools, build-tools and emulator images.
Option A — JetBrains Toolbox (recommended)
Download Toolbox from https://www.jetbrains.com/toolbox-app/, then install Android Studio from within it. Toolbox handles updates and lets you run several JetBrains IDEs side by side.
Option B — Flatpak
flatpak install -y flathub com.google.AndroidStudioCaveat — The Flatpak runs sandboxed, which complicates access to
~/Android/Sdk, to USB devices for physical debugging, and to the host toolchain. For a Flutter workflow, the Toolbox install is significantly less friction.
7. Install the Android SDK in ~/Android/Sdk
~/Android/Sdk is the path Flutter probes by default. Installing elsewhere works, but requires
the extra configuration described at the end of section 8.
Launch Android Studio and complete the first-run wizard:
-
Choose the Standard installation type.
-
On the SDK components screen, verify the Android SDK Location field reads exactly:
/home/<your-user>/Android/SdkThis is the default on Linux. If it shows anything else, correct it now — it is far simpler than fixing it afterwards.
-
Accept the licence agreements and let the wizard download.
If Android Studio is already installed
Open Settings → Languages & Frameworks → Android SDK and check the Android SDK Location field at the top. It can be changed there.
Required SDK components
In the same settings panel:
- SDK Platforms tab — at least the latest stable Android API level.
- SDK Tools tab — enable Android SDK Command-line Tools (latest).
The command-line tools are not installed by default and Flutter needs them to accept
licences. Skipping this produces a cmdline-tools component is missing error in flutter doctor.
Confirm the layout:
ls ~/Android/SdkYou should see platform-tools, platforms, build-tools and cmdline-tools.
8. Wire the Android SDK to Flutter
Export the standard Android environment variables and add the tools to PATH:
cat >> ~/.zshrc << 'EOF'
export ANDROID_HOME="$HOME/Android/Sdk"export PATH="$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin"EOFexec zshANDROID_HOME is the current variable name; ANDROID_SDK_ROOT is deprecated but still
honoured by some tooling.
Accept the SDK licences — Flutter will not consider the Android toolchain valid until every licence is accepted:
flutter doctor --android-licensesAnswer y to each prompt.
If the SDK is not in the default location
Tell Flutter explicitly:
flutter config --android-sdk /path/to/your/SdkThis is persisted in ~/.config/flutter/settings and survives Flutter upgrades.
9. Point IntelliJ IDEA to the mise-managed SDK
IntelliJ IDEA and Android Studio do not resolve mise shims — they need the real SDK directory. Retrieve it:
mise where flutterIn Settings → Languages & Frameworks → Flutter, paste that path into Flutter SDK path.
The Dart SDK is bundled at <flutter-sdk>/bin/cache/dart-sdk and is detected automatically
once the Flutter path is set. Pointing the IDE at a shim instead of the real directory prevents
it from introspecting the SDK, and code completion will not work.
Install the Flutter and Dart plugins if they are not already present.
10. Final verification
flutter doctor -vExpected result:
[✓] Flutter (Channel stable, on Fedora Linux 44 (Workstation Edition))[✓] Android toolchain - develop for Android devices[✓] Chrome - develop for the web[✓] Linux toolchain - develop for Linux desktop[✓] Connected device[✓] Network resources• No issues found!List detected targets:
flutter devicesSmoke-test each platform from a real project:
flutter run -d linuxflutter run -d chromeflutter run -d android11. Troubleshooting
which flutter returns nothing
The mise shell activation is not loaded in the current shell. Check:
grep mise ~/.zshrcIf empty, redo section 3. If present, open a new terminal — the hook only applies to shells started after the change.
A tool installed by mise is still not found
Regenerate the shims:
mise reshimThis is notably required after corepack enable pnpm, which drops a binary into the
mise-managed Node installation without mise knowing about it.
cmdline-tools component is missing
The Android SDK Command-line Tools were not installed. Return to section 7 and enable them in Settings → Languages & Frameworks → Android SDK → SDK Tools.
Android licenses status unknown
flutter doctor --android-licensesIf the command itself fails, the command-line tools are missing — see above.
Unable to access driver information using 'eglinfo'
Cosmetic only, builds are unaffected:
sudo dnf install egl-utilsflutter doctor cannot find the Android SDK
Verify the variable is exported in the current shell:
echo $ANDROID_HOMEls $ANDROID_HOME/platform-toolsIf the path is correct but Flutter still misses it, force it:
flutter config --android-sdk "$HOME/Android/Sdk"Permission errors in the Flutter cache
Caused by having run flutter under sudo at some point. Restore ownership:
sudo chown -R "$USER:$USER" "$(mise where flutter)"12. Reference — Debian to Fedora package names
flutter doctor reports Debian package names. Fedora equivalents:
| Reported by Flutter (Debian) | Fedora package | Provides |
|---|---|---|
clang | clang | clang++ |
cmake | cmake | cmake |
ninja-build | ninja-build | ninja |
libgtk-3-dev | gtk3-devel | GTK 3 headers |
pkg-config | pkgconf-pkg-config | pkg-config |
mesa-utils | egl-utils | eglinfo |
mesa-utils | glx-utils | glxinfo, glxgears |
Quick checklist
- mise installed (official RPM repo or
mise.runscript) -
mise activateadded to~/.zshrc, new shell opened -
~/.config/mise/config.tomlwritten,mise installrun -
which flutterresolves to the mise shims directory - Linux build dependencies installed via dnf
- Android Studio installed (JetBrains Toolbox)
- Android SDK present in
~/Android/Sdk - SDK Command-line Tools enabled
-
ANDROID_HOMEexported and onPATH -
flutter doctor --android-licensesall accepted - Flutter SDK path configured in IntelliJ IDEA
-
flutter doctorreports no issues