[{"data":1,"prerenderedAt":2178},["ShallowReactive",2],{"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F":3,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F-related":704,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F-resources":2161},{"id":4,"title":5,"author":6,"body":10,"category":640,"createdAt":641,"description":642,"disclosure":643,"extension":644,"faq":645,"howTo":643,"lastVerified":643,"location":661,"meta":662,"navigation":313,"ogImage":643,"path":668,"primaryKeyword":669,"readingTime":670,"related":671,"seo":675,"sources":676,"stem":694,"tags":695,"takeaways":696,"updatedAt":641,"url":702,"__hash__":703},"blog\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026.md","Flutter \"Deleted Android v1 Embedding\" Build Error: The Fix",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":631},"minimark",[13,45,52,58,63,151,154,159,162,193,197,208,241,244,248,260,450,458,549,563,567,577,606,610,627],[14,15,16,25,26,29,30,33,34,37,38,33,41,44],"p",{},[17,18,19,20,24],"strong",{},"If ",[21,22,23],"code",{},"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 ",[21,27,28],{},"flutter create",", Flutter's guide changes two files: ",[21,31,32],{},"MainActivity"," and ",[21,35,36],{},"AndroidManifest.xml",". Custom channel code or a splash screen adds a little more. If the build instead fails inside a plugin with ",[21,39,40],{},"cannot find symbol",[21,42,43],{},"PluginRegistry.Registrar",", the plugin is the problem, and a newer version of it usually fixes it.",[14,46,47,48,51],{},"If you landed here from an old link to Flutter's \"Upgrading pre 1.12 Android projects\" wiki page or an old ",[21,49,50],{},"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,53,54,57],{},[17,55,56],{},"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.",[59,60,62],"h2",{"id":61},"what-happened-to-the-v1-embedding-and-when","What happened to the v1 embedding, and when",[64,65,66,82],"table",{},[67,68,69],"thead",{},[70,71,72,76,79],"tr",{},[73,74,75],"th",{},"Date",[73,77,78],{},"What happened",[73,80,81],{},"Source",[83,84,85,113,129],"tbody",{},[70,86,87,91,98],{},[88,89,90],"td",{},"December 11, 2019",[88,92,93,94,97],{},"Flutter 1.12 reaches stable with the v2 Android embedding (",[21,95,96],{},"io.flutter.embedding",")",[88,99,100,107,108],{},[101,102,106],"a",{"href":103,"rel":104},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fandroid-v1-embedding-create-deprecation",[105],"nofollow","Flutter deprecation page",", ",[101,109,112],{"href":110,"rel":111},"https:\u002F\u002Fstorage.googleapis.com\u002Fflutter_infra_release\u002Freleases\u002Freleases_macos.json",[105],"release archive",[70,114,115,118,124],{},[88,116,117],{},"October 1, 2020",[88,119,120,121,123],{},"Flutter 1.22: ",[21,122,28],{}," only makes v2 apps and plugins. Existing v1 apps keep working, but get a migration warning when they use plugins",[88,125,126],{},[101,127,106],{"href":103,"rel":128},[105],[70,130,131,136,141],{},[88,132,133],{},[17,134,135],{},"February 12, 2025",[88,137,138],{},[17,139,140],{},"Flutter 3.29 removes the v1 embedding Java classes",[88,142,143,107,148],{},[101,144,147],{"href":145,"rel":146},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fv1-android-embedding",[105],"Flutter removal page",[101,149,112],{"href":110,"rel":150},[105],[14,152,153],{},"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.",[155,156,158],"h3",{"id":157},"what-the-old-addresses-do-today","What the old addresses do today",[14,160,161],{},"Checked on October 18, 2026:",[163,164,165,177,187],"ul",{},[166,167,168,169,172,173,176],"li",{},"The ",[17,170,171],{},"\"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 ",[21,174,175],{},"docs"," folder.",[166,178,179,182,183,186],{},[17,180,181],{},"flutter.dev\u002Fgo\u002Fandroid-project-migration"," now redirects to Flutter's ",[17,184,185],{},"AndroidX migration"," page, which doesn't cover the v1 embedding. The embedding steps are in the repository doc above.",[166,188,189,192],{},[17,190,191],{},"flutter.dev\u002Fgo\u002Fandroid-plugin-migration"," redirects to \"Supporting the new Android plugins APIs\", which is still the right page for plugin authors.",[59,194,196],{"id":195},"why-flutter-says-your-app-is-v1","Why Flutter says your app is v1",[14,198,199,200,203,204,207],{},"The check is in the Flutter tool's ",[21,201,202],{},"project.dart",". It reads ",[21,205,206],{},"android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml"," and treats the app as v1 when:",[163,209,210,221,231,238],{},[166,211,212,213,216,217,220],{},"the ",[21,214,215],{},"\u003Capplication>"," tag has ",[21,218,219],{},"android:name=\"io.flutter.app.FlutterApplication\"",", or",[166,222,223,224,227,228,220],{},"there is a ",[21,225,226],{},"flutterEmbedding"," meta-data tag with value ",[21,229,230],{},"1",[166,232,233,234,237],{},"there is no ",[21,235,236],{},"\u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>"," at all, or",[166,239,240],{},"the manifest file is missing.",[14,242,243],{},"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.",[59,245,247],{"id":246},"fixing-the-app","Fixing the app",[14,249,250,251,256,257,259],{},"These are the steps from Flutter's ",[101,252,255],{"href":253,"rel":254},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fdocs\u002Fplatforms\u002Fandroid\u002FUpgrading-pre-1.12-Android-projects.md",[105],"Upgrading pre 1.12 Android projects"," guide, for a project made with ",[21,258,28],{},".",[261,262,263,335,364,379,410,432],"ol",{},[166,264,265,270,271,274,275,278,279,282,283,286,287,290,291,321,324,325,328,329,33,332,259],{},[17,266,267,268,259],{},"Update ",[21,269,32],{}," Change ",[21,272,273],{},"import io.flutter.app.FlutterActivity"," to ",[21,276,277],{},"import io.flutter.embedding.android.FlutterActivity"," and delete the ",[21,280,281],{},"onCreate"," override that calls ",[21,284,285],{},"GeneratedPluginRegistrant.registerWith(this)",". The new ",[21,288,289],{},"FlutterActivity"," registers plugins itself.",[292,293,298],"pre",{"className":294,"code":295,"language":296,"meta":297,"style":297},"language-kotlin shiki shiki-themes github-light github-dark","import io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n","kotlin","",[21,299,300,308,315],{"__ignoreMap":297},[301,302,305],"span",{"class":303,"line":304},"line",1,[301,306,307],{},"import io.flutter.embedding.android.FlutterActivity\n",[301,309,311],{"class":303,"line":310},2,[301,312,314],{"emptyLinePlaceholder":313},true,"\n",[301,316,318],{"class":303,"line":317},3,[301,319,320],{},"class MainActivity: FlutterActivity()\n",[322,323],"br",{},"If your file is ",[21,326,327],{},"MainActivity.java",", the guide's result is the same: ",[21,330,331],{},"import io.flutter.embedding.android.FlutterActivity;",[21,333,334],{},"public class MainActivity extends FlutterActivity {}",[166,336,337,340,341,343,344,347,348,351,352,355,356,359,360,363],{},[17,338,339],{},"Move any platform channel code."," If ",[21,342,281],{}," also set up a ",[21,345,346],{},"MethodChannel",", move it into a ",[21,349,350],{},"configureFlutterEngine(flutterEngine)"," override, and use ",[21,353,354],{},"flutterEngine.getDartExecutor().getBinaryMessenger()"," instead of ",[21,357,358],{},"getFlutterView()",". The guide's example also calls ",[21,361,362],{},"GeneratedPluginRegistrant.registerWith(flutterEngine)"," at the start of that override.",[166,365,366,369,370,372,373,375,376,259],{},[17,367,368],{},"Fix the application tag."," In ",[21,371,36],{},", replace ",[21,374,219],{}," with ",[21,377,378],{},"android:name=\"${applicationName}\"",[166,380,381,384,385,387,388],{},[17,382,383],{},"Declare the v2 embedding."," Add this inside ",[21,386,215],{},":",[292,389,393],{"className":390,"code":391,"language":392,"meta":297,"style":297},"language-xml shiki shiki-themes github-light github-dark","\u003Cmeta-data\n    android:name=\"flutterEmbedding\"\n    android:value=\"2\" \u002F>\n","xml",[21,394,395,400,405],{"__ignoreMap":297},[301,396,397],{"class":303,"line":304},[301,398,399],{},"\u003Cmeta-data\n",[301,401,402],{"class":303,"line":310},[301,403,404],{},"    android:name=\"flutterEmbedding\"\n",[301,406,407],{"class":303,"line":317},[301,408,409],{},"    android:value=\"2\" \u002F>\n",[166,411,412,415,416,419,420,423,424,427,428,431],{},[17,413,414],{},"Update the splash screen if you had one."," Remove meta-data named ",[21,417,418],{},"io.flutter.app.android.SplashScreenUntilFirstFrame",". The guide shows the replacement: a ",[21,421,422],{},"LaunchTheme"," and a ",[21,425,426],{},"NormalTheme"," in ",[21,429,430],{},"styles.xml",", set on the activity.",[166,433,434,437,438,441,442,445,446,449],{},[17,435,436],{},"Rebuild."," The guide says the app should then build as normal, for example with ",[21,439,440],{},"flutter build apk",". My advice: run ",[21,443,444],{},"flutter clean"," first, and ",[21,447,448],{},"flutter pub upgrade"," too, because a project this old usually has plugins that are out of date as well.",[14,451,452,453,457],{},"If your own code uses other removed classes, Flutter's ",[101,454,456],{"href":145,"rel":455},[105],"removal page"," lists the replacements:",[64,459,460,470],{},[67,461,462],{},[70,463,464,467],{},[73,465,466],{},"Removed class",[73,468,469],{},"Use instead",[83,471,472,484,496,510,522,534],{},[70,473,474,479],{},[88,475,476],{},[21,477,478],{},"io.flutter.app.FlutterActivity",[88,480,481],{},[21,482,483],{},"io.flutter.embedding.android.FlutterActivity",[70,485,486,491],{},[88,487,488],{},[21,489,490],{},"io.flutter.app.FlutterFragmentActivity",[88,492,493],{},[21,494,495],{},"io.flutter.embedding.android.FlutterFragmentActivity",[70,497,498,503],{},[88,499,500],{},[21,501,502],{},"io.flutter.app.FlutterApplication",[88,504,505,506,509],{},"Removed. Extend ",[21,507,508],{},"android.app.Application"," if you need a custom one",[70,511,512,517],{},[88,513,514],{},[21,515,516],{},"io.flutter.app.FlutterPlayStoreSplitApplication",[88,518,519],{},[21,520,521],{},"io.flutter.embedding.android.FlutterPlayStoreSplitApplication",[70,523,524,529],{},[88,525,526],{},[21,527,528],{},"io.flutter.view.FlutterMain",[88,530,531],{},[21,532,533],{},"io.flutter.embedding.engine.loader.FlutterLoader",[70,535,536,544],{},[88,537,538,33,541],{},[21,539,540],{},"io.flutter.view.FlutterView",[21,542,543],{},"FlutterNativeView",[88,545,546],{},[21,547,548],{},"io.flutter.embedding.android.FlutterView",[14,550,551,552,33,555,558,559,562],{},"For add-to-app projects, the same guide has a separate section: remove calls to ",[21,553,554],{},"FlutterMain.startInitialization",[21,556,557],{},"ensureInitializationComplete",", and replace the ",[21,560,561],{},"io.flutter.facade"," classes.",[59,564,566],{"id":565},"fixing-a-plugin-that-still-uses-pluginregistryregistrar","Fixing a plugin that still uses PluginRegistry.Registrar",[14,568,569,570,573,574,576],{},"If the error points at a plugin, its Android code usually still has a ",[21,571,572],{},"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 ",[21,575,448],{}," to get newer plugin versions, and file an issue if that doesn't help.",[163,578,579,592],{},[166,580,581,584,585,587,588,591],{},[17,582,583],{},"If you use the plugin:"," upgrade it, as the tool suggests. My advice: if ",[21,586,448],{}," doesn't move it, check pub.dev for a newer major version and run ",[21,589,590],{},"flutter pub upgrade --major-versions",". If the plugin has had no release in years, replace it.",[166,593,594,597,598,601,602,605],{},[17,595,596],{},"If you maintain the plugin:"," Flutter's removal page says to delete the ",[21,599,600],{},"registerWith"," method from your ",[21,603,604],{},"FlutterPlugin"," implementation. The Flutter team did the same for its own plugins in flutter\u002Fpackages#6494.",[59,607,609],{"id":608},"need-a-hand","Need a hand?",[14,611,612,613,617,618,622,623,259],{},"If an older Flutter app won't build after an upgrade, the ",[101,614,616],{"href":615},"\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. If the iOS side broke too, see ",[101,619,621],{"href":620},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","Flutter iOS build failed after an upgrade",", or ",[101,624,626],{"href":625},"\u002Fcontact\u002F","send me a short description",[628,629,630],"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":297,"searchDepth":310,"depth":310,"links":632},[633,636,637,638,639],{"id":61,"depth":310,"text":62,"children":634},[635],{"id":157,"depth":317,"text":158},{"id":195,"depth":310,"text":196},{"id":246,"depth":310,"text":247},{"id":565,"depth":310,"text":566},{"id":608,"depth":310,"text":609},"AI & Technology","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.",null,"md",[646,649,652,655,658],{"question":647,"answer":648},"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":650,"answer":651},"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":653,"answer":654},"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":656,"answer":657},"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":659,"answer":660},"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.","Boynton Beach, FL",{"readingTimeStats":663},{"text":664,"minutes":665,"time":666,"words":667},"5 min read",4.1,246000,820,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding","7 min",[672,673,674],"flutter-ios-build-failed-after-upgrade-2026","jcenter-bintray-shut-down-fix-android-flutter-builds-2026","how-to-debug-a-flutter-firebase-bug-2026",{"title":5,"description":642},[677,679,681,683,686,689,692],{"title":678,"url":145},"Flutter docs, Removal of v1 Android embedding Java APIs (last updated July 31, 2026)",{"title":680,"url":103},"Flutter docs, Android v1 embedding app and plugin creation deprecation",{"title":682,"url":253},"Flutter on GitHub, Upgrading pre 1.12 Android projects",{"title":684,"url":685},"Flutter docs, Supporting the new Android plugins APIs","https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fplugin-api-migration",{"title":687,"url":688},"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":690,"url":691},"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":693,"url":110},"Flutter release archive (macOS)","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",[697,698,699,700,701],"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",[705,1231,1762],{"id":706,"title":707,"author":708,"body":710,"category":640,"createdAt":1217,"description":1218,"disclosure":643,"extension":644,"faq":643,"howTo":643,"lastVerified":643,"location":661,"meta":1219,"navigation":313,"ogImage":643,"path":1225,"primaryKeyword":643,"readingTime":670,"related":643,"seo":1226,"sources":643,"stem":1227,"tags":1228,"takeaways":643,"updatedAt":1217,"url":1229,"__hash__":1230},"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":709},{"twitter":9},{"type":11,"value":711,"toc":1200},[712,718,729,733,736,770,773,830,834,864,868,877,902,906,912,956,1036,1053,1057,1069,1102,1106,1115,1118,1122,1125,1129,1135,1139,1143,1157,1161,1173,1177,1180,1184,1190,1194,1197],[14,713,714,717],{},[17,715,716],{},"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,719,720,721,724,725,259],{},"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 ",[101,722,723],{"href":615},"fixed-price Flutter & Firebase Fix Ticket",". For the wider method, see ",[101,726,728],{"href":727},"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","how to debug a Flutter and Firebase bug",[59,730,732],{"id":731},"step-1-read-the-real-error","Step 1: Read the real error",[14,734,735],{},"Don't start by deleting folders. First get the full output.",[261,737,738,745,759],{},[166,739,740,741,744],{},"Run ",[21,742,743],{},"flutter doctor -v"," and fix anything it flags under Xcode or CocoaPods.",[166,746,740,747,750,751,754,755,758],{},[21,748,749],{},"flutter build ios -v"," (or ",[21,752,753],{},"flutter run -v",") and read from the first line that says ",[21,756,757],{},"error:",", not the last line. The final \"Xcode build failed\" message is a summary.",[166,760,761,762,765,766,769],{},"If the failure happens in Xcode itself, open ",[21,763,764],{},"ios\u002FRunner.xcworkspace"," (never ",[21,767,768],{},"Runner.xcodeproj",") and use the Report navigator to open the build log. Filter for errors and read the first one.",[14,771,772],{},"Where the error appears tells you which step failed:",[64,774,775,785],{},[67,776,777],{},[70,778,779,782],{},[73,780,781],{},"Where it fails",[73,783,784],{},"Likely area",[83,786,787,798,806,814,822],{},[70,788,789,795],{},[88,790,791,794],{},[21,792,793],{},"pod install"," output, before compiling",[88,796,797],{},"CocoaPods resolution, Podfile, specs",[70,799,800,803],{},[88,801,802],{},"\"Compiling for iOS X, but module requires iOS Y\"",[88,804,805],{},"Deployment target too low",[70,807,808,811],{},[88,809,810],{},"Swift or Objective-C compile errors inside a plugin",[88,812,813],{},"Plugin and Xcode or SDK version mismatch",[70,815,816,819],{},[88,817,818],{},"Linking or \"framework not found\"",[88,820,821],{},"Stale Pods or build cache",[70,823,824,827],{},[88,825,826],{},"Code signing messages",[88,828,829],{},"Signing and provisioning, covered at the end",[59,831,833],{"id":832},"step-2-check-your-xcode-and-cocoapods-versions","Step 2: Check your Xcode and CocoaPods versions",[14,835,836,837,842,843,33,846,849,850,855,856,859,860,863],{},"Upgrades often fail because the Firebase SDK moved its minimum requirements. The ",[101,838,841],{"href":839,"rel":840},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fios\u002Finstallation-methods",[105],"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 ",[21,844,845],{},"pod --version",[21,847,848],{},"xcodebuild -version",", and update if either is below what your plugins need. Flutter's own ",[101,851,854],{"href":852,"rel":853},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fios\u002Fsetup",[105],"iOS setup page"," covers pointing the command-line tools at the right Xcode (",[21,857,858],{},"xcode-select",") and accepting licenses (",[21,861,862],{},"sudo xcodebuild -license","); a second Xcode installed on the machine is a common reason a build uses the wrong toolchain.",[59,865,867],{"id":866},"step-3-fix-the-ios-deployment-target","Step 3: Fix the iOS deployment target",[14,869,870,871,876],{},"A plugin upgrade can raise the minimum iOS version. The ",[101,872,875],{"href":873,"rel":874},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fflutter\u002Fsetup",[105],"Firebase Flutter setup page"," lists iOS 15 or later as the Apple requirement for the FlutterFire plugins. Check three places and make them agree:",[163,878,879,889,892],{},[166,880,881,884,885,888],{},[21,882,883],{},"ios\u002FPodfile",": the line ",[21,886,887],{},"platform :ios, '15.0'"," (use the minimum your plugins ask for; if the line is commented out, uncomment it).",[166,890,891],{},"Xcode: Runner target, General tab, \"Minimum Deployments\".",[166,893,168,894,897,898,901],{},[21,895,896],{},"post_install"," block in the Podfile, if you have one that sets ",[21,899,900],{},"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.",[59,903,905],{"id":904},"step-4-refresh-cocoapods-then-clean-it-out","Step 4: Refresh CocoaPods, then clean it out",[14,907,908,909,176],{},"Work from least to most destructive. Run these inside the ",[21,910,911],{},"ios",[261,913,914,922,950],{},[166,915,916,921],{},[17,917,918],{},[21,919,920],{},"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.",[166,923,924,929,930,933,934,939,940,942,943,945,946,949],{},[17,925,926],{},[21,927,928],{},"pod update PODNAME"," if one pod needs to move to a newer version than ",[21,931,932],{},"Podfile.lock"," allows. As the ",[101,935,938],{"href":936,"rel":937},"https:\u002F\u002Fguides.cocoapods.org\u002Fusing\u002Fpod-install-vs-update.html",[105],"CocoaPods guide"," explains, ",[21,941,793],{}," respects the versions in ",[21,944,932],{},", while ",[21,947,948],{},"pod update"," ignores the lock and fetches the newest version your constraints allow.",[166,951,952,955],{},[17,953,954],{},"A clean reinstall."," If it is still broken, remove the generated pieces and rebuild them:",[292,957,961],{"className":958,"code":959,"language":960,"meta":297,"style":297},"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",[21,962,963,973,988,995,1004,1015],{"__ignoreMap":297},[301,964,965,969],{"class":303,"line":304},[301,966,968],{"class":967},"sj4cs","cd",[301,970,972],{"class":971},"sZZnC"," ios\n",[301,974,975,979,982,985],{"class":303,"line":310},[301,976,978],{"class":977},"sScJk","rm",[301,980,981],{"class":967}," -rf",[301,983,984],{"class":971}," Pods",[301,986,987],{"class":971}," Podfile.lock\n",[301,989,990,992],{"class":303,"line":317},[301,991,968],{"class":967},[301,993,994],{"class":971}," ..\n",[301,996,998,1001],{"class":303,"line":997},4,[301,999,1000],{"class":977},"flutter",[301,1002,1003],{"class":971}," clean\n",[301,1005,1007,1009,1012],{"class":303,"line":1006},5,[301,1008,1000],{"class":977},[301,1010,1011],{"class":971}," pub",[301,1013,1014],{"class":971}," get\n",[301,1016,1018,1020,1023,1027,1030,1033],{"class":303,"line":1017},6,[301,1019,968],{"class":967},[301,1021,1022],{"class":971}," ios",[301,1024,1026],{"class":1025},"sVt8B"," && ",[301,1028,1029],{"class":977},"pod",[301,1031,1032],{"class":971}," install",[301,1034,1035],{"class":967}," --repo-update\n",[14,1037,1038,1039,1042,1043,1045,1046,1048,1049,1052],{},"Deleting ",[21,1040,1041],{},"Pods"," is safe because it is generated. Deleting ",[21,1044,932],{}," 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 ",[21,1047,932],{},", 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 ",[21,1050,1051],{},"~\u002FLibrary\u002FDeveloper\u002FXcode\u002FDerivedData","; it only holds build products, and Xcode recreates it.",[59,1054,1056],{"id":1055},"step-5-upgrade-the-flutterfire-plugins-together","Step 5: Upgrade the FlutterFire plugins together",[14,1058,1059,107,1062,107,1065,1068],{},[21,1060,1061],{},"firebase_core",[21,1063,1064],{},"cloud_firestore",[21,1066,1067],{},"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.",[163,1070,1071,1081,1096],{},[166,1072,740,1073,1076,1077,1080],{},[21,1074,1075],{},"flutter pub outdated"," to see the gap, then upgrade the whole FlutterFire family in one ",[21,1078,1079],{},"pubspec.yaml"," change.",[166,1082,1083,1084,1087,1088,1092,1093,259],{},"Re-run ",[21,1085,1086],{},"flutterfire configure"," if you added a Firebase service or platform; the ",[101,1089,1091],{"href":873,"rel":1090},[105],"Firebase docs"," say re-running it keeps your configuration current. Install the tool with ",[21,1094,1095],{},"dart pub global activate flutterfire_cli",[166,1097,1098,1099,1101],{},"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 ",[21,1100,1061],{}," is a classic conflict.",[59,1103,1105],{"id":1104},"step-6-know-that-cocoapods-is-being-phased-out","Step 6: Know that CocoaPods is being phased out",[14,1107,1108,1109,1114],{},"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 ",[101,1110,1113],{"href":1111,"rel":1112},"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-app-developers",[105],"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,1116,1117],{},"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.",[59,1119,1121],{"id":1120},"step-7-signing-errors-briefly","Step 7: Signing errors, briefly",[14,1123,1124],{},"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.",[59,1126,1128],{"id":1127},"when-to-get-help","When to get help",[14,1130,1131,1132,1134],{},"If an iOS build has eaten more than a day and the steps above haven't moved it, App369's ",[101,1133,723],{"href":615}," 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.",[59,1136,1138],{"id":1137},"frequently-asked-questions","Frequently Asked Questions",[155,1140,1142],{"id":1141},"why-did-my-flutter-ios-build-fail-after-upgrading-flutter","Why did my Flutter iOS build fail after upgrading Flutter?",[14,1144,1145,1146,1148,1149,1151,1152,1154,1155,259],{},"Most often the Podfile or Xcode project still has an old iOS deployment target, ",[21,1147,932],{}," pins old pod versions, or plugin versions no longer match each other. Run ",[21,1150,749],{},", find the first ",[21,1153,757],{}," line, then work through the deployment target and ",[21,1156,920],{},[155,1158,1160],{"id":1159},"is-it-safe-to-delete-podfilelock-and-the-pods-folder","Is it safe to delete Podfile.lock and the Pods folder?",[14,1162,1163,1164,1166,1167,1169,1170,1172],{},"Yes, for a repair. ",[21,1165,1041],{}," is generated and ",[21,1168,932],{}," is rebuilt by ",[21,1171,793],{},". The catch is that pods may resolve to newer versions, so check the new lock file and commit it once the build works.",[155,1174,1176],{"id":1175},"what-does-pod-install-repo-update-do","What does \"pod install --repo-update\" do?",[14,1178,1179],{},"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.",[155,1181,1183],{"id":1182},"should-i-upgrade-only-one-flutterfire-plugin","Should I upgrade only one FlutterFire plugin?",[14,1185,1186,1187,1189],{},"Avoid it. FlutterFire plugins depend on matching Firebase SDK releases, so upgrade ",[21,1188,1061],{}," and the other FlutterFire packages together and rebuild.",[155,1191,1193],{"id":1192},"do-i-need-to-switch-from-cocoapods-to-swift-package-manager","Do I need to switch from CocoaPods to Swift Package Manager?",[14,1195,1196],{},"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.",[628,1198,1199],{},"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":297,"searchDepth":310,"depth":310,"links":1201},[1202,1203,1204,1205,1206,1207,1208,1209,1210],{"id":731,"depth":310,"text":732},{"id":832,"depth":310,"text":833},{"id":866,"depth":310,"text":867},{"id":904,"depth":310,"text":905},{"id":1055,"depth":310,"text":1056},{"id":1104,"depth":310,"text":1105},{"id":1120,"depth":310,"text":1121},{"id":1127,"depth":310,"text":1128},{"id":1137,"depth":310,"text":1138,"children":1211},[1212,1213,1214,1215,1216],{"id":1141,"depth":317,"text":1142},{"id":1159,"depth":317,"text":1160},{"id":1175,"depth":317,"text":1176},{"id":1182,"depth":317,"text":1183},{"id":1192,"depth":317,"text":1193},"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":1220},{"text":1221,"minutes":1222,"time":1223,"words":1224},"6 min read",5.995,359700,1199,"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026",{"title":707,"description":1218},"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",{"id":1232,"title":1233,"author":1234,"body":1236,"category":640,"createdAt":1705,"description":1706,"disclosure":643,"extension":644,"faq":1707,"howTo":643,"lastVerified":643,"location":661,"meta":1726,"navigation":313,"ogImage":643,"path":1731,"primaryKeyword":1732,"readingTime":670,"related":1733,"seo":1736,"sources":1737,"stem":1752,"tags":1753,"takeaways":1754,"updatedAt":1705,"url":1760,"__hash__":1761},"blog\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026.md","JCenter Shutdown: Fixing Old Android and Flutter Builds",{"name":7,"social":1235},{"twitter":9},{"type":11,"value":1237,"toc":1697},[1238,1254,1257,1262,1266,1391,1394,1396,1398,1434,1437,1441,1444,1608,1612,1676,1679,1684,1686,1695],[14,1239,1240,1243,1244,375,1247,33,1250,1253],{},[17,1241,1242],{},"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 ",[21,1245,1246],{},"jcenter()",[21,1248,1249],{},"mavenCentral()",[21,1251,1252],{},"google()",". The harder cases are old plugins that still declare JCenter and libraries that were never published anywhere else. Both are covered below.",[14,1255,1256],{},"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,1258,1259,1261],{},[17,1260,56],{}," 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.",[59,1263,1265],{"id":1264},"what-happened-to-bintray-and-jcenter-and-when","What happened to Bintray and JCenter, and when",[64,1267,1268,1278],{},[67,1269,1270],{},[70,1271,1272,1274,1276],{},[73,1273,75],{},[73,1275,78],{},[73,1277,81],{},[83,1279,1280,1295,1312,1325,1342,1355,1373],{},[70,1281,1282,1285,1288],{},[88,1283,1284],{},"February 3, 2021",[88,1286,1287],{},"JFrog announces the end of Bintray, JCenter, GoCenter and ChartCenter",[88,1289,1290],{},[101,1291,1294],{"href":1292,"rel":1293},"https:\u002F\u002Fjfrog.com\u002Fblog\u002Finto-the-sunset-bintray-jcenter-gocenter-and-chartcenter\u002F",[105],"JFrog",[70,1296,1297,1300,1305],{},[88,1298,1299],{},"February 22, 2021",[88,1301,1302,1303],{},"Gradle tells users to replace JCenter with Maven Central and says Gradle 7.0 will deprecate ",[21,1304,1246],{},[88,1306,1307],{},[101,1308,1311],{"href":1309,"rel":1310},"https:\u002F\u002Fblog.gradle.org\u002Fjcenter-shutdown",[105],"Gradle blog",[70,1313,1314,1317,1320],{},[88,1315,1316],{},"March 31, 2021",[88,1318,1319],{},"JCenter stops accepting new submissions",[88,1321,1322],{},[101,1323,1294],{"href":1292,"rel":1324},[105],[70,1326,1327,1332,1337],{},[88,1328,1329],{},[17,1330,1331],{},"May 1, 2021",[88,1333,1334],{},[17,1335,1336],{},"Bintray shuts down",[88,1338,1339],{},[101,1340,1294],{"href":1292,"rel":1341},[105],[70,1343,1344,1347,1350],{},[88,1345,1346],{},"2021 to 2024",[88,1348,1349],{},"JCenter stays up as a read-only repository",[88,1351,1352],{},[101,1353,1311],{"href":1309,"rel":1354},[105],[70,1356,1357,1362,1367],{},[88,1358,1359],{},[17,1360,1361],{},"August 15, 2024",[88,1363,1364],{},[17,1365,1366],{},"JCenter starts redirecting every request to Maven Central",[88,1368,1369],{},[101,1370,1294],{"href":1371,"rel":1372},"https:\u002F\u002Fjfrog.com\u002Fblog\u002Fjcenter-sunset\u002F",[105],[70,1374,1375,1378,1384],{},[88,1376,1377],{},"Gradle 9.0",[88,1379,1380,1381,1383],{},"Gradle removes the ",[21,1382,1246],{}," method",[88,1385,1386],{},[101,1387,1390],{"href":1388,"rel":1389},"https:\u002F\u002Fdocs.gradle.org\u002Fcurrent\u002Fuserguide\u002Fupgrading_major_version_9.html",[105],"Gradle docs",[14,1392,1393],{},"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.",[155,1395,158],{"id":157},[14,1397,161],{},[163,1399,1400,1406,1415,1425],{},[166,1401,1402,1405],{},[17,1403,1404],{},"bintray.com"," did not load: the connection timed out.",[166,1407,1408,1411,1412,259],{},[17,1409,1410],{},"dl.bintray.com",", where many READMEs linked downloads and custom repositories, returned ",[17,1413,1414],{},"404",[166,1416,1417,1420,1421,1424],{},[17,1418,1419],{},"jcenter.bintray.com"," returned a ",[17,1422,1423],{},"301 redirect to repo1.maven.org",", Maven Central.",[166,1426,1427,1428,1431,1432,259],{},"A library that was only ever published on JCenter, ",[21,1429,1430],{},"org.jetbrains.kotlinx:kotlinx-html-jvm:0.6.12",", followed the redirect to Maven Central and returned ",[17,1433,1414],{},[14,1435,1436],{},"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.",[59,1438,1440],{"id":1439},"how-to-fix-the-build","How to fix the build",[14,1442,1443],{},"Work through these in order. In my experience, the first two fix many projects.",[261,1445,1446,1525,1534,1555,1585,1595],{},[166,1447,1448,1454,1455,750,1458,1461,1462,33,1465,1468,1469,1472,1473,33,1476,1479,1480,1483,1484,375,1486,1488,1489,1491,1492,427,1495,1497,1498],{},[17,1449,1450,1451,1453],{},"Replace ",[21,1452,1246],{}," in your own build files."," In an Android project, look in ",[21,1456,1457],{},"settings.gradle",[21,1459,1460],{},"settings.gradle.kts",") under ",[21,1463,1464],{},"pluginManagement",[21,1466,1467],{},"dependencyResolutionManagement",", and in the top-level ",[21,1470,1471],{},"build.gradle"," under ",[21,1474,1475],{},"buildscript",[21,1477,1478],{},"allprojects",". In a Flutter app the same files are under ",[21,1481,1482],{},"android\u002F",". Replace ",[21,1485,1246],{},[21,1487,1249],{},", and make sure ",[21,1490,1252],{}," is there too. Keep ",[21,1493,1494],{},"gradlePluginPortal()",[21,1496,1464],{}," if it is already there.",[292,1499,1503],{"className":1500,"code":1501,"language":1502,"meta":297,"style":297},"language-groovy shiki shiki-themes github-light github-dark","repositories {\n    google()\n    mavenCentral()\n}\n","groovy",[21,1504,1505,1510,1515,1520],{"__ignoreMap":297},[301,1506,1507],{"class":303,"line":304},[301,1508,1509],{},"repositories {\n",[301,1511,1512],{"class":303,"line":310},[301,1513,1514],{},"    google()\n",[301,1516,1517],{"class":303,"line":317},[301,1518,1519],{},"    mavenCentral()\n",[301,1521,1522],{"class":303,"line":997},[301,1523,1524],{},"}\n",[166,1526,1527,1530,1531,1533],{},[17,1528,1529],{},"Sync, then read the first error."," If it names a library that can't be found, go to step 4. If it mentions ",[21,1532,1246],{}," and points at a file you don't own, go to step 3.",[166,1535,1536,1539,1540,1542,1543,1545,1546,1548,1549,427,1552,1554],{},[17,1537,1538],{},"Fix plugins and libraries that still declare JCenter."," On Gradle 9 the build stops at any ",[21,1541,1246],{}," 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 ",[21,1544,1079],{}," and run ",[21,1547,448],{},". 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 ",[21,1550,1551],{},"dependency_overrides",[21,1553,1079],{}," 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.",[166,1556,1557,1560,1561,1566,1567,1572,1573,1576,1577,1580,1581,1584],{},[17,1558,1559],{},"Find a new home for JCenter-only libraries."," Search ",[101,1562,1565],{"href":1563,"rel":1564},"https:\u002F\u002Fcentral.sonatype.com\u002F",[105],"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, ",[101,1568,1571],{"href":1569,"rel":1570},"https:\u002F\u002Fjitpack.io\u002F",[105],"JitPack"," can build it from a release tag: add ",[21,1574,1575],{},"maven { url 'https:\u002F\u002Fjitpack.io' }"," and use ",[21,1578,1579],{},"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 ",[21,1582,1583],{},"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.",[166,1586,1587,1590,1591,1594],{},[17,1588,1589],{},"Check for other dead repositories."," Remove any ",[21,1592,1593],{},"maven { url \"https:\u002F\u002Fdl.bintray.com\u002F...\" }"," lines. Each one is a dead address that slows down or breaks resolution.",[166,1596,1597,1600,1601,1604,1605,1607],{},[17,1598,1599],{},"Build from a clean state."," Run the build with an empty Gradle cache (a fresh ",[21,1602,1603],{},"GRADLE_USER_HOME"," or a clean CI runner, plus ",[21,1606,444],{}," in a Flutter app) before you call it fixed. A cache on your own machine can hide a library that no longer downloads anywhere.",[59,1609,1611],{"id":1610},"when-its-more-than-a-one-line-change","When it's more than a one-line change",[64,1613,1614,1627],{},[67,1615,1616],{},[70,1617,1618,1621,1624],{},[73,1619,1620],{},"What you see",[73,1622,1623],{},"What it usually means",[73,1625,1626],{},"Usual fix",[83,1628,1629,1643,1654,1665],{},[70,1630,1631,1637,1640],{},[88,1632,1633,1634,1636],{},"The build fails on ",[21,1635,1246],{}," after a Gradle upgrade",[88,1638,1639],{},"A build file, yours or a plugin's, still calls the removed method",[88,1641,1642],{},"Replace it in your files, and upgrade the plugin",[70,1644,1645,1648,1651],{},[88,1646,1647],{},"\"Could not find\" for an old version of a library",[88,1649,1650],{},"That version only existed on JCenter",[88,1652,1653],{},"Use a version that is on Maven Central, or JitPack",[70,1655,1656,1659,1662],{},[88,1657,1658],{},"A README says to add a dl.bintray.com repository",[88,1660,1661],{},"The project published only through Bintray",[88,1663,1664],{},"Check Maven Central and GitHub releases for the same project",[70,1666,1667,1670,1673],{},[88,1668,1669],{},"The project hasn't been built in years",[88,1671,1672],{},"JCenter is one of several outdated pieces",[88,1674,1675],{},"Upgrade Gradle, Android Gradle Plugin and Kotlin step by step",[14,1677,1678],{},"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,1680,1681,1682,259],{},"For the iOS side of the same problem, see ",[101,1683,621],{"href":620},[59,1685,609],{"id":608},[14,1687,1688,1689,1691,1692,1694],{},"If the build still fails after these steps, or the project is old enough that JCenter is only the first problem, the ",[101,1690,616],{"href":615}," 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, ",[101,1693,626],{"href":625}," of the error and the project's age, and I'll tell you where I'd start.",[628,1696,630],{},{"title":297,"searchDepth":310,"depth":310,"links":1698},[1699,1702,1703,1704],{"id":1264,"depth":310,"text":1265,"children":1700},[1701],{"id":157,"depth":317,"text":158},{"id":1439,"depth":310,"text":1440},{"id":1610,"depth":310,"text":1611},{"id":608,"depth":310,"text":609},"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.",[1708,1711,1714,1717,1720,1723],{"question":1709,"answer":1710},"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":1712,"answer":1713},"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":1715,"answer":1716},"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":1718,"answer":1719},"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":1721,"answer":1722},"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":1724,"answer":1725},"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":1727},{"text":1221,"minutes":1728,"time":1729,"words":1730},5.165,309900,1033,"\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026","jcenter shutdown",[672,1734,1735],"mobile-app-beta-testing-crash-reporting-tools-2026","parse-kinvey-backend-as-a-service-alternatives-2026",{"title":1233,"description":1706},[1738,1740,1742,1744,1746,1749,1751],{"title":1739,"url":1292},"JFrog, \"Into the Sunset on May 1st: Bintray, JCenter, GoCenter, and ChartCenter\" (February 3, 2021)",{"title":1741,"url":1371},"JFrog, \"JCenter Sunset on August 15th, 2024\" (July 2, 2024)",{"title":1743,"url":1309},"Gradle blog, \"JCenter shutdown impact on Gradle builds\" (February 22, 2021)",{"title":1745,"url":1388},"Gradle, upgrading to Gradle 9.0 (removal of jcenter())",{"title":1747,"url":1748},"Android Developers, JCenter migration","https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Fjcenter-migration",{"title":1750,"url":1563},"Maven Central search",{"title":1571,"url":1569},"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",[1755,1756,1757,1758,1759],"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":1763,"title":1764,"author":1765,"body":1767,"category":640,"createdAt":2147,"description":2148,"disclosure":643,"extension":644,"faq":643,"howTo":643,"lastVerified":643,"location":661,"meta":2149,"navigation":313,"ogImage":643,"path":2154,"primaryKeyword":643,"readingTime":2155,"related":643,"seo":2156,"sources":643,"stem":2157,"tags":2158,"takeaways":643,"updatedAt":2147,"url":2159,"__hash__":2160},"blog\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026.md","How to Debug a Flutter and Firebase Bug: Find the Root Cause (2026)",{"name":7,"social":1766},{"twitter":9},{"type":11,"value":1768,"toc":2126},[1769,1775,1782,1786,1789,1803,1806,1810,1813,1897,1906,1910,1918,1922,1926,1958,1962,1965,1980,1984,2010,2014,2038,2042,2049,2053,2061,2063,2075,2077,2081,2089,2093,2099,2103,2112,2116,2119,2123],[14,1770,1771,1774],{},[17,1772,1773],{},"Most Flutter and Firebase bugs that take days to fix take days to find, not to fix."," Once you can reproduce the bug on demand and you know which layer it lives in (the app, Firebase's servers, or the build tooling), the fix is usually small. This guide is the order to work in, then the five problems that come up most.",[14,1776,1777,1778,1781],{},"It is the method behind App369's ",[101,1779,723],{"href":1780},"\u002Ffixed-price\u002F#fix-ticket",", and the one Simon uses on his own production Flutter and Firebase SaaS, Workspace369.",[59,1783,1785],{"id":1784},"step-1-write-down-exact-reproduction-steps","Step 1: Write down exact reproduction steps",[14,1787,1788],{},"Before reading any code, write the bug as steps someone else could follow:",[261,1790,1791,1794,1797,1800],{},[166,1792,1793],{},"Which build: the app version, build number, and whether it is debug, profile or release.",[166,1795,1796],{},"Which device and OS version, and whether it happens on web, iOS, Android or all three.",[166,1798,1799],{},"Which account or data: a new user, an existing user, a specific record.",[166,1801,1802],{},"The exact taps, and what you expected versus what happened.",[14,1804,1805],{},"If it only happens \"sometimes\", note what the failing cases have in common: a slow network, a large account, the app coming back from the background. A bug you can't reproduce can't be verified as fixed.",[59,1807,1809],{"id":1808},"step-2-find-out-which-layer-is-failing","Step 2: Find out which layer is failing",[14,1811,1812],{},"Each layer has its own log, and the error is usually already in one of them:",[64,1814,1815,1825],{},[67,1816,1817],{},[70,1818,1819,1822],{},[73,1820,1821],{},"Layer",[73,1823,1824],{},"Where to look",[83,1826,1827,1844,1857,1868,1883],{},[70,1828,1829,1832],{},[88,1830,1831],{},"Flutter app",[88,1833,168,1834,1837,1838,1843],{},[21,1835,1836],{},"flutter run"," console, and ",[101,1839,1842],{"href":1840,"rel":1841},"https:\u002F\u002Fdocs.flutter.dev\u002Ftools\u002Fdevtools",[105],"Flutter DevTools"," for widgets, network and memory",[70,1845,1846,1849],{},[88,1847,1848],{},"Release builds in users' hands",[88,1850,1851,1856],{},[101,1852,1855],{"href":1853,"rel":1854},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fcrashlytics",[105],"Firebase Crashlytics"," for crashes and non-fatal errors you record",[70,1858,1859,1862],{},[88,1860,1861],{},"Cloud Functions",[88,1863,1864,1865],{},"Logs Explorer in the Google Cloud console, or ",[21,1866,1867],{},"firebase functions:log",[70,1869,1870,1873],{},[88,1871,1872],{},"Firestore and Storage",[88,1874,1875,1876,1879,1880],{},"The exact error code your app receives, such as ",[21,1877,1878],{},"permission-denied"," or ",[21,1881,1882],{},"failed-precondition",[70,1884,1885,1888],{},[88,1886,1887],{},"Build tooling",[88,1889,1890,1891,375,1893,1896],{},"The full output of ",[21,1892,23],{},[21,1894,1895],{},"-v",", plus Xcode or Gradle's own logs",[14,1898,1899,1900,1902,1903,1905],{},"A Firestore ",[21,1901,1878],{}," error means Security Rules refused the request; it is not an app crash. A ",[21,1904,1882],{}," error on a query often includes a link to create the missing index. Read the full message before changing code.",[59,1907,1909],{"id":1908},"step-3-isolate-it-with-the-emulator-suite","Step 3: Isolate it with the Emulator Suite",[14,1911,168,1912,1917],{},[101,1913,1916],{"href":1914,"rel":1915},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Femulator-suite",[105],"Firebase Local Emulator Suite"," runs Auth, Firestore, Functions and Storage on your machine. Point a debug build at the emulators, load the data that triggers the bug, and you can repeat the failing steps as often as you need without touching production data. Security Rules problems in particular are easier to see in the emulator UI, which shows which rule allowed or denied each request.",[59,1919,1921],{"id":1920},"the-five-issues-that-come-up-most","The five issues that come up most",[155,1923,1925],{"id":1924},"build-failures","Build failures",[163,1927,1928,1933,1948,1955],{},[166,1929,740,1930,1932],{},[21,1931,743],{}," first. It catches missing toolchains, licenses and Xcode or Android SDK problems.",[166,1934,1935,1936,1939,1940,33,1943,1945,1946,176],{},"For iOS, check the minimum iOS version in the ",[21,1937,1938],{},"Podfile"," against what your Firebase plugins require, then run ",[21,1941,1942],{},"pod repo update",[21,1944,793],{}," in the ",[21,1947,911],{},[166,1949,1950,1951,1954],{},"For Android, check that the Android Gradle Plugin, Gradle and Kotlin versions are compatible with each other, and that ",[21,1952,1953],{},"minSdkVersion"," meets your plugins' minimum.",[166,1956,1957],{},"After upgrading Flutter or the FlutterFire plugins, upgrade all FlutterFire plugins together; mixed versions are a common cause of build errors.",[155,1959,1961],{"id":1960},"login-loops","Login loops",[14,1963,1964],{},"A user signs in and lands back on the sign-in screen, or the app flickers between screens. The usual causes:",[163,1966,1967,1974,1977],{},[166,1968,1969,1970,1973],{},"The router redirects before Firebase Auth has restored the session. On a cold start, ",[21,1971,1972],{},"authStateChanges()"," emits once the saved user is loaded; decide the first screen after that first event, not before.",[166,1975,1976],{},"Redirect logic that reads two different sources of truth, such as the auth state and a user profile document that hasn't loaded yet.",[166,1978,1979],{},"On web, the redirect sign-in flow returning to a page that immediately redirects again.",[155,1981,1983],{"id":1982},"firestore-writes-that-hang","Firestore writes that hang",[14,1985,1986,1987,1879,1990,1993,1994,1997,1998,2000,2001,2003,2004,2006,2007,2009],{},"A ",[21,1988,1989],{},"set()",[21,1991,1992],{},"update()"," call whose ",[21,1995,1996],{},"Future"," never completes is often not stuck at all. With offline persistence, which is on by default on Android and iOS, the write is applied to the local cache immediately, and the ",[21,1999,1996],{}," completes only when the server confirms it. On a poor connection or with no connection, that can take a long time. Don't block the UI on the ",[21,2002,1996],{},": let the snapshot listener show the change. If the write is rejected, the ",[21,2005,1996],{}," completes with an error such as ",[21,2008,1878],{},", so make sure something catches and reports it.",[155,2011,2013],{"id":2012},"cloud-function-errors","Cloud Function errors",[163,2015,2016,2022,2029,2035],{},[166,2017,2018,2019,259],{},"Read the function's own logs before the client error; the client often only receives ",[21,2020,2021],{},"internal",[166,2023,2024,2025,2028],{},"In callable functions, throw an ",[21,2026,2027],{},"HttpsError"," with a clear code and message, so the app can show a useful error instead of a generic one.",[166,2030,2031,2032,259],{},"Check the function's region in the app matches where it is deployed; a callable in the wrong region returns ",[21,2033,2034],{},"not-found",[166,2036,2037],{},"For timeouts, compare the configured timeout and memory with what the function actually does.",[155,2039,2041],{"id":2040},"a-broken-screen","A broken screen",[14,2043,2044,2045,2048],{},"A red error screen in debug, or a grey one in release, means an exception was thrown during build. The console shows the first exception; fix that one first, because later errors are often caused by it. Common causes are a ",[21,2046,2047],{},"null"," value from a document field that doesn't exist on older records, and a list or column without bounded height inside a scrolling parent.",[59,2050,2052],{"id":2051},"fix-it-with-a-test","Fix it with a test",[14,2054,2055,2056,2060],{},"When you've found the root cause, write a test that fails because of it, then make it pass. Widget tests cover screens and state; the ",[101,2057,2059],{"href":1914,"rel":2058},[105],"Firebase emulators"," let integration tests and Security Rules tests run against real Firebase behavior. The test keeps the bug from coming back in the next release.",[59,2062,1128],{"id":1127},[14,2064,2065,2066,2069,2070,2074],{},"If a bug has eaten more than a day, App369 offers a ",[101,2067,2068],{"href":1780},"fixed-price Fix Ticket",". 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 one scoped defect fixed as a pull request, with a regression test and handover notes, within 5 business days. If the problem turns out to be your Security Rules, the ",[101,2071,2073],{"href":2072},"\u002Fblog\u002Ffirebase-security-guide-2026\u002F","Firebase Security Rules guide"," is a good next read.",[59,2076,1138],{"id":1137},[155,2078,2080],{"id":2079},"why-does-my-firestore-write-never-finish","Why does my Firestore write never finish?",[14,2082,2083,2084,2086,2087,259],{},"With offline persistence, a write is saved to the local cache at once, but its ",[21,2085,1996],{}," completes only when the server confirms it. On a slow or missing connection that can take a long time. Show the change from your snapshot listener instead of waiting on the write, and catch errors such as ",[21,2088,1878],{},[155,2090,2092],{"id":2091},"why-does-my-flutter-app-keep-returning-to-the-login-screen","Why does my Flutter app keep returning to the login screen?",[14,2094,2095,2096,2098],{},"Usually because the router decides where to go before Firebase Auth has restored the saved session, or because redirect logic depends on data that hasn't loaded yet. Wait for the first ",[21,2097,1972],{}," event before choosing the first screen.",[155,2100,2102],{"id":2101},"how-do-i-see-cloud-functions-errors","How do I see Cloud Functions errors?",[14,2104,2105,2106,2108,2109,2111],{},"In Logs Explorer in the Google Cloud console, or with ",[21,2107,1867],{},". The app often receives only a generic ",[21,2110,2021],{}," error, so the function's own logs are where the real message is.",[155,2113,2115],{"id":2114},"can-i-debug-firebase-without-touching-production-data","Can I debug Firebase without touching production data?",[14,2117,2118],{},"Yes. The Firebase Local Emulator Suite runs Auth, Firestore, Functions and Storage locally. Load test data that reproduces the bug and point a debug build at the emulators.",[155,2120,2122],{"id":2121},"what-should-i-send-a-developer-to-fix-a-flutter-bug","What should I send a developer to fix a Flutter bug?",[14,2124,2125],{},"Exact reproduction steps, the app version and build number, the device and OS, the error message or a screen recording, and access to the repository. With those, a developer can usually reproduce the bug on the first try.",{"title":297,"searchDepth":310,"depth":310,"links":2127},[2128,2129,2130,2131,2138,2139,2140],{"id":1784,"depth":310,"text":1785},{"id":1808,"depth":310,"text":1809},{"id":1908,"depth":310,"text":1909},{"id":1920,"depth":310,"text":1921,"children":2132},[2133,2134,2135,2136,2137],{"id":1924,"depth":317,"text":1925},{"id":1960,"depth":317,"text":1961},{"id":1982,"depth":317,"text":1983},{"id":2012,"depth":317,"text":2013},{"id":2040,"depth":317,"text":2041},{"id":2051,"depth":310,"text":2052},{"id":1127,"depth":310,"text":1128},{"id":1137,"depth":310,"text":1138,"children":2141},[2142,2143,2144,2145,2146],{"id":2079,"depth":317,"text":2080},{"id":2091,"depth":317,"text":2092},{"id":2101,"depth":317,"text":2102},{"id":2114,"depth":317,"text":2115},{"id":2121,"depth":317,"text":2122},"2026-10-12T15:00:00.000Z","Find the root cause of a Flutter and Firebase bug: reproduce it, read the right logs, isolate it with the Emulator Suite, and fix the five most common issues.",{"readingTimeStats":2150},{"text":1221,"minutes":2151,"time":2152,"words":2153},5.665,339900,1133,"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026","9 min",{"title":1764,"description":2148},"blog\u002Fhow-to-debug-a-flutter-firebase-bug-2026","flutter debugging, firebase debugging, flutter build failure, firebase auth, firestore, cloud functions errors","https:\u002F\u002Fapp369.com\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","QDPYxmm3Fehb3Vf0Z6wQbyw2Gl0hMxaPERHN5zv-A2s",[2162,2164,2168,2170,2172,2175],{"keyword":5,"url":702,"title":5,"relevance":2163},73,{"keyword":2165,"url":2166,"title":2165,"relevance":2167},"Flutter \"Applying Gradle Plugin Imperatively\" Error: The Fix","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F",20,{"keyword":707,"url":1229,"title":707,"relevance":2169},12,{"keyword":1233,"url":1760,"title":1233,"relevance":2171},9,{"keyword":2173,"url":2174,"title":2173,"relevance":1017},"Flutter UIScene Migration: Fix Launch Crashes on Xcode 27","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F",{"keyword":2176,"url":2177,"title":2176,"relevance":1017},"Glitch Shut Down: Where to Build and Host Small Web Apps in 2026","https:\u002F\u002Fapp369.com\u002Fblog\u002Fglitch-shut-down-where-to-host-web-apps-2026\u002F",1792347287308]