[{"data":1,"prerenderedAt":2446},["ShallowReactive",2],{"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F":3,"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F-related":743,"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F-resources":2432},{"id":4,"title":5,"author":6,"body":10,"category":681,"createdAt":682,"description":683,"disclosure":684,"extension":685,"faq":686,"howTo":684,"lastVerified":684,"location":702,"meta":703,"navigation":308,"ogImage":684,"path":709,"primaryKeyword":710,"readingTime":711,"related":712,"seo":716,"sources":717,"stem":733,"tags":734,"takeaways":735,"updatedAt":682,"url":741,"__hash__":742},"blog\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026.md","Flutter \"Applying Gradle Plugin Imperatively\" Error: The Fix",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":666},"minimark",[13,30,33,39,44,149,152,157,160,187,190,194,206,210,229,233,244,402,414,418,435,439,457,477,480,508,531,535,542,546,549,623,626,630,646,650,662],[14,15,16,20,21,25,26,29],"p",{},[17,18,19],"strong",{},"If an Android build fails with \"You are applying Flutter's main Gradle plugin imperatively using the apply script method, which is not possible anymore\", your Gradle files still load Flutter the pre-3.16 way."," Flutter 3.29 removed support for that method, so the old ",[22,23,24],"code",{},"flutter.gradle"," file now does nothing but throw this error. The fix is to move three Gradle files to the declarative ",[22,27,28],{},"plugins {}"," block. It changes how the build is wired, not your app's code.",[14,31,32],{},"If you landed here from the link in the error message, flutter.dev\u002Fto\u002Fflutter-gradle-plugin-apply, it still opens Flutter's migration page. This guide follows that page and adds what the page doesn't say: when the old method stopped working, and the Firebase case most older apps have. The facts come from Flutter's docs, its source code and its release archive, as listed in the sources. I checked each one on October 18, 2026.",[14,34,35,38],{},[17,36,37],{},"Disclosure:"," App369 is my studio. I build and fix Flutter apps, and the last section mentions what I sell. Google doesn't pay me for anything on this page.",[40,41,43],"h2",{"id":42},"what-changed-and-when","What changed, and when",[45,46,47,63],"table",{},[48,49,50],"thead",{},[51,52,53,57,60],"tr",{},[54,55,56],"th",{},"Date",[54,58,59],{},"What happened",[54,61,62],{},"Source",[64,65,66,97,113,128],"tbody",{},[51,67,68,72,82],{},[69,70,71],"td",{},"November 15, 2023",[69,73,74,75,77,78,81],{},"Flutter 3.16 adds support for the declarative ",[22,76,28],{}," block. New ",[22,79,80],{},"flutter create"," projects use it",[69,83,84,91,92],{},[85,86,90],"a",{"href":87,"rel":88},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fflutter-gradle-plugin-apply",[89],"nofollow","Flutter docs",", ",[85,93,96],{"href":94,"rel":95},"https:\u002F\u002Fstorage.googleapis.com\u002Fflutter_infra_release\u002Freleases\u002Freleases_macos.json",[89],"release archive",[51,98,99,102,105],{},[69,100,101],{},"February 15, 2024",[69,103,104],{},"Flutter 3.19: the declarative block is the recommended way",[69,106,107,91,110],{},[85,108,90],{"href":87,"rel":109},[89],[85,111,96],{"href":94,"rel":112},[89],[51,114,115,118,121],{},[69,116,117],{},"January 7, 2025",[69,119,120],{},"Pull request #160947 removes support for the imperative apply",[69,122,123],{},[85,124,127],{"href":125,"rel":126},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F160947",[89],"Flutter PR #160947",[51,129,130,135,140],{},[69,131,132],{},[17,133,134],{},"February 12, 2025",[69,136,137],{},[17,138,139],{},"Flutter 3.29.0, the first stable release that includes that change",[69,141,142,91,146],{},[85,143,145],{"href":94,"rel":144},[89],"Release archive",[85,147,127],{"href":125,"rel":148},[89],[14,150,151],{},"Flutter's docs page lists only when the new method was supported and recommended. The removal date comes from the pull request. I checked that its commit is in the 3.29.0 tag and not in 3.27.",[153,154,156],"h3",{"id":155},"the-two-versions-of-the-error","The two versions of the error",[14,158,159],{},"Both come from files in Flutter's own Gradle folder that now exist only to throw an error:",[161,162,163,177],"ul",{},[164,165,166,168,169,172,173,176],"li",{},[22,167,24],{},": \"You are applying Flutter's main Gradle plugin imperatively using the apply script method, which is not possible anymore.\" This means ",[22,170,171],{},"android\u002Fapp\u002Fbuild.gradle"," still has ",[22,174,175],{},"apply from: \"...\u002Fflutter.gradle\"",".",[164,178,179,182,183,186],{},[22,180,181],{},"app_plugin_loader.gradle",": \"You are applying Flutter's app_plugin_loader Gradle plugin imperatively using the apply script method, which is not possible anymore.\" This means ",[22,184,185],{},"android\u002Fsettings.gradle"," still loads the plugin loader the old way.",[14,188,189],{},"Both point to the same migration page, and the fix below covers both.",[40,191,193],{"id":192},"the-fix-file-by-file","The fix, file by file",[14,195,196,197,201,202,205],{},"These steps follow Flutter's ",[85,198,200],{"href":87,"rel":199},[89],"migration page",". My advice: commit or back up the ",[22,203,204],{},"android"," folder before you start, so you can compare.",[153,207,209],{"id":208},"_1-note-your-agp-and-kotlin-versions","1. Note your AGP and Kotlin versions",[14,211,212,213,216,217,220,221,224,225,228],{},"Open ",[22,214,215],{},"android\u002Fbuild.gradle",". In the ",[22,218,219],{},"buildscript"," block, the Android Gradle Plugin version is the number at the end of ",[22,222,223],{},"classpath 'com.android.tools.build:gradle:...'",", and the Kotlin version is in ",[22,226,227],{},"ext.kotlin_version = '...'",". You need both in the next step.",[153,230,232],{"id":231},"_2-replace-androidsettingsgradle","2. Replace android\u002Fsettings.gradle",[14,234,235,236,239,240,243],{},"Flutter's page gives this as the new contents. Replace ",[22,237,238],{},"{agpVersion}"," and ",[22,241,242],{},"{kotlinVersion}"," with the versions from step 1:",[245,246,251],"pre",{"className":247,"code":248,"language":249,"meta":250,"style":250},"language-groovy shiki shiki-themes github-light github-dark","pluginManagement {\n    def flutterSdkPath = {\n        def properties = new Properties()\n        file(\"local.properties\").withInputStream { properties.load(it) }\n        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n        return flutterSdkPath\n    }()\n\n    includeBuild(\"$flutterSdkPath\u002Fpackages\u002Fflutter_tools\u002Fgradle\")\n\n    repositories {\n        google()\n        mavenCentral()\n        gradlePluginPortal()\n    }\n}\n\nplugins {\n    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n    id \"com.android.application\" version \"{agpVersion}\" apply false\n    id \"org.jetbrains.kotlin.android\" version \"{kotlinVersion}\" apply false\n}\n\ninclude \":app\"\n","groovy","",[22,252,253,261,267,273,279,285,291,297,303,310,316,321,327,333,339,345,351,357,362,368,374,380,386,391,396],{"__ignoreMap":250},[254,255,258],"span",{"class":256,"line":257},"line",1,[254,259,260],{},"pluginManagement {\n",[254,262,264],{"class":256,"line":263},2,[254,265,266],{},"    def flutterSdkPath = {\n",[254,268,270],{"class":256,"line":269},3,[254,271,272],{},"        def properties = new Properties()\n",[254,274,276],{"class":256,"line":275},4,[254,277,278],{},"        file(\"local.properties\").withInputStream { properties.load(it) }\n",[254,280,282],{"class":256,"line":281},5,[254,283,284],{},"        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n",[254,286,288],{"class":256,"line":287},6,[254,289,290],{},"        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n",[254,292,294],{"class":256,"line":293},7,[254,295,296],{},"        return flutterSdkPath\n",[254,298,300],{"class":256,"line":299},8,[254,301,302],{},"    }()\n",[254,304,306],{"class":256,"line":305},9,[254,307,309],{"emptyLinePlaceholder":308},true,"\n",[254,311,313],{"class":256,"line":312},10,[254,314,315],{},"    includeBuild(\"$flutterSdkPath\u002Fpackages\u002Fflutter_tools\u002Fgradle\")\n",[254,317,319],{"class":256,"line":318},11,[254,320,309],{"emptyLinePlaceholder":308},[254,322,324],{"class":256,"line":323},12,[254,325,326],{},"    repositories {\n",[254,328,330],{"class":256,"line":329},13,[254,331,332],{},"        google()\n",[254,334,336],{"class":256,"line":335},14,[254,337,338],{},"        mavenCentral()\n",[254,340,342],{"class":256,"line":341},15,[254,343,344],{},"        gradlePluginPortal()\n",[254,346,348],{"class":256,"line":347},16,[254,349,350],{},"    }\n",[254,352,354],{"class":256,"line":353},17,[254,355,356],{},"}\n",[254,358,360],{"class":256,"line":359},18,[254,361,309],{"emptyLinePlaceholder":308},[254,363,365],{"class":256,"line":364},19,[254,366,367],{},"plugins {\n",[254,369,371],{"class":256,"line":370},20,[254,372,373],{},"    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n",[254,375,377],{"class":256,"line":376},21,[254,378,379],{},"    id \"com.android.application\" version \"{agpVersion}\" apply false\n",[254,381,383],{"class":256,"line":382},22,[254,384,385],{},"    id \"org.jetbrains.kotlin.android\" version \"{kotlinVersion}\" apply false\n",[254,387,389],{"class":256,"line":388},23,[254,390,356],{},[254,392,394],{"class":256,"line":393},24,[254,395,309],{"emptyLinePlaceholder":308},[254,397,399],{"class":256,"line":398},25,[254,400,401],{},"include \":app\"\n",[14,403,404,405,239,408,410,411,176],{},"If you had your own code in this file, keep it after the ",[22,406,407],{},"pluginManagement {}",[22,409,28],{}," blocks. Gradle doesn't allow other code before them. The plugin loader must not be set to ",[22,412,413],{},"apply false",[153,415,417],{"id":416},"_3-remove-buildscript-from-androidbuildgradle","3. Remove buildscript from android\u002Fbuild.gradle",[14,419,420,421,424,425,91,428,239,431,434],{},"Delete the whole ",[22,422,423],{},"buildscript { ... }"," block. The ",[22,426,427],{},"allprojects",[22,429,430],{},"subprojects",[22,432,433],{},"clean"," parts stay.",[153,436,438],{"id":437},"_4-update-androidappbuildgradle","4. Update android\u002Fapp\u002Fbuild.gradle",[14,440,441,442,445,446,449,450,453,454,456],{},"Remove the ",[22,443,444],{},"def flutterRoot = localProperties.getProperty('flutter.sdk')"," line and the ",[22,447,448],{},"if (flutterRoot == null) { throw ... }"," block that follows it. Keep the code that loads ",[22,451,452],{},"local.properties",", which the version settings still use. Then remove the old apply lines. In Flutter 3.10's ",[22,455,80],{}," template they look like this:",[245,458,460],{"className":247,"code":459,"language":249,"meta":250,"style":250},"apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle\"\n",[22,461,462,467,472],{"__ignoreMap":250},[254,463,464],{"class":256,"line":257},[254,465,466],{},"apply plugin: 'com.android.application'\n",[254,468,469],{"class":256,"line":263},[254,470,471],{},"apply plugin: 'kotlin-android'\n",[254,473,474],{"class":256,"line":269},[254,475,476],{},"apply from: \"$flutterRoot\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle\"\n",[14,478,479],{},"Then add this at the very top of the file:",[245,481,483],{"className":247,"code":482,"language":249,"meta":250,"style":250},"plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n",[22,484,485,489,494,499,504],{"__ignoreMap":250},[254,486,487],{"class":256,"line":257},[254,488,367],{},[254,490,491],{"class":256,"line":263},[254,492,493],{},"    id \"com.android.application\"\n",[254,495,496],{"class":256,"line":269},[254,497,498],{},"    id \"kotlin-android\"\n",[254,500,501],{"class":256,"line":275},[254,502,503],{},"    id \"dev.flutter.flutter-gradle-plugin\"\n",[254,505,506],{"class":256,"line":281},[254,507,356],{},[14,509,510,511,514,515,518,519,522,523,526,527,530],{},"Flutter's page points out that ",[22,512,513],{},"dev.flutter.flutter-gradle-plugin"," here is a different ID from ",[22,516,517],{},"dev.flutter.flutter-plugin-loader"," in ",[22,520,521],{},"settings.gradle",". If the ",[22,524,525],{},"dependencies"," block has ",[22,528,529],{},"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",", remove that line.",[153,532,534],{"id":533},"_5-build-and-run","5. Build and run",[14,536,537,538,541],{},"Flutter's page says to run ",[22,539,540],{},"flutter run"," and check that the app builds and launches on an Android device or emulator.",[40,543,545],{"id":544},"if-the-app-uses-firebase","If the app uses Firebase",[14,547,548],{},"If your app uses Firebase, its Google Services plugin, and Crashlytics if you use it, are probably applied the old way too. Flutter's page covers this case:",[550,551,552,569,580,608],"ol",{},[164,553,554,555,557,558,561,562,239,565,568],{},"In ",[22,556,215],{},", remove the ",[22,559,560],{},"classpath"," lines for ",[22,563,564],{},"com.google.gms:google-services",[22,566,567],{},"com.google.firebase:firebase-crashlytics-gradle",". Note their versions first.",[164,570,554,571,573,574,239,577,176],{},[22,572,171],{},", remove ",[22,575,576],{},"apply plugin: 'com.google.gms.google-services'",[22,578,579],{},"apply plugin: 'com.google.firebase.crashlytics'",[164,581,582,583,586,587,589,590,592,593],{},"Add both to the ",[22,584,585],{},"plugins"," block in ",[22,588,185],{},", with the versions you noted and ",[22,591,413],{},":",[245,594,596],{"className":247,"code":595,"language":249,"meta":250,"style":250},"id \"com.google.gms.google-services\" version \"4.4.0\" apply false\nid \"com.google.firebase.crashlytics\" version \"2.9.9\" apply false\n",[22,597,598,603],{"__ignoreMap":250},[254,599,600],{"class":256,"line":257},[254,601,602],{},"id \"com.google.gms.google-services\" version \"4.4.0\" apply false\n",[254,604,605],{"class":256,"line":263},[254,606,607],{},"id \"com.google.firebase.crashlytics\" version \"2.9.9\" apply false\n",[164,609,610,611,239,614,617,618,586,620,622],{},"Add ",[22,612,613],{},"id \"com.google.gms.google-services\"",[22,615,616],{},"id \"com.google.firebase.crashlytics\""," to the ",[22,619,585],{},[22,621,171],{},", without versions.",[14,624,625],{},"The versions above are the ones in Flutter's example. Use the versions your project had, or newer ones.",[40,627,629],{"id":628},"if-the-build-still-fails-after-this","If the build still fails after this",[14,631,632,633,637,638,641,642,176],{},"In my view, a project old enough to hit this error usually has more than one problem waiting: old plugins, an old AGP or Gradle version, or the v1 embedding. If the next error says \"Build failed due to use of deleted Android v1 embedding\", see ",[85,634,636],{"href":635},"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F","the v1 embedding fix",", also removed in Flutter 3.29. If Gradle can't find ",[22,639,640],{},"jcenter()",", see ",[85,643,645],{"href":644},"\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026\u002F","the JCenter guide",[40,647,649],{"id":648},"need-a-hand","Need a hand?",[14,651,652,653,657,658,176],{},"If an older Flutter app won't build after an upgrade, the ",[85,654,656],{"href":655},"\u002Ffixed-price\u002Fflutter-firebase-bug-fix\u002F","App Fix Ticket"," covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. Or ",[85,659,661],{"href":660},"\u002Fcontact\u002F","send me a short description",[663,664,665],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":250,"searchDepth":263,"depth":263,"links":667},[668,671,678,679,680],{"id":42,"depth":263,"text":43,"children":669},[670],{"id":155,"depth":269,"text":156},{"id":192,"depth":263,"text":193,"children":672},[673,674,675,676,677],{"id":208,"depth":269,"text":209},{"id":231,"depth":269,"text":232},{"id":416,"depth":269,"text":417},{"id":437,"depth":269,"text":438},{"id":533,"depth":269,"text":534},{"id":544,"depth":263,"text":545},{"id":628,"depth":263,"text":629},{"id":648,"depth":263,"text":649},"AI & Technology","2026-10-18T23:00:00.000Z","Since Flutter 3.29 (February 12, 2025), an Android build that still uses apply from: flutter.gradle fails with \"You are applying Flutter's main Gradle plugin imperatively using the apply script method, which is not possible anymore.\" How to move settings.gradle, build.gradle and app\u002Fbuild.gradle to the plugins {} block, from Flutter's docs and source checked October 18, 2026.",null,"md",[687,690,693,696,699],{"question":688,"answer":689},"What does \"applying Flutter's main Gradle plugin imperatively\" mean?","Your android\u002Fapp\u002Fbuild.gradle still loads Flutter's Gradle plugin with apply from: \"$flutterRoot\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle\". Flutter removed support for that method, and in Flutter 3.29 and later that file only throws this error. The fix is to apply the plugin with the declarative plugins {} block.",{"question":691,"answer":692},"Which Flutter version made the imperative apply an error?","Flutter 3.29. The change that removed support, Flutter pull request #160947, was merged on January 7, 2025 and is included in the 3.29.0 tag but not in 3.27. Flutter's release archive dates 3.29.0 February 12, 2025.",{"question":694,"answer":695},"How do I fix the error?","Follow Flutter's \"Deprecated imperative apply of Flutter's Gradle plugins\" page: put a pluginManagement block and a plugins block with dev.flutter.flutter-plugin-loader in android\u002Fsettings.gradle, remove the buildscript block from android\u002Fbuild.gradle, and replace the apply lines in android\u002Fapp\u002Fbuild.gradle with a plugins block that includes dev.flutter.flutter-gradle-plugin.",{"question":697,"answer":698},"What is the difference between flutter-plugin-loader and flutter-gradle-plugin?","Flutter's docs say dev.flutter.flutter-plugin-loader is the settings plugin and goes in settings.gradle, while dev.flutter.flutter-gradle-plugin is the project plugin and goes in app\u002Fbuild.gradle. They are different IDs, and the loader must not be set to apply false.",{"question":700,"answer":701},"What about google-services and Crashlytics?","Flutter's docs show removing their classpath lines from android\u002Fbuild.gradle and their apply plugin lines from app\u002Fbuild.gradle, then adding com.google.gms.google-services and com.google.firebase.crashlytics with versions and apply false to the settings.gradle plugins block, and without versions to the app\u002Fbuild.gradle plugins block.","Boynton Beach, FL",{"readingTimeStats":704},{"text":705,"minutes":706,"time":707,"words":708},"5 min read",4.295,257700,859,"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026","applying flutter's main gradle plugin imperatively","7 min",[713,714,715],"flutter-deleted-android-v1-embedding-build-failed-2026","jcenter-bintray-shut-down-fix-android-flutter-builds-2026","flutter-ios-build-failed-after-upgrade-2026",{"title":5,"description":683},[718,720,722,725,728,731],{"title":719,"url":87},"Flutter docs, Deprecated imperative apply of Flutter's Gradle plugins (last updated July 31, 2026)",{"title":721,"url":125},"Flutter on GitHub, pull request #160947 \"Remove support for imperative apply of Flutter Gradle Plugin\"",{"title":723,"url":724},"Flutter on GitHub, flutter_tools gradle\u002Fflutter.gradle","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle",{"title":726,"url":727},"Flutter on GitHub, flutter_tools gradle\u002Fapp_plugin_loader.gradle","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fapp_plugin_loader.gradle",{"title":729,"url":730},"Flutter on GitHub, Flutter 3.10.0 app\u002Fbuild.gradle template","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.10.0\u002Fpackages\u002Fflutter_tools\u002Ftemplates\u002Fapp_shared\u002Fandroid-kotlin.tmpl\u002Fapp\u002Fbuild.gradle.tmpl",{"title":732,"url":94},"Flutter release archive (macOS)","blog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026","applying flutter main gradle plugin imperatively, apply script method not possible anymore, flutter gradle plugin declarative, dev.flutter.flutter-gradle-plugin, dev.flutter.flutter-plugin-loader, app_plugin_loader gradle imperatively, flutter 3.29 android build error, flutter settings.gradle pluginManagement, google-services plugins block flutter",[736,737,738,739,740],"Flutter 3.16 added support for applying its Gradle plugins with the declarative plugins {} block, and Flutter 3.19 made it the recommended way. Projects created before 3.16 have to be migrated by hand.","Flutter removed support for the old apply from: flutter.gradle method in pull request #160947, merged January 7, 2025. Flutter 3.29.0, released February 12, 2025, is the first stable release that includes it.","The build now stops with \"You are applying Flutter's main Gradle plugin imperatively using the apply script method, which is not possible anymore.\" A similar message names the app_plugin_loader plugin when settings.gradle uses the old method.","The fix touches three files: android\u002Fsettings.gradle gets a pluginManagement and plugins block, android\u002Fbuild.gradle loses its buildscript block, and android\u002Fapp\u002Fbuild.gradle swaps its apply lines for a plugins block.","Firebase projects also move the Google Services and Crashlytics Gradle plugins out of buildscript and into the same plugins blocks.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F","Kjdbzu4lCmI6b6y37z8MpsLLi-8i5UN85lDKFD9_Iuw",[744,1385,1912],{"id":745,"title":746,"author":747,"body":749,"category":681,"createdAt":1330,"description":1331,"disclosure":684,"extension":685,"faq":1332,"howTo":684,"lastVerified":684,"location":702,"meta":1348,"navigation":308,"ogImage":684,"path":1353,"primaryKeyword":1354,"readingTime":711,"related":1355,"seo":1357,"sources":1358,"stem":1375,"tags":1376,"takeaways":1377,"updatedAt":1330,"url":1383,"__hash__":1384},"blog\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026.md","Flutter \"Deleted Android v1 Embedding\" Build Error: The Fix",{"name":7,"social":748},{"twitter":9},{"type":11,"value":750,"toc":1321},[751,778,785,789,793,866,869,873,876,905,909,920,953,956,960,971,1149,1157,1248,1262,1266,1276,1305,1307,1319],[14,752,753,760,761,763,764,239,767,770,771,239,774,777],{},[17,754,755,756,759],{},"If ",[22,757,758],{},"flutter build"," stops with \"Build failed due to use of deleted Android v1 embedding\", your Android project still uses the wrapper Flutter removed in Flutter 3.29."," For a project that came straight from ",[22,762,80],{},", Flutter's guide changes two files: ",[22,765,766],{},"MainActivity",[22,768,769],{},"AndroidManifest.xml",". Custom channel code or a splash screen adds a little more. If the build instead fails inside a plugin with ",[22,772,773],{},"cannot find symbol",[22,775,776],{},"PluginRegistry.Registrar",", the plugin is the problem, and a newer version of it usually fixes it.",[14,779,780,781,784],{},"If you landed here from an old link to Flutter's \"Upgrading pre 1.12 Android projects\" wiki page or an old ",[22,782,783],{},"flutter.dev\u002Fgo"," migration link, this is what changed and where the steps live now. The facts come from Flutter's breaking-change docs, its migration guide and the Flutter tool's source code, as listed in the sources. I checked each one on October 18, 2026.",[14,786,787,38],{},[17,788,37],{},[40,790,792],{"id":791},"what-happened-to-the-v1-embedding-and-when","What happened to the v1 embedding, and when",[45,794,795,805],{},[48,796,797],{},[51,798,799,801,803],{},[54,800,56],{},[54,802,59],{},[54,804,62],{},[64,806,807,829,845],{},[51,808,809,812,819],{},[69,810,811],{},"December 11, 2019",[69,813,814,815,818],{},"Flutter 1.12 reaches stable with the v2 Android embedding (",[22,816,817],{},"io.flutter.embedding",")",[69,820,821,91,826],{},[85,822,825],{"href":823,"rel":824},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fandroid-v1-embedding-create-deprecation",[89],"Flutter deprecation page",[85,827,96],{"href":94,"rel":828},[89],[51,830,831,834,840],{},[69,832,833],{},"October 1, 2020",[69,835,836,837,839],{},"Flutter 1.22: ",[22,838,80],{}," only makes v2 apps and plugins. Existing v1 apps keep working, but get a migration warning when they use plugins",[69,841,842],{},[85,843,825],{"href":823,"rel":844},[89],[51,846,847,851,856],{},[69,848,849],{},[17,850,134],{},[69,852,853],{},[17,854,855],{},"Flutter 3.29 removes the v1 embedding Java classes",[69,857,858,91,863],{},[85,859,862],{"href":860,"rel":861},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fv1-android-embedding",[89],"Flutter removal page",[85,864,96],{"href":94,"rel":865},[89],[14,867,868],{},"Flutter's deprecation page says that by Q2 2020 only 26% of applications used the v1 embedding. In my view, the apps that still hit this error are usually ones created before 2020 and moved to a new Flutter version for the first time in years.",[153,870,872],{"id":871},"what-the-old-addresses-do-today","What the old addresses do today",[14,874,875],{},"Checked on October 18, 2026:",[161,877,878,889,899],{},[164,879,880,881,884,885,888],{},"The ",[17,882,883],{},"\"Upgrading pre 1.12 Android projects\""," page on the Flutter GitHub wiki now only says it has moved, and links to the same page in the Flutter repository's ",[22,886,887],{},"docs"," folder.",[164,890,891,894,895,898],{},[17,892,893],{},"flutter.dev\u002Fgo\u002Fandroid-project-migration"," now redirects to Flutter's ",[17,896,897],{},"AndroidX migration"," page, which doesn't cover the v1 embedding. The embedding steps are in the repository doc above.",[164,900,901,904],{},[17,902,903],{},"flutter.dev\u002Fgo\u002Fandroid-plugin-migration"," redirects to \"Supporting the new Android plugins APIs\", which is still the right page for plugin authors.",[40,906,908],{"id":907},"why-flutter-says-your-app-is-v1","Why Flutter says your app is v1",[14,910,911,912,915,916,919],{},"The check is in the Flutter tool's ",[22,913,914],{},"project.dart",". It reads ",[22,917,918],{},"android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml"," and treats the app as v1 when:",[161,921,922,933,943,950],{},[164,923,924,925,928,929,932],{},"the ",[22,926,927],{},"\u003Capplication>"," tag has ",[22,930,931],{},"android:name=\"io.flutter.app.FlutterApplication\"",", or",[164,934,935,936,939,940,932],{},"there is a ",[22,937,938],{},"flutterEmbedding"," meta-data tag with value ",[22,941,942],{},"1",[164,944,945,946,949],{},"there is no ",[22,947,948],{},"\u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>"," at all, or",[164,951,952],{},"the manifest file is missing.",[14,954,955],{},"Any of those ends the build with \"Build failed due to use of deleted Android v1 embedding.\" The tool skips this check for add-to-app modules and plugins.",[40,957,959],{"id":958},"fixing-the-app","Fixing the app",[14,961,962,963,968,969,176],{},"These are the steps from Flutter's ",[85,964,967],{"href":965,"rel":966},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fdocs\u002Fplatforms\u002Fandroid\u002FUpgrading-pre-1.12-Android-projects.md",[89],"Upgrading pre 1.12 Android projects"," guide, for a project made with ",[22,970,80],{},[550,972,973,1036,1065,1080,1110,1131],{},[164,974,975,980,981,984,985,988,989,992,993,996,997,1000,1001,1022,1025,1026,1029,1030,239,1033,176],{},[17,976,977,978,176],{},"Update ",[22,979,766],{}," Change ",[22,982,983],{},"import io.flutter.app.FlutterActivity"," to ",[22,986,987],{},"import io.flutter.embedding.android.FlutterActivity"," and delete the ",[22,990,991],{},"onCreate"," override that calls ",[22,994,995],{},"GeneratedPluginRegistrant.registerWith(this)",". The new ",[22,998,999],{},"FlutterActivity"," registers plugins itself.",[245,1002,1006],{"className":1003,"code":1004,"language":1005,"meta":250,"style":250},"language-kotlin shiki shiki-themes github-light github-dark","import io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n","kotlin",[22,1007,1008,1013,1017],{"__ignoreMap":250},[254,1009,1010],{"class":256,"line":257},[254,1011,1012],{},"import io.flutter.embedding.android.FlutterActivity\n",[254,1014,1015],{"class":256,"line":263},[254,1016,309],{"emptyLinePlaceholder":308},[254,1018,1019],{"class":256,"line":269},[254,1020,1021],{},"class MainActivity: FlutterActivity()\n",[1023,1024],"br",{},"If your file is ",[22,1027,1028],{},"MainActivity.java",", the guide's result is the same: ",[22,1031,1032],{},"import io.flutter.embedding.android.FlutterActivity;",[22,1034,1035],{},"public class MainActivity extends FlutterActivity {}",[164,1037,1038,1041,1042,1044,1045,1048,1049,1052,1053,1056,1057,1060,1061,1064],{},[17,1039,1040],{},"Move any platform channel code."," If ",[22,1043,991],{}," also set up a ",[22,1046,1047],{},"MethodChannel",", move it into a ",[22,1050,1051],{},"configureFlutterEngine(flutterEngine)"," override, and use ",[22,1054,1055],{},"flutterEngine.getDartExecutor().getBinaryMessenger()"," instead of ",[22,1058,1059],{},"getFlutterView()",". The guide's example also calls ",[22,1062,1063],{},"GeneratedPluginRegistrant.registerWith(flutterEngine)"," at the start of that override.",[164,1066,1067,1070,1071,1073,1074,1076,1077,176],{},[17,1068,1069],{},"Fix the application tag."," In ",[22,1072,769],{},", replace ",[22,1075,931],{}," with ",[22,1078,1079],{},"android:name=\"${applicationName}\"",[164,1081,1082,1085,1086,592,1088],{},[17,1083,1084],{},"Declare the v2 embedding."," Add this inside ",[22,1087,927],{},[245,1089,1093],{"className":1090,"code":1091,"language":1092,"meta":250,"style":250},"language-xml shiki shiki-themes github-light github-dark","\u003Cmeta-data\n    android:name=\"flutterEmbedding\"\n    android:value=\"2\" \u002F>\n","xml",[22,1094,1095,1100,1105],{"__ignoreMap":250},[254,1096,1097],{"class":256,"line":257},[254,1098,1099],{},"\u003Cmeta-data\n",[254,1101,1102],{"class":256,"line":263},[254,1103,1104],{},"    android:name=\"flutterEmbedding\"\n",[254,1106,1107],{"class":256,"line":269},[254,1108,1109],{},"    android:value=\"2\" \u002F>\n",[164,1111,1112,1115,1116,1119,1120,1123,1124,518,1127,1130],{},[17,1113,1114],{},"Update the splash screen if you had one."," Remove meta-data named ",[22,1117,1118],{},"io.flutter.app.android.SplashScreenUntilFirstFrame",". The guide shows the replacement: a ",[22,1121,1122],{},"LaunchTheme"," and a ",[22,1125,1126],{},"NormalTheme",[22,1128,1129],{},"styles.xml",", set on the activity.",[164,1132,1133,1136,1137,1140,1141,1144,1145,1148],{},[17,1134,1135],{},"Rebuild."," The guide says the app should then build as normal, for example with ",[22,1138,1139],{},"flutter build apk",". My advice: run ",[22,1142,1143],{},"flutter clean"," first, and ",[22,1146,1147],{},"flutter pub upgrade"," too, because a project this old usually has plugins that are out of date as well.",[14,1150,1151,1152,1156],{},"If your own code uses other removed classes, Flutter's ",[85,1153,1155],{"href":860,"rel":1154},[89],"removal page"," lists the replacements:",[45,1158,1159,1169],{},[48,1160,1161],{},[51,1162,1163,1166],{},[54,1164,1165],{},"Removed class",[54,1167,1168],{},"Use instead",[64,1170,1171,1183,1195,1209,1221,1233],{},[51,1172,1173,1178],{},[69,1174,1175],{},[22,1176,1177],{},"io.flutter.app.FlutterActivity",[69,1179,1180],{},[22,1181,1182],{},"io.flutter.embedding.android.FlutterActivity",[51,1184,1185,1190],{},[69,1186,1187],{},[22,1188,1189],{},"io.flutter.app.FlutterFragmentActivity",[69,1191,1192],{},[22,1193,1194],{},"io.flutter.embedding.android.FlutterFragmentActivity",[51,1196,1197,1202],{},[69,1198,1199],{},[22,1200,1201],{},"io.flutter.app.FlutterApplication",[69,1203,1204,1205,1208],{},"Removed. Extend ",[22,1206,1207],{},"android.app.Application"," if you need a custom one",[51,1210,1211,1216],{},[69,1212,1213],{},[22,1214,1215],{},"io.flutter.app.FlutterPlayStoreSplitApplication",[69,1217,1218],{},[22,1219,1220],{},"io.flutter.embedding.android.FlutterPlayStoreSplitApplication",[51,1222,1223,1228],{},[69,1224,1225],{},[22,1226,1227],{},"io.flutter.view.FlutterMain",[69,1229,1230],{},[22,1231,1232],{},"io.flutter.embedding.engine.loader.FlutterLoader",[51,1234,1235,1243],{},[69,1236,1237,239,1240],{},[22,1238,1239],{},"io.flutter.view.FlutterView",[22,1241,1242],{},"FlutterNativeView",[69,1244,1245],{},[22,1246,1247],{},"io.flutter.embedding.android.FlutterView",[14,1249,1250,1251,239,1254,1257,1258,1261],{},"For add-to-app projects, the same guide has a separate section: remove calls to ",[22,1252,1253],{},"FlutterMain.startInitialization",[22,1255,1256],{},"ensureInitializationComplete",", and replace the ",[22,1259,1260],{},"io.flutter.facade"," classes.",[40,1263,1265],{"id":1264},"fixing-a-plugin-that-still-uses-pluginregistryregistrar","Fixing a plugin that still uses PluginRegistry.Registrar",[14,1267,1268,1269,1272,1273,1275],{},"If the error points at a plugin, its Android code usually still has a ",[22,1270,1271],{},"registerWith(PluginRegistry.Registrar registrar)"," method. That API was removed with the rest of the v1 embedding. When the Flutter tool sees that line in a failed build, it prints its own advice: run ",[22,1274,1147],{}," to get newer plugin versions, and file an issue if that doesn't help.",[161,1277,1278,1291],{},[164,1279,1280,1283,1284,1286,1287,1290],{},[17,1281,1282],{},"If you use the plugin:"," upgrade it, as the tool suggests. My advice: if ",[22,1285,1147],{}," doesn't move it, check pub.dev for a newer major version and run ",[22,1288,1289],{},"flutter pub upgrade --major-versions",". If the plugin has had no release in years, replace it.",[164,1292,1293,1296,1297,1300,1301,1304],{},[17,1294,1295],{},"If you maintain the plugin:"," Flutter's removal page says to delete the ",[22,1298,1299],{},"registerWith"," method from your ",[22,1302,1303],{},"FlutterPlugin"," implementation. The Flutter team did the same for its own plugins in flutter\u002Fpackages#6494.",[40,1306,649],{"id":648},[14,1308,652,1309,1311,1312,1316,1317,176],{},[85,1310,656],{"href":655}," covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. If the iOS side broke too, see ",[85,1313,1315],{"href":1314},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","Flutter iOS build failed after an upgrade",", or ",[85,1318,661],{"href":660},[663,1320,665],{},{"title":250,"searchDepth":263,"depth":263,"links":1322},[1323,1326,1327,1328,1329],{"id":791,"depth":263,"text":792,"children":1324},[1325],{"id":871,"depth":269,"text":872},{"id":907,"depth":263,"text":908},{"id":958,"depth":263,"text":959},{"id":1264,"depth":263,"text":1265},{"id":648,"depth":263,"text":649},"2026-10-18T21:00:00.000Z","Flutter removed the Android v1 embedding in Flutter 3.29 (February 12, 2025), so older projects now stop with \"Build failed due to use of deleted Android v1 embedding\" or a plugin error about PluginRegistry.Registrar. What the error means, how Flutter decides your app is v1, and the exact AndroidManifest and MainActivity changes, from Flutter's docs and source checked October 18, 2026.",[1333,1336,1339,1342,1345],{"question":1334,"answer":1335},"What does \"Build failed due to use of deleted Android v1 embedding\" mean?","The Flutter tool decided your Android app still uses the old v1 embedding, which was removed in Flutter 3.29. In Flutter's source, that happens when AndroidManifest.xml uses io.flutter.app.FlutterApplication, or has no flutterEmbedding meta-data with value 2, or the AndroidManifest.xml file is missing.",{"question":1337,"answer":1338},"How do I fix the deleted Android v1 embedding error?","Follow Flutter's \"Upgrading pre 1.12 Android projects\" steps: import io.flutter.embedding.android.FlutterActivity in MainActivity, remove the old onCreate plugin registration, set android:name=\"${applicationName}\" on the application tag, and add \u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F> inside \u003Capplication>.",{"question":1340,"answer":1341},"Which Flutter version removed the v1 embedding?","Flutter 3.29. Flutter's breaking-change page says the removal landed in 3.28.0-0.1.pre and shipped in stable 3.29, which Flutter's release archive dates February 12, 2025.",{"question":1343,"answer":1344},"Why does a plugin fail with \"cannot find symbol\" PluginRegistry.Registrar?","The plugin usually still has a registerWith method that takes a PluginRegistry.Registrar, a v1 API removed in Flutter 3.29. Flutter's build output suggests running flutter pub upgrade to get a newer plugin version. If no fixed version exists, the method has to be removed from the plugin.",{"question":1346,"answer":1347},"Can I keep using the v1 embedding on an older Flutter version?","Flutter's breaking-change page says it was removed in 3.29, so earlier versions still have it. In my view, pinning an old Flutter only delays the fix. Newer plugin versions and store requirements move on, and for a standard flutter create project the migration changes two files.",{"readingTimeStats":1349},{"text":705,"minutes":1350,"time":1351,"words":1352},4.1,246000,820,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding",[715,714,1356],"how-to-debug-a-flutter-firebase-bug-2026",{"title":746,"description":1331},[1359,1361,1363,1365,1368,1371,1374],{"title":1360,"url":860},"Flutter docs, Removal of v1 Android embedding Java APIs (last updated July 31, 2026)",{"title":1362,"url":823},"Flutter docs, Android v1 embedding app and plugin creation deprecation",{"title":1364,"url":965},"Flutter on GitHub, Upgrading pre 1.12 Android projects",{"title":1366,"url":1367},"Flutter docs, Supporting the new Android plugins APIs","https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fplugin-api-migration",{"title":1369,"url":1370},"Flutter on GitHub, flutter_tools project.dart (embedding check)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fproject.dart",{"title":1372,"url":1373},"Flutter on GitHub, flutter_tools gradle_errors.dart (v1 embedding plugin handler)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fandroid\u002Fgradle_errors.dart",{"title":732,"url":94},"blog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding, flutter v1 embedding, flutter v2 embedding migration, flutterEmbedding meta-data, io.flutter.app.FlutterActivity, PluginRegistry.Registrar cannot find symbol, registerWith registrar flutter plugin, flutter 3.29 android build error, upgrading pre 1.12 android projects",[1378,1379,1380,1381,1382],"Flutter removed the Android v1 embedding in Flutter 3.29, released on February 12, 2025. Classes such as io.flutter.app.FlutterActivity, io.flutter.app.FlutterApplication and io.flutter.view.FlutterView no longer exist.","The Flutter tool treats an app as v1, and stops with \"Build failed due to use of deleted Android v1 embedding\", when its AndroidManifest.xml uses io.flutter.app.FlutterApplication or lacks \u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>.","The app fix is Flutter's own migration: change the FlutterActivity import, move custom channel setup into configureFlutterEngine, set android:name=\"${applicationName}\" and add the flutterEmbedding meta-data with value 2.","A plugin that still has a registerWith(PluginRegistry.Registrar) method fails to compile instead. Flutter's build output suggests flutter pub upgrade, and plugin authors should delete registerWith.","The v2 embedding arrived in Flutter 1.12 in December 2019, and flutter create stopped making v1 projects in Flutter 1.22, so, in my view, the apps hit now are mostly ones created before 2020 and not updated since.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F","XCzq_ukIlixYX4apwJmjPfdlWXhqHCbmPMl9c9Hexls",{"id":1386,"title":1387,"author":1388,"body":1390,"category":681,"createdAt":1854,"description":1855,"disclosure":684,"extension":685,"faq":1856,"howTo":684,"lastVerified":684,"location":702,"meta":1875,"navigation":308,"ogImage":684,"path":1881,"primaryKeyword":1882,"readingTime":711,"related":1883,"seo":1886,"sources":1887,"stem":1902,"tags":1903,"takeaways":1904,"updatedAt":1854,"url":1910,"__hash__":1911},"blog\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026.md","JCenter Shutdown: Fixing Old Android and Flutter Builds",{"name":7,"social":1389},{"twitter":9},{"type":11,"value":1391,"toc":1846},[1392,1407,1410,1415,1419,1544,1547,1549,1551,1587,1590,1594,1597,1757,1761,1825,1828,1833,1835,1844],[14,1393,1394,1397,1398,1076,1400,239,1403,1406],{},[17,1395,1396],{},"Bintray is gone and JCenter is now only a redirect to Maven Central, so an Android or Flutter project that still points at them can fail to build or fail to find some of its libraries."," Often the fix is short: replace ",[22,1399,640],{},[22,1401,1402],{},"mavenCentral()",[22,1404,1405],{},"google()",". The harder cases are old plugins that still declare JCenter and libraries that were never published anywhere else. Both are covered below.",[14,1408,1409],{},"If you landed here from an old Bintray link or a README that says to add JCenter, this is what changed and how to fix the build. The dates come from JFrog, Gradle and Android Developers, as listed in the sources. I tested the Bintray and JCenter addresses below myself on October 18, 2026.",[14,1411,1412,1414],{},[17,1413,37],{}," App369 is my studio. I fix and maintain Flutter and Android apps for a living, and the last section mentions what I sell. No company named here paid for a mention.",[40,1416,1418],{"id":1417},"what-happened-to-bintray-and-jcenter-and-when","What happened to Bintray and JCenter, and when",[45,1420,1421,1431],{},[48,1422,1423],{},[51,1424,1425,1427,1429],{},[54,1426,56],{},[54,1428,59],{},[54,1430,62],{},[64,1432,1433,1448,1465,1478,1495,1508,1526],{},[51,1434,1435,1438,1441],{},[69,1436,1437],{},"February 3, 2021",[69,1439,1440],{},"JFrog announces the end of Bintray, JCenter, GoCenter and ChartCenter",[69,1442,1443],{},[85,1444,1447],{"href":1445,"rel":1446},"https:\u002F\u002Fjfrog.com\u002Fblog\u002Finto-the-sunset-bintray-jcenter-gocenter-and-chartcenter\u002F",[89],"JFrog",[51,1449,1450,1453,1458],{},[69,1451,1452],{},"February 22, 2021",[69,1454,1455,1456],{},"Gradle tells users to replace JCenter with Maven Central and says Gradle 7.0 will deprecate ",[22,1457,640],{},[69,1459,1460],{},[85,1461,1464],{"href":1462,"rel":1463},"https:\u002F\u002Fblog.gradle.org\u002Fjcenter-shutdown",[89],"Gradle blog",[51,1466,1467,1470,1473],{},[69,1468,1469],{},"March 31, 2021",[69,1471,1472],{},"JCenter stops accepting new submissions",[69,1474,1475],{},[85,1476,1447],{"href":1445,"rel":1477},[89],[51,1479,1480,1485,1490],{},[69,1481,1482],{},[17,1483,1484],{},"May 1, 2021",[69,1486,1487],{},[17,1488,1489],{},"Bintray shuts down",[69,1491,1492],{},[85,1493,1447],{"href":1445,"rel":1494},[89],[51,1496,1497,1500,1503],{},[69,1498,1499],{},"2021 to 2024",[69,1501,1502],{},"JCenter stays up as a read-only repository",[69,1504,1505],{},[85,1506,1464],{"href":1462,"rel":1507},[89],[51,1509,1510,1515,1520],{},[69,1511,1512],{},[17,1513,1514],{},"August 15, 2024",[69,1516,1517],{},[17,1518,1519],{},"JCenter starts redirecting every request to Maven Central",[69,1521,1522],{},[85,1523,1447],{"href":1524,"rel":1525},"https:\u002F\u002Fjfrog.com\u002Fblog\u002Fjcenter-sunset\u002F",[89],[51,1527,1528,1531,1537],{},[69,1529,1530],{},"Gradle 9.0",[69,1532,1533,1534,1536],{},"Gradle removes the ",[22,1535,640],{}," method",[69,1538,1539],{},[85,1540,1543],{"href":1541,"rel":1542},"https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fuserguide\u002Fupgrading_major_version_9.html",[89],"Gradle docs",[14,1545,1546],{},"Android's JCenter migration page still says JCenter allows downloads of existing artifacts indefinitely. JFrog's 2024 post and Gradle's 9.0 upgrade guide both describe the redirect to Maven Central, and that redirect is what I saw when I tested it.",[153,1548,872],{"id":871},[14,1550,875],{},[161,1552,1553,1559,1568,1578],{},[164,1554,1555,1558],{},[17,1556,1557],{},"bintray.com"," did not load: the connection timed out.",[164,1560,1561,1564,1565,176],{},[17,1562,1563],{},"dl.bintray.com",", where many READMEs linked downloads and custom repositories, returned ",[17,1566,1567],{},"404",[164,1569,1570,1573,1574,1577],{},[17,1571,1572],{},"jcenter.bintray.com"," returned a ",[17,1575,1576],{},"301 redirect to repo1.maven.org",", Maven Central.",[164,1579,1580,1581,1584,1585,176],{},"A library that was only ever published on JCenter, ",[22,1582,1583],{},"org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.12",", followed the redirect to Maven Central and returned ",[17,1586,1567],{},[14,1588,1589],{},"So JCenter now works only for files that also exist on Maven Central. Anything else fails, sometimes with a confusing \"could not find\" error for a version you know used to exist.",[40,1591,1593],{"id":1592},"how-to-fix-the-build","How to fix the build",[14,1595,1596],{},"Work through these in order. In my experience, the first two fix many projects.",[550,1598,1599,1673,1682,1704,1734,1744],{},[164,1600,1601,1607,1608,1610,1611,1614,1615,239,1618,1621,1622,1625,1626,239,1628,1630,1631,1634,1635,1076,1637,1639,1640,1642,1643,518,1646,1648,1649],{},[17,1602,1603,1604,1606],{},"Replace ",[22,1605,640],{}," in your own build files."," In an Android project, look in ",[22,1609,521],{}," (or ",[22,1612,1613],{},"settings.gradle.kts",") under ",[22,1616,1617],{},"pluginManagement",[22,1619,1620],{},"dependencyResolutionManagement",", and in the top-level ",[22,1623,1624],{},"build.gradle"," under ",[22,1627,219],{},[22,1629,427],{},". In a Flutter app the same files are under ",[22,1632,1633],{},"android\u002F",". Replace ",[22,1636,640],{},[22,1638,1402],{},", and make sure ",[22,1641,1405],{}," is there too. Keep ",[22,1644,1645],{},"gradlePluginPortal()",[22,1647,1617],{}," if it is already there.",[245,1650,1652],{"className":247,"code":1651,"language":249,"meta":250,"style":250},"repositories {\n    google()\n    mavenCentral()\n}\n",[22,1653,1654,1659,1664,1669],{"__ignoreMap":250},[254,1655,1656],{"class":256,"line":257},[254,1657,1658],{},"repositories {\n",[254,1660,1661],{"class":256,"line":263},[254,1662,1663],{},"    google()\n",[254,1665,1666],{"class":256,"line":269},[254,1667,1668],{},"    mavenCentral()\n",[254,1670,1671],{"class":256,"line":275},[254,1672,356],{},[164,1674,1675,1678,1679,1681],{},[17,1676,1677],{},"Sync, then read the first error."," If it names a library that can't be found, go to step 4. If it mentions ",[22,1680,640],{}," and points at a file you don't own, go to step 3.",[164,1683,1684,1687,1688,1690,1691,1694,1695,1697,1698,518,1701,1703],{},[17,1685,1686],{},"Fix plugins and libraries that still declare JCenter."," On Gradle 9 the build stops at any ",[22,1689,640],{}," call in a build file Gradle runs, and that includes Flutter plugins, which are built as part of your app. So in a Flutter app the culprit is usually an old plugin: check the plugin's changelog, then raise its version in ",[22,1692,1693],{},"pubspec.yaml"," and run ",[22,1696,1147],{},". If the plugin is unmaintained, look for a maintained fork or a replacement plugin. Editing files in the pub cache is fragile: the change doesn't reach CI or other machines, and it is lost when the cache is cleared or repaired. A fork referenced from ",[22,1699,1700],{},"dependency_overrides",[22,1702,1693],{}," is the safer way to patch a plugin. If you can't upgrade the plugin yet, staying on Gradle 8 buys time, but it doesn't fix the underlying problem.",[164,1705,1706,1709,1710,1715,1716,1721,1722,1725,1726,1729,1730,1733],{},[17,1707,1708],{},"Find a new home for JCenter-only libraries."," Search ",[85,1711,1714],{"href":1712,"rel":1713},"https:\u002F\u002Fcentral.sonatype.com\u002F",[89],"Maven Central"," for the library. Many moved there under the same group ID, sometimes with a newer version only. If the source is on GitHub, ",[85,1717,1720],{"href":1718,"rel":1719},"https:\u002F\u002Fjitpack.io\u002F",[89],"JitPack"," can build it from a release tag: add ",[22,1723,1724],{},"maven { url 'https:\u002F\u002Fjitpack.io' }"," and use ",[22,1727,1728],{},"com.github.\u003Cuser>:\u003Crepo>:\u003Ctag>"," coordinates. JitPack builds the code itself, so check that the tag is the version you expect. As a last resort, put the JAR or AAR in a ",[22,1731,1732],{},"libs\u002F"," folder and depend on it as a local file. That works in the app module; in a plugin or library module, use a file-based Maven repository instead. A local file also drops the library's own dependencies, so add those yourself, and note the library as something to replace.",[164,1735,1736,1739,1740,1743],{},[17,1737,1738],{},"Check for other dead repositories."," Remove any ",[22,1741,1742],{},"maven { url \"https:\u002F\u002Fdl.bintray.com\u002F...\" }"," lines. Each one is a dead address that slows down or breaks resolution.",[164,1745,1746,1749,1750,1753,1754,1756],{},[17,1747,1748],{},"Build from a clean state."," Run the build with an empty Gradle cache (a fresh ",[22,1751,1752],{},"GRADLE_USER_HOME"," or a clean CI runner, plus ",[22,1755,1143],{}," in a Flutter app) before you call it fixed. A cache on your own machine can hide a library that no longer downloads anywhere.",[40,1758,1760],{"id":1759},"when-its-more-than-a-one-line-change","When it's more than a one-line change",[45,1762,1763,1776],{},[48,1764,1765],{},[51,1766,1767,1770,1773],{},[54,1768,1769],{},"What you see",[54,1771,1772],{},"What it usually means",[54,1774,1775],{},"Usual fix",[64,1777,1778,1792,1803,1814],{},[51,1779,1780,1786,1789],{},[69,1781,1782,1783,1785],{},"The build fails on ",[22,1784,640],{}," after a Gradle upgrade",[69,1787,1788],{},"A build file, yours or a plugin's, still calls the removed method",[69,1790,1791],{},"Replace it in your files, and upgrade the plugin",[51,1793,1794,1797,1800],{},[69,1795,1796],{},"\"Could not find\" for an old version of a library",[69,1798,1799],{},"That version only existed on JCenter",[69,1801,1802],{},"Use a version that is on Maven Central, or JitPack",[51,1804,1805,1808,1811],{},[69,1806,1807],{},"A README says to add a dl.bintray.com repository",[69,1809,1810],{},"The project published only through Bintray",[69,1812,1813],{},"Check Maven Central and GitHub releases for the same project",[51,1815,1816,1819,1822],{},[69,1817,1818],{},"The project hasn't been built in years",[69,1820,1821],{},"JCenter is one of several outdated pieces",[69,1823,1824],{},"Upgrade Gradle, Android Gradle Plugin and Kotlin step by step",[14,1826,1827],{},"A project that has sat untouched since 2020 or 2021 usually needs more than the repository change: newer Gradle and Android Gradle Plugin versions, a newer Kotlin, and a recent target API level, because Google Play requires updates to meet its current target API requirement (check the deadline in Play Console). Do those one at a time and build after each, so you know which change broke what.",[14,1829,1830,1831,176],{},"For the iOS side of the same problem, see ",[85,1832,1315],{"href":1314},[40,1834,649],{"id":648},[14,1836,1837,1838,1840,1841,1843],{},"If the build still fails after these steps, or the project is old enough that JCenter is only the first problem, the ",[85,1839,656],{"href":655}," is two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days. If you're not sure it fits, ",[85,1842,661],{"href":660}," of the error and the project's age, and I'll tell you where I'd start.",[663,1845,665],{},{"title":250,"searchDepth":263,"depth":263,"links":1847},[1848,1851,1852,1853],{"id":1417,"depth":263,"text":1418,"children":1849},[1850],{"id":871,"depth":269,"text":872},{"id":1592,"depth":263,"text":1593},{"id":1759,"depth":263,"text":1760},{"id":648,"depth":263,"text":649},"2026-10-18T18:00:00.000Z","Bintray shut down on May 1, 2021, JCenter has redirected to Maven Central since August 15, 2024, and Gradle 9 removed jcenter(). How to fix an old Android or Flutter build that still points at them, with every address checked on October 18, 2026.",[1857,1860,1863,1866,1869,1872],{"question":1858,"answer":1859},"Is JCenter still available?","Not as its own repository. JFrog stopped new submissions on March 31, 2021, and on August 15, 2024 it started redirecting all JCenter requests to Maven Central. Anything that exists on Maven Central still downloads, and anything that only existed on JCenter now returns 404.",{"question":1861,"answer":1862},"What replaced JCenter?","Maven Central, through mavenCentral() in Gradle. Android Gradle Plugin and AndroidX libraries come from Google's Maven repository, through google(). Many Android and Flutter projects need nothing else.",{"question":1864,"answer":1865},"Why does my build fail on jcenter() after upgrading Gradle?","Gradle removed the jcenter() method in Gradle 9.0, after deprecating it in Gradle 7.0. Any build file that still calls it, including one inside an old plugin or library, stops the build. Replace it with mavenCentral(), or upgrade the plugin that declares it.",{"question":1867,"answer":1868},"What happened to dl.bintray.com links?","Bintray shut down on May 1, 2021. dl.bintray.com returned 404 when I tested it on October 18, 2026, and bintray.com itself did not load. If a README tells you to download a file or add a repository from Bintray, look for the same project on Maven Central or GitHub releases.",{"question":1870,"answer":1871},"How do I fix a Flutter Android build that still uses jcenter()?","Check android\u002Fbuild.gradle and android\u002Fsettings.gradle in your app first, and replace jcenter() with mavenCentral(). If the error points into a plugin, upgrade that plugin with flutter pub upgrade or a newer version in pubspec.yaml. Plugins that are no longer maintained may need a fork or a replacement.",{"question":1873,"answer":1874},"What if a library I need was only on JCenter?","Search Maven Central for a newer version under the same or a new group ID. If the source is on GitHub, JitPack can build it from a tag. As a last resort, keep the JAR or AAR file in your project and depend on it locally, and plan to replace the library.",{"readingTimeStats":1876},{"text":1877,"minutes":1878,"time":1879,"words":1880},"6 min read",5.165,309900,1033,"\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026","jcenter shutdown",[715,1884,1885],"mobile-app-beta-testing-crash-reporting-tools-2026","parse-kinvey-backend-as-a-service-alternatives-2026",{"title":1387,"description":1855},[1888,1890,1892,1894,1896,1899,1901],{"title":1889,"url":1445},"JFrog, \"Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter\" (February 3, 2021)",{"title":1891,"url":1524},"JFrog, \"JCenter Sunset on August 15th, 2024\" (July 2, 2024)",{"title":1893,"url":1462},"Gradle blog, \"JCenter shutdown impact on Gradle builds\" (February 22, 2021)",{"title":1895,"url":1541},"Gradle, upgrading to Gradle 9.0 (removal of jcenter())",{"title":1897,"url":1898},"Android Developers, JCenter migration","https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Fjcenter-migration",{"title":1900,"url":1712},"Maven Central search",{"title":1720,"url":1718},"blog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026","jcenter shutdown, bintray shut down, jcenter alternative, jcenter deprecated, replace jcenter with mavenCentral, could not find method jcenter, gradle 9 jcenter, dl.bintray.com 404, flutter android build failed jcenter, old android project build",[1905,1906,1907,1908,1909],"JFrog announced on February 3, 2021 that it was shutting down Bintray, JCenter, GoCenter and ChartCenter. Bintray stopped on May 1, 2021, and JCenter has redirected to Maven Central since August 15, 2024.","Gradle deprecated jcenter() in Gradle 7.0 and removed it in Gradle 9.0. On Gradle 9, any build file that still calls jcenter() fails before it downloads anything.","On October 18, 2026, bintray.com did not load, dl.bintray.com returned 404, and jcenter.bintray.com redirected to repo1.maven.org. A library that was only ever published on JCenter now returns 404.","The usual fix: replace jcenter() with mavenCentral() and google(), in your own build files and in any old plugin that still declares it.","If a dependency was never moved to Maven Central, upgrade to a maintained version, build it from source through JitPack, or keep a copy of the file in your project.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026\u002F","bKylwzmBGF-n6fTjSzsXn1C7b4JI02N9EWDfcL2GmNI",{"id":1913,"title":1914,"author":1915,"body":1917,"category":681,"createdAt":2419,"description":2420,"disclosure":684,"extension":685,"faq":684,"howTo":684,"lastVerified":684,"location":702,"meta":2421,"navigation":308,"ogImage":684,"path":2426,"primaryKeyword":684,"readingTime":711,"related":684,"seo":2427,"sources":684,"stem":2428,"tags":2429,"takeaways":684,"updatedAt":2419,"url":2430,"__hash__":2431},"blog\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026.md","Flutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)",{"name":7,"social":1916},{"twitter":9},{"type":11,"value":1918,"toc":2402},[1919,1925,1936,1940,1943,1976,1979,2036,2040,2070,2074,2083,2108,2112,2118,2162,2239,2256,2260,2272,2304,2308,2317,2320,2324,2327,2331,2337,2341,2345,2359,2363,2375,2379,2382,2386,2392,2396,2399],[14,1920,1921,1924],{},[17,1922,1923],{},"When a Flutter iOS build breaks right after an upgrade, the cause is almost always one of four things: a stale CocoaPods lock, a deployment target that is too low, FlutterFire plugins on mismatched versions, or an Xcode that no longer matches the SDKs you depend on."," The error Xcode shows first is rarely the real one. This guide is the order to work in, from reading the actual failure to the fixes that cover most upgrade breakages.",[14,1926,1927,1928,1931,1932,176],{},"It is the same approach Simon uses on Workspace369, his production Flutter and Firebase SaaS, and it is the iOS build part of App369's ",[85,1929,1930],{"href":655},"fixed-price Flutter & Firebase Fix Ticket",". For the wider method, see ",[85,1933,1935],{"href":1934},"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","how to debug a Flutter and Firebase bug",[40,1937,1939],{"id":1938},"step-1-read-the-real-error","Step 1: Read the real error",[14,1941,1942],{},"Don't start by deleting folders. First get the full output.",[550,1944,1945,1952,1965],{},[164,1946,1947,1948,1951],{},"Run ",[22,1949,1950],{},"flutter doctor -v"," and fix anything it flags under Xcode or CocoaPods.",[164,1953,1947,1954,1610,1957,1960,1961,1964],{},[22,1955,1956],{},"flutter build ios -v",[22,1958,1959],{},"flutter run -v",") and read from the first line that says ",[22,1962,1963],{},"error:",", not the last line. The final \"Xcode build failed\" message is a summary.",[164,1966,1967,1968,1971,1972,1975],{},"If the failure happens in Xcode itself, open ",[22,1969,1970],{},"ios\u002FRunner.xcworkspace"," (never ",[22,1973,1974],{},"Runner.xcodeproj",") and use the Report navigator to open the build log. Filter for errors and read the first one.",[14,1977,1978],{},"Where the error appears tells you which step failed:",[45,1980,1981,1991],{},[48,1982,1983],{},[51,1984,1985,1988],{},[54,1986,1987],{},"Where it fails",[54,1989,1990],{},"Likely area",[64,1992,1993,2004,2012,2020,2028],{},[51,1994,1995,2001],{},[69,1996,1997,2000],{},[22,1998,1999],{},"pod install"," output, before compiling",[69,2002,2003],{},"CocoaPods resolution, Podfile, specs",[51,2005,2006,2009],{},[69,2007,2008],{},"\"Compiling for iOS X, but module requires iOS Y\"",[69,2010,2011],{},"Deployment target too low",[51,2013,2014,2017],{},[69,2015,2016],{},"Swift or Objective-C compile errors inside a plugin",[69,2018,2019],{},"Plugin and Xcode or SDK version mismatch",[51,2021,2022,2025],{},[69,2023,2024],{},"Linking or \"framework not found\"",[69,2026,2027],{},"Stale Pods or build cache",[51,2029,2030,2033],{},[69,2031,2032],{},"Code signing messages",[69,2034,2035],{},"Signing and provisioning, covered at the end",[40,2037,2039],{"id":2038},"step-2-check-your-xcode-and-cocoapods-versions","Step 2: Check your Xcode and CocoaPods versions",[14,2041,2042,2043,2048,2049,239,2052,2055,2056,2061,2062,2065,2066,2069],{},"Upgrades often fail because the Firebase SDK moved its minimum requirements. The ",[85,2044,2047],{"href":2045,"rel":2046},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fios\u002Finstallation-methods",[89],"Firebase Apple platforms installation docs"," list the current Xcode requirement and say the CocoaPods distribution needs CocoaPods 1.12.0 or higher. Check yours with ",[22,2050,2051],{},"pod --version",[22,2053,2054],{},"xcodebuild -version",", and update if either is below what your plugins need. Flutter's own ",[85,2057,2060],{"href":2058,"rel":2059},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fios\u002Fsetup",[89],"iOS setup page"," covers pointing the command-line tools at the right Xcode (",[22,2063,2064],{},"xcode-select",") and accepting licenses (",[22,2067,2068],{},"sudo xcodebuild -license","); a second Xcode installed on the machine is a common reason a build uses the wrong toolchain.",[40,2071,2073],{"id":2072},"step-3-fix-the-ios-deployment-target","Step 3: Fix the iOS deployment target",[14,2075,2076,2077,2082],{},"A plugin upgrade can raise the minimum iOS version. The ",[85,2078,2081],{"href":2079,"rel":2080},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fflutter\u002Fsetup",[89],"Firebase Flutter setup page"," lists iOS 15 or later as the Apple requirement for the FlutterFire plugins. Check three places and make them agree:",[161,2084,2085,2095,2098],{},[164,2086,2087,2090,2091,2094],{},[22,2088,2089],{},"ios\u002FPodfile",": the line ",[22,2092,2093],{},"platform :ios, '15.0'"," (use the minimum your plugins ask for; if the line is commented out, uncomment it).",[164,2096,2097],{},"Xcode: Runner target, General tab, \"Minimum Deployments\".",[164,2099,880,2100,2103,2104,2107],{},[22,2101,2102],{},"post_install"," block in the Podfile, if you have one that sets ",[22,2105,2106],{},"IPHONEOS_DEPLOYMENT_TARGET"," on every pod. A value there that is lower than a pod's own minimum produces the \"module requires iOS Y\" error.",[40,2109,2111],{"id":2110},"step-4-refresh-cocoapods-then-clean-it-out","Step 4: Refresh CocoaPods, then clean it out",[14,2113,2114,2115,888],{},"Work from least to most destructive. Run these inside the ",[22,2116,2117],{},"ios",[550,2119,2120,2128,2156],{},[164,2121,2122,2127],{},[17,2123,2124],{},[22,2125,2126],{},"pod install --repo-update"," refreshes the local spec repository and then installs. It is the right first move after upgrading a plugin, because a stale local spec list can't find the new version.",[164,2129,2130,2135,2136,2139,2140,2145,2146,2148,2149,2151,2152,2155],{},[17,2131,2132],{},[22,2133,2134],{},"pod update PODNAME"," if one pod needs to move to a newer version than ",[22,2137,2138],{},"Podfile.lock"," allows. As the ",[85,2141,2144],{"href":2142,"rel":2143},"https:\u002F\u002Fguides.cocoapods.org\u002Fusing\u002Fpod-install-vs-update.html",[89],"CocoaPods guide"," explains, ",[22,2147,1999],{}," respects the versions in ",[22,2150,2138],{},", while ",[22,2153,2154],{},"pod update"," ignores the lock and fetches the newest version your constraints allow.",[164,2157,2158,2161],{},[17,2159,2160],{},"A clean reinstall."," If it is still broken, remove the generated pieces and rebuild them:",[245,2163,2167],{"className":2164,"code":2165,"language":2166,"meta":250,"style":250},"language-bash shiki shiki-themes github-light github-dark","cd ios\nrm -rf Pods Podfile.lock\ncd ..\nflutter clean\nflutter pub get\ncd ios && pod install --repo-update\n","bash",[22,2168,2169,2179,2194,2201,2209,2219],{"__ignoreMap":250},[254,2170,2171,2175],{"class":256,"line":257},[254,2172,2174],{"class":2173},"sj4cs","cd",[254,2176,2178],{"class":2177},"sZZnC"," ios\n",[254,2180,2181,2185,2188,2191],{"class":256,"line":263},[254,2182,2184],{"class":2183},"sScJk","rm",[254,2186,2187],{"class":2173}," -rf",[254,2189,2190],{"class":2177}," Pods",[254,2192,2193],{"class":2177}," Podfile.lock\n",[254,2195,2196,2198],{"class":256,"line":269},[254,2197,2174],{"class":2173},[254,2199,2200],{"class":2177}," ..\n",[254,2202,2203,2206],{"class":256,"line":275},[254,2204,2205],{"class":2183},"flutter",[254,2207,2208],{"class":2177}," clean\n",[254,2210,2211,2213,2216],{"class":256,"line":281},[254,2212,2205],{"class":2183},[254,2214,2215],{"class":2177}," pub",[254,2217,2218],{"class":2177}," get\n",[254,2220,2221,2223,2226,2230,2233,2236],{"class":256,"line":287},[254,2222,2174],{"class":2173},[254,2224,2225],{"class":2177}," ios",[254,2227,2229],{"class":2228},"sVt8B"," && ",[254,2231,2232],{"class":2183},"pod",[254,2234,2235],{"class":2177}," install",[254,2237,2238],{"class":2173}," --repo-update\n",[14,2240,2241,2242,2245,2246,2248,2249,2251,2252,2255],{},"Deleting ",[22,2243,2244],{},"Pods"," is safe because it is generated. Deleting ",[22,2247,2138],{}," is also safe for a one-off repair, but it lets every pod re-resolve, so you may get newer versions than before. The CocoaPods guide recommends committing ",[22,2250,2138],{},", so review the diff after the reinstall and commit the new one once the build passes. If you only suspect Xcode's cache, you can also delete ",[22,2253,2254],{},"~\u002FLibrary\u002FDeveloper\u002FXcode\u002FDerivedData","; it only holds build products, and Xcode recreates it.",[40,2257,2259],{"id":2258},"step-5-upgrade-the-flutterfire-plugins-together","Step 5: Upgrade the FlutterFire plugins together",[14,2261,2262,91,2265,91,2268,2271],{},[22,2263,2264],{},"firebase_core",[22,2266,2267],{},"cloud_firestore",[22,2269,2270],{},"firebase_auth"," and the other FlutterFire plugins are versioned together and each one depends on a specific Firebase SDK release. Upgrading one and leaving the others behind is a common source of build errors, including duplicate or conflicting native pods.",[161,2273,2274,2283,2298],{},[164,2275,1947,2276,2279,2280,2282],{},[22,2277,2278],{},"flutter pub outdated"," to see the gap, then upgrade the whole FlutterFire family in one ",[22,2281,1693],{}," change.",[164,2284,2285,2286,2289,2290,2294,2295,176],{},"Re-run ",[22,2287,2288],{},"flutterfire configure"," if you added a Firebase service or platform; the ",[85,2291,2293],{"href":2079,"rel":2292},[89],"Firebase docs"," say re-running it keeps your configuration current. Install the tool with ",[22,2296,2297],{},"dart pub global activate flutterfire_cli",[164,2299,2300,2301,2303],{},"If you pin a Firebase SDK version in the Podfile, remove the pin and let the plugins choose it. A manual pin that disagrees with ",[22,2302,2264],{}," is a classic conflict.",[40,2305,2307],{"id":2306},"step-6-know-that-cocoapods-is-being-phased-out","Step 6: Know that CocoaPods is being phased out",[14,2309,2310,2311,2316],{},"This matters for upgrades in late 2026. Firebase's docs warn that it will stop publishing new versions to CocoaPods in October 2026 and recommend Swift Package Manager. Flutter's ",[85,2312,2315],{"href":2313,"rel":2314},"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-app-developers",[89],"Swift Package Manager page"," says SwiftPM support is on by default as of Flutter 3.44, that Flutter falls back to CocoaPods for plugins that don't support it yet, and that the CocoaPods registry becomes read-only on December 2, 2026.",[14,2318,2319],{},"In practice: after a Flutter upgrade, the first build may modify your Xcode project to add SwiftPM integration. Commit that change rather than reverting it, and if a build error mentions a Swift package, read it the same way as a pod error: find the first real failure.",[40,2321,2323],{"id":2322},"step-7-signing-errors-briefly","Step 7: Signing errors, briefly",[14,2325,2326],{},"If it compiles but fails to archive, it is usually signing. In Xcode, open the Runner target, Signing & Capabilities, and check that a team is selected, the bundle identifier matches your App Store Connect app, and \"Automatically manage signing\" is on unless you manage profiles yourself. Flutter's iOS setup page notes a signed developer certificate is needed even for device testing.",[40,2328,2330],{"id":2329},"when-to-get-help","When to get help",[14,2332,2333,2334,2336],{},"If an iOS build has eaten more than a day and the steps above haven't moved it, App369's ",[85,2335,1930],{"href":655}," covers build failures after a Flutter or FlutterFire upgrade. The $450 Diagnosis delivers the root cause with evidence and a fixed repair quote within 3 business days, and the $450 is credited toward the fix. The $1,200 Fix delivers the scoped defect as a pull request with a regression test within 5 business days. App Store approval isn't something anyone can guarantee; the ticket covers the code defect itself.",[40,2338,2340],{"id":2339},"frequently-asked-questions","Frequently Asked Questions",[153,2342,2344],{"id":2343},"why-did-my-flutter-ios-build-fail-after-upgrading-flutter","Why did my Flutter iOS build fail after upgrading Flutter?",[14,2346,2347,2348,2350,2351,2353,2354,2356,2357,176],{},"Most often the Podfile or Xcode project still has an old iOS deployment target, ",[22,2349,2138],{}," pins old pod versions, or plugin versions no longer match each other. Run ",[22,2352,1956],{},", find the first ",[22,2355,1963],{}," line, then work through the deployment target and ",[22,2358,2126],{},[153,2360,2362],{"id":2361},"is-it-safe-to-delete-podfilelock-and-the-pods-folder","Is it safe to delete Podfile.lock and the Pods folder?",[14,2364,2365,2366,2368,2369,2371,2372,2374],{},"Yes, for a repair. ",[22,2367,2244],{}," is generated and ",[22,2370,2138],{}," is rebuilt by ",[22,2373,1999],{},". The catch is that pods may resolve to newer versions, so check the new lock file and commit it once the build works.",[153,2376,2378],{"id":2377},"what-does-pod-install-repo-update-do","What does \"pod install --repo-update\" do?",[14,2380,2381],{},"It refreshes CocoaPods' local list of available pod versions before installing. Use it when a newly upgraded plugin needs a pod version your machine's spec list doesn't know about yet.",[153,2383,2385],{"id":2384},"should-i-upgrade-only-one-flutterfire-plugin","Should I upgrade only one FlutterFire plugin?",[14,2387,2388,2389,2391],{},"Avoid it. FlutterFire plugins depend on matching Firebase SDK releases, so upgrade ",[22,2390,2264],{}," and the other FlutterFire packages together and rebuild.",[153,2393,2395],{"id":2394},"do-i-need-to-switch-from-cocoapods-to-swift-package-manager","Do I need to switch from CocoaPods to Swift Package Manager?",[14,2397,2398],{},"Flutter handles it for you in recent versions and falls back to CocoaPods for plugins that don't support SwiftPM yet. Given Firebase's announced CocoaPods change, keep your plugins current rather than pinning old versions.",[663,2400,2401],{},"html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":250,"searchDepth":263,"depth":263,"links":2403},[2404,2405,2406,2407,2408,2409,2410,2411,2412],{"id":1938,"depth":263,"text":1939},{"id":2038,"depth":263,"text":2039},{"id":2072,"depth":263,"text":2073},{"id":2110,"depth":263,"text":2111},{"id":2258,"depth":263,"text":2259},{"id":2306,"depth":263,"text":2307},{"id":2322,"depth":263,"text":2323},{"id":2329,"depth":263,"text":2330},{"id":2339,"depth":263,"text":2340,"children":2413},[2414,2415,2416,2417,2418],{"id":2343,"depth":269,"text":2344},{"id":2361,"depth":269,"text":2362},{"id":2377,"depth":269,"text":2378},{"id":2384,"depth":269,"text":2385},{"id":2394,"depth":269,"text":2395},"2026-10-12T18:00:00.000Z","Flutter iOS build failing after upgrading Flutter, FlutterFire or Xcode? How to read the real error, then fix CocoaPods, deployment target and plugin version mismatches.",{"readingTimeStats":2422},{"text":1877,"minutes":2423,"time":2424,"words":2425},5.995,359700,1199,"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026",{"title":1914,"description":2420},"blog\u002Fflutter-ios-build-failed-after-upgrade-2026","flutter ios build failed, cocoapods error, pod install failed, flutterfire upgrade, xcode build error, flutter build ios, firebase ios","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","j_nFje3qmyZUdc4vyGtG-sRzwIjhUzh5-9fXsxoyaZA",[2433,2435,2436,2439,2440,2443],{"keyword":5,"url":741,"title":5,"relevance":2434},73,{"keyword":746,"url":1383,"title":746,"relevance":382},{"keyword":2437,"url":2438,"title":2437,"relevance":312},"goo.gl Shut Down: Which Google Short Links Still Work in 2026","https:\u002F\u002Fapp369.com\u002Fblog\u002Fgoogle-url-shortener-goo-gl-shut-down-2026\u002F",{"keyword":1387,"url":1910,"title":1387,"relevance":305},{"keyword":2441,"url":2442,"title":2441,"relevance":305},"Google Sign-In for Android Is Deprecated: Moving to Credential Manager","https:\u002F\u002Fapp369.com\u002Fblog\u002Fgoogle-sign-in-android-deprecated-credential-manager-2026\u002F",{"keyword":2444,"url":2445,"title":2444,"relevance":299},"Google Play Requires Target API 36: The Android 16 Update","https:\u002F\u002Fapp369.com\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026\u002F",1792347286595]