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

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:

LayerManaged byLocation
Flutter & Dart SDK, JDK, Nodemise~/.local/share/mise/installs/
Native build toolchain (clang, CMake, Ninja, GTK)dnfsystem
Android SDK, platform-tools, emulatorAndroid 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.

System-wide install, updated together with the rest of the system via dnf upgrade.

Terminal window
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'
Terminal window
sudo dnf install mise

Option B — Standalone script (no root)

Installs into ~/.local/bin, touches nothing outside your home directory.

Terminal window
curl https://mise.run | sh

Updates 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:

Terminal window
mise --version

3. 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:

Terminal window
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

For bash:

Terminal window
echo 'eval "$(mise activate bash)"' >> ~/.bashrc

Reload the current shell:

Terminal window
exec zsh

If you use a framework such as oh-my-zsh, the mise activate line must come after the framework is sourced in .zshrc. Otherwise the framework rewrites PATH and the mise shims are shadowed.

Confirm the shims directory is now on your path:

Terminal window
echo $PATH | tr ':' '\n' | grep mise

4. 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.

Terminal window
mkdir -p ~/.config/mise
Terminal window
cat > ~/.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"
EOF
Terminal window
mise install
Terminal window
mise ls

The 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

ToolWhy not mise
PythonFedora 44 already ships Python 3.14 as the system python3. Use venv per project.
pnpmUse corepack enable pnpm (bundled with Node), then mise reshim.
Android SDKInstalled and updated by Android Studio, see section 7.

Per-project pinning

Writes a local mise.toml that overrides the global configuration:

Terminal window
cd my-project
mise use flutter@stable java@21.0.2

Verify Flutter is reachable

Terminal window
mise reshim
Terminal window
which flutter
Terminal window
flutter --version

which 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 flutter with sudo. 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.

Terminal window
sudo dnf install clang cmake ninja-build gtk3-devel pkgconf-pkg-config egl-utils

pkgconf-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:

Terminal window
sudo dnf install glx-utils

6. 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.

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

Terminal window
flatpak install -y flathub com.google.AndroidStudio

Caveat — 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:

  1. Choose the Standard installation type.

  2. On the SDK components screen, verify the Android SDK Location field reads exactly:

    /home/<your-user>/Android/Sdk

    This is the default on Linux. If it shows anything else, correct it now — it is far simpler than fixing it afterwards.

  3. 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:

Terminal window
ls ~/Android/Sdk

You 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:

Terminal window
cat >> ~/.zshrc << 'EOF'
export ANDROID_HOME="$HOME/Android/Sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin"
EOF
Terminal window
exec zsh

ANDROID_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:

Terminal window
flutter doctor --android-licenses

Answer y to each prompt.

If the SDK is not in the default location

Tell Flutter explicitly:

Terminal window
flutter config --android-sdk /path/to/your/Sdk

This 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:

Terminal window
mise where flutter

In 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

Terminal window
flutter doctor -v

Expected 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:

Terminal window
flutter devices

Smoke-test each platform from a real project:

Terminal window
flutter run -d linux
Terminal window
flutter run -d chrome
Terminal window
flutter run -d android

11. Troubleshooting

which flutter returns nothing

The mise shell activation is not loaded in the current shell. Check:

Terminal window
grep mise ~/.zshrc

If 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:

Terminal window
mise reshim

This 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

Terminal window
flutter doctor --android-licenses

If the command itself fails, the command-line tools are missing — see above.

Unable to access driver information using 'eglinfo'

Cosmetic only, builds are unaffected:

Terminal window
sudo dnf install egl-utils

flutter doctor cannot find the Android SDK

Verify the variable is exported in the current shell:

Terminal window
echo $ANDROID_HOME
Terminal window
ls $ANDROID_HOME/platform-tools

If the path is correct but Flutter still misses it, force it:

Terminal window
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:

Terminal window
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 packageProvides
clangclangclang++
cmakecmakecmake
ninja-buildninja-buildninja
libgtk-3-devgtk3-develGTK 3 headers
pkg-configpkgconf-pkg-configpkg-config
mesa-utilsegl-utilseglinfo
mesa-utilsglx-utilsglxinfo, glxgears

Quick checklist

  • mise installed (official RPM repo or mise.run script)
  • mise activate added to ~/.zshrc, new shell opened
  • ~/.config/mise/config.toml written, mise install run
  • which flutter resolves 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_HOME exported and on PATH
  • flutter doctor --android-licenses all accepted
  • Flutter SDK path configured in IntelliJ IDEA
  • flutter doctor reports no issues