{"id":51810,"date":"2025-08-26T02:27:09","date_gmt":"2025-08-26T02:27:09","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=51810"},"modified":"2025-08-26T02:27:09","modified_gmt":"2025-08-26T02:27:09","slug":"ultimate-macos-guide-flutter-android-sdk","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/ultimate-macos-guide-flutter-android-sdk\/","title":{"rendered":"Ultimate macOS Guide: Flutter + Android SDK"},"content":{"rendered":"\n<p>It covers <strong>Android SDK<\/strong>, <strong>Java (JDK)<\/strong>, <strong>Flutter<\/strong>, <strong>Path wiring<\/strong>, <strong>Plugin setup<\/strong>, <strong>Validation<\/strong>, <strong>AVD\/emulator<\/strong>, and <strong>creating a project<\/strong>\u2014plus quick fixes.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Assumptions: default shell = <code>zsh<\/code>, Apple Silicon path (<code>\/opt\/homebrew<\/code>). If you\u2019re on Intel, replace <code>\/opt\/homebrew<\/code> with <code>\/usr\/local<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1) Install Java (JDK)<\/h2>\n\n\n\n<p>Most Android\/Gradle stacks are happy with <strong>JDK 17+<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Install (latest LTS). If you specifically want 17, use: brew install --cask temurin17<\/span>\nbrew install --cask temurin\n\n<span class=\"hljs-comment\"># Ensure JAVA_HOME is set automatically<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export JAVA_HOME=\"$(\/usr\/libexec\/java_home)\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Verify<\/span>\njava -version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2) Install the Android SDK (CLI-only path, no GUI required)<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>If you prefer Android Studio GUI, install it via <code>brew install --cask android-studio<\/code> and use <strong>Preferences \u2192 Android SDK<\/strong> to install <strong>Command-line Tools<\/strong>, <strong>Platform-Tools<\/strong>, <strong>Build-Tools<\/strong>. Then skip to step 3.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Create SDK home and install command-line tools<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Set SDK root (mac default location)<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export ANDROID_SDK_ROOT=\"$HOME\/Library\/Android\/sdk\"'<\/span> &gt;&gt; ~\/.zshrc\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export ANDROID_HOME=\"$ANDROID_SDK_ROOT\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Create the folder<\/span>\nmkdir -p <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\"<\/span>\n\n<span class=\"hljs-comment\"># Install Android command-line tools<\/span>\nbrew install --cask android-commandlinetools\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.2 Put tools where Flutter expects them<\/h3>\n\n\n\n<p>Flutter looks for <code>sdkmanager<\/code> at:<br><code>$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\/sdkmanager<\/code><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">mkdir -p <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\"<\/span>\n\n<span class=\"hljs-comment\"># Try the \"latest\" symlink first (preferred; auto-updates with brew)<\/span>\nrm -rf <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\nln -s <span class=\"hljs-string\">\"\/opt\/homebrew\/Caskroom\/android-commandlinetools\/latest\/cmdline-tools\"<\/span> \\\n      <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span> <span class=\"hljs-number\">2<\/span>&gt;\/dev\/<span class=\"hljs-keyword\">null<\/span> || <span class=\"hljs-keyword\">true<\/span>\n\n<span class=\"hljs-comment\"># If your Caskroom doesn't have \"latest\", symlink the version you saw (example: 13114758)<\/span>\n<span class=\"hljs-keyword\">if<\/span> &#91; ! -x <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\/sdkmanager\"<\/span> ]; then\n  ln -s <span class=\"hljs-string\">\"\/opt\/homebrew\/Caskroom\/android-commandlinetools\/13114758\/cmdline-tools\"<\/span> \\\n        <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\nfi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.3 Add Android tools to PATH<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Add PATHs (platform-tools, emulator, cmdline-tools)<\/span>\n{\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/platform-tools\"'<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/emulator\"'<\/span>\n  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\"'<\/span>\n} &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Sanity checks<\/span>\nwhich sdkmanager\nwhich adb\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2.4 Install core SDK components<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Avoid \"repositories.cfg could not be loaded\" warning<\/span>\nmkdir -p ~\/.android &amp;&amp; touch ~\/.android\/repositories.cfg\n\n<span class=\"hljs-comment\"># Accept licenses (press y for each)<\/span>\nsdkmanager --licenses\n\n<span class=\"hljs-comment\"># Core packages<\/span>\nsdkmanager <span class=\"hljs-string\">\"platform-tools\"<\/span> <span class=\"hljs-string\">\"emulator\"<\/span> <span class=\"hljs-string\">\"cmdline-tools;latest\"<\/span>\n\n<span class=\"hljs-comment\"># Choose a modern Android platform + build-tools (adjust if needed)<\/span>\nsdkmanager <span class=\"hljs-string\">\"platforms;android-35\"<\/span> <span class=\"hljs-string\">\"build-tools;35.0.0\"<\/span>\n\n<span class=\"hljs-comment\"># Optional: system image for an ARM64 emulator<\/span>\nsdkmanager <span class=\"hljs-string\">\"system-images;android-35;google_apis;arm64-v8a\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3) Install Flutter (CLI)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">brew install --cask flutter\n\n<span class=\"hljs-comment\"># Put Flutter on PATH using the SDK\u2019s own path (future-proof)<\/span>\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$(flutter sdk-path)\/bin\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Verify<\/span>\nflutter --version\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4) Wire Flutter \u2194 Android SDK &amp; Validate<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># (Only needed if Flutter doesn\u2019t auto-detect your SDK)<\/span>\nflutter config --android-sdk <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\"<\/span>\n\n<span class=\"hljs-comment\"># Accept Android licenses via Flutter<\/span>\nflutter doctor --android-licenses\n\n<span class=\"hljs-comment\"># Full diagnostic<\/span>\nflutter doctor -v\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You should see <strong>green checks<\/strong> for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flutter<\/li>\n\n\n\n<li>Android toolchain<\/li>\n\n\n\n<li>Xcode (if installed)<\/li>\n\n\n\n<li>IDEs (if detected)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5) Install Flutter plugins (IDEs)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Android Studio<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Preferences \u2192 Plugins \u2192 Marketplace<\/strong><\/li>\n\n\n\n<li>Install <strong>Flutter<\/strong> (it auto-installs <strong>Dart<\/strong>)<\/li>\n\n\n\n<li><strong>Restart<\/strong> Android Studio<\/li>\n\n\n\n<li><strong>Preferences \u2192 Languages &amp; Frameworks \u2192 Flutter<\/strong> \u2192 set <strong>Flutter SDK path<\/strong> (yours was: <code>\/opt\/homebrew\/share\/flutter<\/code> or use <code>flutter sdk-path<\/code>)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">VS Code (optional)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Install <strong>Flutter<\/strong> and <strong>Dart<\/strong> extensions from the Marketplace.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6) Locate SDK paths quickly (for future prompts)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Flutter SDK root<\/span>\nflutter sdk-path\n\n<span class=\"hljs-comment\"># Android SDK root<\/span>\n<span class=\"hljs-keyword\">echo<\/span> $ANDROID_SDK_ROOT\n\n<span class=\"hljs-comment\"># Where is sdkmanager\/adb?<\/span>\nwhich sdkmanager\nwhich adb\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7) Create and run a Flutter project<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Create<\/span>\nflutter create hello_app\ncd hello_app\n\n<span class=\"hljs-comment\"># List devices (emulators\/phones)<\/span>\nflutter devices\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li>If you already created an AVD, start it: <code>emulator -list-avds emulator -avd Pixel_8_API_35<\/code><\/li>\n\n\n\n<li>Then run: <code>flutter run<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8) Create an Android emulator (AVD) from CLI (optional)<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Create a Pixel 8 AVD targeting android-35<\/span>\navdmanager create avd -n Pixel_8_API_35 \\\n  -k <span class=\"hljs-string\">\"system-images;android-35;google_apis;arm64-v8a\"<\/span> -d pixel_8\n\n<span class=\"hljs-comment\"># Start it<\/span>\nemulator -avd Pixel_8_API_35\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9) (Optional) iOS setup on macOS<\/h2>\n\n\n\n<p>If you want to run on iPhone simulators:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Xcode CLTs<\/span>\nxcode-select --install || <span class=\"hljs-keyword\">true<\/span>\n\n<span class=\"hljs-comment\"># First-run (may prompt)<\/span>\nsudo xcodebuild -runFirstLaunch\n\n<span class=\"hljs-comment\"># (Sometimes license acceptance is interactive in GUI)<\/span>\n<span class=\"hljs-comment\"># Install CocoaPods for iOS deps<\/span>\nbrew install cocoapods\npod setup\n\n<span class=\"hljs-comment\"># Check again<\/span>\nflutter doctor -v\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10) Quick Troubleshooting (copy\/paste fixes)<\/h2>\n\n\n\n<p><strong>A. <code>Android sdkmanager not found<\/code><\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Ensure the file exists here:<\/span>\nls <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\/sdkmanager\"<\/span>\n\n<span class=\"hljs-comment\"># Ensure PATH contains it<\/span>\n<span class=\"hljs-keyword\">echo<\/span> $PATH | tr <span class=\"hljs-string\">':'<\/span> <span class=\"hljs-string\">'\\n'<\/span> | grep cmdline-tools || \\\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\"'<\/span> &gt;&gt; ~\/.zshrc &amp;&amp; source ~\/.zshrc\n\n<span class=\"hljs-comment\"># Reinstall \/ relink cmdline tools if missing<\/span>\nbrew reinstall --cask android-commandlinetools\nrm -rf <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\nln -s <span class=\"hljs-string\">\"\/opt\/homebrew\/Caskroom\/android-commandlinetools\/latest\/cmdline-tools\"<\/span> \\\n      <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>B. <code>cmdline-tools component is missing<\/code><\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">sdkmanager <span class=\"hljs-string\">\"cmdline-tools;latest\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>C. Emulator not listed in <code>flutter devices<\/code><\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">emulator -<span class=\"hljs-keyword\">list<\/span>-avds\n<span class=\"hljs-comment\"># If none, create one (see section 8), then:<\/span>\nemulator -avd Pixel_8_API_35\nflutter devices\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>D. License prompts keep appearing<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">yes | sdkmanager --licenses\nflutter doctor --android-licenses\n<\/code><\/span><\/pre>\n\n\n<p><strong>E. Wrong SDK path in Android Studio<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Set <strong>Preferences \u2192 Languages &amp; Frameworks \u2192 Flutter \u2192 Flutter SDK path<\/strong> to:\n<ul class=\"wp-block-list\">\n<li><code>flutter sdk-path<\/code> (paste the result), e.g. <code>\/opt\/homebrew\/share\/flutter<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><strong>F. Verify everything at once<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT\"<\/span>\nwhich sdkmanager &amp;&amp; sdkmanager --<span class=\"hljs-keyword\">list<\/span> | head -n <span class=\"hljs-number\">30<\/span>\nadb version\njava -version\nwhich flutter &amp;&amp; flutter --version\nflutter doctor -v\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">11) One-time setup script (save as <code>setup_flutter_android_macos.sh<\/code>)<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Edit the <strong>versioned<\/strong> line (<code>13114758<\/code>) if your cask uses a different folder; the script also tries the <code>latest<\/code> alias.<\/p>\n<\/blockquote>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\n<span class=\"hljs-comment\"># JDK<\/span>\nbrew install --cask temurin || <span class=\"hljs-keyword\">true<\/span>\n\n<span class=\"hljs-comment\"># SDK roots<\/span>\ngrep -q <span class=\"hljs-string\">'ANDROID_SDK_ROOT='<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export ANDROID_SDK_ROOT=\"$HOME\/Library\/Android\/sdk\"'<\/span> &gt;&gt; ~\/.zshrc\ngrep -q <span class=\"hljs-string\">'ANDROID_HOME='<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export ANDROID_HOME=\"$ANDROID_SDK_ROOT\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\nmkdir -p <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\"<\/span>\n\n<span class=\"hljs-comment\"># Android command-line tools<\/span>\nbrew install --cask android-commandlinetools || <span class=\"hljs-keyword\">true<\/span>\nmkdir -p <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\"<\/span>\nrm -rf <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\nln -s <span class=\"hljs-string\">\"\/opt\/homebrew\/Caskroom\/android-commandlinetools\/latest\/cmdline-tools\"<\/span> <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span> \\\n  || ln -s <span class=\"hljs-string\">\"\/opt\/homebrew\/Caskroom\/android-commandlinetools\/13114758\/cmdline-tools\"<\/span> <span class=\"hljs-string\">\"$ANDROID_SDK_ROOT\/cmdline-tools\/latest\"<\/span>\n\n<span class=\"hljs-comment\"># PATHs<\/span>\ngrep -q <span class=\"hljs-string\">'platform-tools'<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/platform-tools\"'<\/span> &gt;&gt; ~\/.zshrc\ngrep -q <span class=\"hljs-string\">'emulator'<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/emulator\"'<\/span> &gt;&gt; ~\/.zshrc\ngrep -q <span class=\"hljs-string\">'cmdline-tools\/latest\/bin'<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Accept licenses &amp; core packages<\/span>\nmkdir -p ~\/.android &amp;&amp; touch ~\/.android\/repositories.cfg\nyes | sdkmanager --licenses || <span class=\"hljs-keyword\">true<\/span>\nsdkmanager <span class=\"hljs-string\">\"platform-tools\"<\/span> <span class=\"hljs-string\">\"emulator\"<\/span> <span class=\"hljs-string\">\"cmdline-tools;latest\"<\/span> \\\n           <span class=\"hljs-string\">\"platforms;android-35\"<\/span> <span class=\"hljs-string\">\"build-tools;35.0.0\"<\/span> || <span class=\"hljs-keyword\">true<\/span>\n\n<span class=\"hljs-comment\"># Flutter<\/span>\nbrew install --cask flutter || <span class=\"hljs-keyword\">true<\/span>\ngrep -q <span class=\"hljs-string\">'flutter sdk-path'<\/span> ~\/.zshrc || <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'export PATH=\"$PATH:$(flutter sdk-path)\/bin\"'<\/span> &gt;&gt; ~\/.zshrc\nsource ~\/.zshrc\n\n<span class=\"hljs-comment\"># Final check<\/span>\nflutter doctor -v\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Done. If Android Studio is installed, add the Flutter plugin and set Flutter SDK path to: $(flutter sdk-path)\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run it:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">chmod +x setup_flutter_android_macos.sh\n.\/setup_flutter_android_macos.sh\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">12) Short checklist (what \u201cgreen\u201d looks like)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>java -version<\/code> \u2192 prints Temurin\/Oracle\/OpenJDK<\/li>\n\n\n\n<li><code>which sdkmanager<\/code> \u2192 points to <code>$ANDROID_SDK_ROOT\/cmdline-tools\/latest\/bin\/sdkmanager<\/code><\/li>\n\n\n\n<li><code>adb version<\/code> \u2192 prints version<\/li>\n\n\n\n<li><code>flutter --version<\/code> \u2192 prints 3.35.x<\/li>\n\n\n\n<li><code>flutter doctor -v<\/code> \u2192 Android toolchain \u2705<\/li>\n\n\n\n<li>Android Studio \u2192 Plugins: <strong>Flutter<\/strong> + <strong>Dart<\/strong>, Flutter SDK path set<\/li>\n\n\n\n<li><code>flutter create app &amp;&amp; cd app &amp;&amp; flutter run<\/code> \u2192 launches on emulator\/device<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>That\u2019s it. Save this guide and the script; next time it\u2019s a one-shot setup with predictable results.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>It covers Android SDK, Java (JDK), Flutter, Path wiring, Plugin setup, Validation, AVD\/emulator, and creating a project\u2014plus quick fixes. Assumptions: default shell = zsh, Apple Silicon path (\/opt\/homebrew). If you\u2019re&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[],"class_list":["post-51810","post","type-post","status-publish","format-standard","hentry","category-uncategorised"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51810","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=51810"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51810\/revisions"}],"predecessor-version":[{"id":51811,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/51810\/revisions\/51811"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=51810"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=51810"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=51810"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}