[{"data":1,"prerenderedAt":2402},["ShallowReactive",2],{"\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026\u002F":3,"\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026\u002F-related":686,"\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026\u002F-resources":2390},{"id":4,"title":5,"author":6,"body":10,"category":620,"createdAt":621,"description":622,"disclosure":623,"extension":624,"faq":625,"howTo":623,"lastVerified":623,"location":641,"meta":642,"navigation":439,"ogImage":623,"path":648,"primaryKeyword":649,"readingTime":650,"related":651,"seo":655,"sources":656,"stem":676,"tags":677,"takeaways":678,"updatedAt":621,"url":684,"__hash__":685},"blog\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026.md","Flutter Android Build Fails After AGP 9: The Fix",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":605},"minimark",[13,30,33,39,44,47,129,140,174,178,181,187,192,195,201,205,285,288,292,301,306,309,313,319,342,356,370,374,406,491,501,505,508,512,518,527,535,539,554,558,564,585,589,601],[14,15,16,25,26,29],"p",{},[17,18,19,20,24],"strong",{},"If a Flutter Android build fails after you move to Android Gradle Plugin 9, the cause is usually built-in Kotlin: AGP 9.0 turns it on by default, and a project or plugin that still applies ",[21,22,23],"code",{},"kotlin-android"," breaks."," The quick fix is two flags in ",[21,27,28],{},"android\u002Fgradle.properties",". The lasting fix is to migrate the app and its plugins. Flutter 3.44 or later is needed for AGP 9, and 3.47 or later to switch built-in Kotlin on.",[14,31,32],{},"The facts below come from Google's AGP 9.0 release notes, Flutter's migration guides and Flutter's GitHub issues, 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-agp-90-changes","What AGP 9.0 changes",[14,45,46],{},"Google's release notes list a major release with API and behavior changes. The ones that matter for a Flutter app:",[48,49,50,63],"table",{},[51,52,53],"thead",{},[54,55,56,60],"tr",{},[57,58,59],"th",{},"Item",[57,61,62],{},"AGP 9.0",[64,65,66,75,83,91,99,116],"tbody",{},[54,67,68,72],{},[69,70,71],"td",{},"Minimum Gradle",[69,73,74],{},"9.1.0",[54,76,77,80],{},[69,78,79],{},"Minimum JDK",[69,81,82],{},"17",[54,84,85,88],{},[69,86,87],{},"SDK Build Tools",[69,89,90],{},"36.0.0",[54,92,93,96],{},[69,94,95],{},"Kotlin Gradle plugin",[69,97,98],{},"Runtime dependency on 2.2.10. A lower version is upgraded automatically",[54,100,101,106],{},[69,102,103],{},[21,104,105],{},"android.builtInKotlin",[69,107,108,109,112,113],{},"Default changes from ",[21,110,111],{},"false"," to ",[21,114,115],{},"true",[54,117,118,123],{},[69,119,120],{},[21,121,122],{},"android.newDsl",[69,124,108,125,112,127],{},[21,126,111],{},[21,128,115],{},[14,130,131,132,139],{},"Source for the table: ",[133,134,138],"a",{"href":135,"rel":136},"https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Freleases\u002Fagp-9-0-0-release-notes",[137],"nofollow","AGP 9.0.1 release notes",".",[14,141,142,143,146,147,149,150,153,154,157,158,161,162,165,166,169,170,173],{},"Google's notes say you no longer apply ",[21,144,145],{},"org.jetbrains.kotlin.android"," or ",[21,148,23],{}," to compile Kotlin, and that the plugin is not compatible with the new DSL. With the new DSL on, the legacy ",[21,151,152],{},"BaseExtension"," and the old variant API, such as ",[21,155,156],{},"applicationVariants",", are removed. Google also lists changed defaults for other ",[21,159,160],{},"android.*"," properties, including ",[21,163,164],{},"android.useAndroidx",", ",[21,167,168],{},"android.uniquePackageNames"," and ",[21,171,172],{},"android.r8.strictFullModeForKeepRules",". Check the full list in the notes if you set any of them.",[40,175,177],{"id":176},"the-error-you-will-see","The error you will see",[14,179,180],{},"Flutter's issue #181383 shows this output from a plugin (camera_android_camerax 0.6.27) that still applies the Kotlin plugin under AGP 9.0. The first line and the explanation read:",[182,183,184],"blockquote",{},[14,185,186],{},"Failed to apply plugin 'kotlin-android'.",[182,188,189],{},[14,190,191],{},"The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0.",[14,193,194],{},"The same issue shows Flutter's own message for your app's Gradle file, starting with \"Starting AGP 9+, the default has become built-in Kotlin. This results in a build failure when applying the kotlin-android plugin at\" followed by the path of the file.",[14,196,197,198,200],{},"Flutter's docs say the same in plain terms: apps that use the ",[21,199,23],{}," plugin fail to build without migration.",[40,202,204],{"id":203},"where-flutter-stands","Where Flutter stands",[48,206,207,220],{},[51,208,209],{},[54,210,211,214,217],{},[57,212,213],{},"Date",[57,215,216],{},"What happened",[57,218,219],{},"Source",[64,221,222,237,261],{},[54,223,224,227,230],{},[69,225,226],{},"January 27, 2026",[69,228,229],{},"Flutter opens its tracking issue \"Flutter Fully Supports AGP 9\"",[69,231,232],{},[133,233,236],{"href":234,"rel":235},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F181557",[137],"Flutter issue #181557",[54,238,239,244,249],{},[69,240,241],{},[17,242,243],{},"May 18, 2026",[69,245,246],{},[17,247,248],{},"Flutter 3.44.0: AGP 9 support with built-in Kotlin disabled",[69,250,251,165,256],{},[133,252,255],{"href":253,"rel":254},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fmigrate-to-built-in-kotlin",[137],"Flutter docs",[133,257,260],{"href":258,"rel":259},"https:\u002F\u002Fstorage.googleapis.com\u002Fflutter_infra_release\u002Freleases\u002Freleases_macos.json",[137],"release archive",[54,262,263,268,277],{},[69,264,265],{},[17,266,267],{},"August 12, 2026",[69,269,270],{},[17,271,272,273,276],{},"Flutter 3.47.0: ",[21,274,275],{},"android.builtInKotlin=true"," is supported",[69,278,279,165,282],{},[133,280,255],{"href":253,"rel":281},[137],[133,283,260],{"href":258,"rel":284},[137],[14,286,287],{},"The tracking issue says Flutter found that all plugins in an Android project must also migrate to built-in Kotlin to avoid build failures. Because AGP 9 had already launched, Flutter says it advised developers against adopting AGP 9 until it could support all migration states. The issue was still open on October 18, 2026, with some work items unchecked.",[40,289,291],{"id":290},"the-fix","The fix",[14,293,294,295,300],{},"These steps follow Flutter's ",[133,296,299],{"href":297,"rel":298},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fmigrate-to-built-in-kotlin\u002Ffor-app-developers",[137],"guide for app developers",". My advice: commit your work first, and change one thing at a time so you know which step fixed the build.",[302,303,305],"h3",{"id":304},"_1-upgrade-flutter","1. Upgrade Flutter",[14,307,308],{},"Use Flutter 3.44 or later. Flutter's docs say 3.44 added AGP 9 support with built-in Kotlin disabled. If you want to turn built-in Kotlin on, you need 3.47 or later.",[302,310,312],{"id":311},"_2-get-the-build-working-with-the-opt-out-flags","2. Get the build working with the opt-out flags",[14,314,315,316,318],{},"Flutter's guide says the app should have these two flags in ",[21,317,28],{},":",[320,321,326],"pre",{"className":322,"code":323,"language":324,"meta":325,"style":325},"language-properties shiki shiki-themes github-light github-dark","android.builtInKotlin=false\nandroid.newDsl=false\n","properties","",[21,327,328,336],{"__ignoreMap":325},[329,330,333],"span",{"class":331,"line":332},"line",1,[329,334,335],{},"android.builtInKotlin=false\n",[329,337,339],{"class":331,"line":338},2,[329,340,341],{},"android.newDsl=false\n",[14,343,344,345,146,348,351,352,355],{},"Flutter's migrator adds them on the next ",[21,346,347],{},"flutter run",[21,349,350],{},"flutter build apk",", or when you build from Android Studio. Add-to-app host apps must add both flags by hand to the host project's ",[21,353,354],{},"gradle.properties",", because the migrator can't run during native host builds.",[14,357,358,359,362,363,366,367,369],{},"Issue #191703 is an add-to-app report on Flutter 3.47.1 with AGP 9.2.1 and Gradle 9.6.1. The reporter hit a ",[21,360,361],{},"NullPointerException"," in ",[21,364,365],{},"getLegacyAndroidExtension"," with the AGP 9 defaults, and says setting both flags to ",[21,368,111],{}," fixed it. That issue was still open when I checked.",[302,371,373],{"id":372},"_3-migrate-the-app-to-built-in-kotlin","3. Migrate the app to built-in Kotlin",[14,375,376,377,380,381,384,385,387,388,146,391,394,395,397,398,401,402,405],{},"This applies only if your app already applies the Kotlin Gradle plugin, and only on Flutter 3.47 or later. If your app doesn't apply it, Flutter's guide says ",[21,378,379],{},"android.newDsl=false"," is all you need, so stop here. Do this step together with step 5, because with ",[21,382,383],{},"android.builtInKotlin=false"," the app still needs ",[21,386,23],{}," to compile Kotlin. On Flutter 3.44 to 3.46, stop after step 2. In ",[21,389,390],{},"android\u002Fapp\u002Fbuild.gradle",[21,392,393],{},"build.gradle.kts",", Flutter's guide says to remove the ",[21,396,23],{}," plugin and the ",[21,399,400],{},"kotlinOptions"," block, then add a ",[21,403,404],{},"kotlin"," block:",[320,407,410],{"className":408,"code":409,"language":404,"meta":325,"style":325},"language-kotlin shiki shiki-themes github-light github-dark","plugins {\n    id(\"com.android.application\")\n    \u002F\u002F ...\n}\n\nandroid {\n    \u002F\u002F ...\n}\n\nkotlin {\n    compilerOptions {\n        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17\n    }\n}\n",[21,411,412,417,422,428,434,441,447,452,457,462,468,474,480,486],{"__ignoreMap":325},[329,413,414],{"class":331,"line":332},[329,415,416],{},"plugins {\n",[329,418,419],{"class":331,"line":338},[329,420,421],{},"    id(\"com.android.application\")\n",[329,423,425],{"class":331,"line":424},3,[329,426,427],{},"    \u002F\u002F ...\n",[329,429,431],{"class":331,"line":430},4,[329,432,433],{},"}\n",[329,435,437],{"class":331,"line":436},5,[329,438,440],{"emptyLinePlaceholder":439},true,"\n",[329,442,444],{"class":331,"line":443},6,[329,445,446],{},"android {\n",[329,448,450],{"class":331,"line":449},7,[329,451,427],{},[329,453,455],{"class":331,"line":454},8,[329,456,433],{},[329,458,460],{"class":331,"line":459},9,[329,461,440],{"emptyLinePlaceholder":439},[329,463,465],{"class":331,"line":464},10,[329,466,467],{},"kotlin {\n",[329,469,471],{"class":331,"line":470},11,[329,472,473],{},"    compilerOptions {\n",[329,475,477],{"class":331,"line":476},12,[329,478,479],{},"        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17\n",[329,481,483],{"class":331,"line":482},13,[329,484,485],{},"    }\n",[329,487,489],{"class":331,"line":488},14,[329,490,433],{},[14,492,493,494,497,498,139],{},"The guide has the same change for the older Groovy ",[21,495,496],{},"apply plugin"," syntax and for add-to-app host apps that use ",[21,499,500],{},"alias(libs.plugins.kotlin.android)",[302,502,504],{"id":503},"_4-check-your-plugins","4. Check your plugins",[14,506,507],{},"Your plugins matter just as much as your own Gradle files. Flutter's guide says that if a build fails because a plugin has not migrated, you should check its changelog on pub.dev and file an issue titled \"Migrate plugin to built-in Kotlin\" with the plugin's authors. The guide links a separate migration guide for plugin authors.",[302,509,511],{"id":510},"_5-turn-built-in-kotlin-on","5. Turn built-in Kotlin on",[14,513,514,515,517],{},"Once the app and its plugins are migrated, Flutter's guide says to set this in ",[21,516,28],{},", on Flutter 3.47 or later, in the same change as step 3:",[320,519,521],{"className":322,"code":520,"language":324,"meta":325,"style":325},"android.builtInKotlin=true\n",[21,522,523],{"__ignoreMap":325},[329,524,525],{"class":331,"line":332},[329,526,520],{},[14,528,529,530,146,532,534],{},"Then run ",[21,531,347],{},[21,533,350],{}," and confirm the app builds and launches.",[40,536,538],{"id":537},"about-the-agp-upgrade-assistant","About the AGP Upgrade Assistant",[14,540,541,542,545,546,549,550,553],{},"Android Studio has a tool under ",[17,543,544],{},"Tools > AGP Upgrade Assistant",". Google says it translates build files for a newer AGP, checks AGP and Gradle compatibility, and checks third-party Gradle plugin versions. Google also says it relies on static analysis, doesn't support some setups such as Gradle Version Catalogs defined in settings files, and might still fail to perform a clean upgrade. In a Flutter project, my advice: use it on the ",[21,547,548],{},"android"," folder only as a starting point, and test with ",[21,551,552],{},"flutter build"," afterward.",[40,555,557],{"id":556},"if-the-build-still-fails-after-this","If the build still fails after this",[14,559,560,561,563],{},"Flutter's docs say it will remove support for applying the Kotlin Gradle plugin in a future version, and later remove support for the old AGP DSL. Google's notes say the new DSL opt-out will be removed in AGP 10.0. So I'd treat the two ",[21,562,111],{}," flags as a temporary bridge, not a fix.",[14,565,566,567,570,571,575,576,580,581,139],{},"If your error is about ",[21,568,569],{},"apply from: flutter.gradle",", see ",[133,572,574],{"href":573},"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F","the imperative apply fix",". If it names the v1 embedding, see ",[133,577,579],{"href":578},"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F","the v1 embedding guide",". If Play Console flags page sizes after you update Android tooling, see ",[133,582,584],{"href":583},"\u002Fblog\u002Fgoogle-play-16kb-page-size-flutter-android-2026\u002F","the 16 KB guide",[40,586,588],{"id":587},"need-a-hand","Need a hand?",[14,590,591,592,596,597,139],{},"If your Flutter Android build still fails after the AGP upgrade, the ",[133,593,595],{"href":594},"\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 ",[133,598,600],{"href":599},"\u002Fcontact\u002F","send me a short description",[602,603,604],"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":325,"searchDepth":338,"depth":338,"links":606},[607,608,609,610,617,618,619],{"id":42,"depth":338,"text":43},{"id":176,"depth":338,"text":177},{"id":203,"depth":338,"text":204},{"id":290,"depth":338,"text":291,"children":611},[612,613,614,615,616],{"id":304,"depth":424,"text":305},{"id":311,"depth":424,"text":312},{"id":372,"depth":424,"text":373},{"id":503,"depth":424,"text":504},{"id":510,"depth":424,"text":511},{"id":537,"depth":338,"text":538},{"id":556,"depth":338,"text":557},{"id":587,"depth":338,"text":588},"AI & Technology","2026-10-18T21:00:00.000Z","Android Gradle Plugin 9 turns on built-in Kotlin by default, so a Flutter app that still applies kotlin-android can fail with \"The 'org.jetbrains.kotlin.android' plugin is no longer required for Kotlin support since AGP 9.0.\" What breaks, which Flutter version handles it, and the flags and Gradle edits that fix it, from Android's and Flutter's docs checked October 18, 2026.",null,"md",[626,629,632,635,638],{"question":627,"answer":628},"Why does my Flutter Android build fail after upgrading to AGP 9?","AGP 9.0 turns built-in Kotlin on by default. A project that still applies kotlin-android or org.jetbrains.kotlin.android hits a build failure. Flutter's docs say apps that use the kotlin-android plugin fail to build without migration, or without the opt-out flags.",{"question":630,"answer":631},"Which Flutter version supports AGP 9?","Flutter's docs say Flutter 3.44 added AGP 9 support with built-in Kotlin disabled, and that setting android.builtInKotlin=true requires Flutter 3.47 or later. The release archive dates 3.44.0 May 18, 2026 and 3.47.0 August 12, 2026.",{"question":633,"answer":634},"What are the quick flags to get a build working again?","Flutter's migration guide for app developers lists android.builtInKotlin=false and android.newDsl=false in android\u002Fgradle.properties. Flutter's migrator adds them on the next flutter run or flutter build apk. Add-to-app host apps must add them by hand.",{"question":636,"answer":637},"Do I have to migrate to built-in Kotlin?","Flutter recommends it. Its docs say Flutter will remove support for applying the Kotlin Gradle plugin in a future version, and that it will later remove support for the old AGP DSL. Google says the ability to opt out of the new DSL will be removed in AGP 10.0.",{"question":639,"answer":640},"Can the AGP Upgrade Assistant fix this for me?","It can help with build file syntax and version compatibility, from Tools > AGP Upgrade Assistant in Android Studio. Google says it relies on static analysis and might still fail to perform a clean upgrade, so commit your work first and build and test afterward.","Boynton Beach, FL",{"readingTimeStats":643},{"text":644,"minutes":645,"time":646,"words":647},"6 min read",5.33,319800,1066,"\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026","flutter agp 9 build failed","7 min",[652,653,654],"flutter-gradle-plugin-applied-imperatively-fix-2026","flutter-deleted-android-v1-embedding-build-failed-2026","google-play-16kb-page-size-flutter-android-2026",{"title":5,"description":622},[657,659,662,664,666,668,671,674],{"title":658,"url":135},"Android Developers, Android Gradle plugin 9.0.1 release notes (page last updated October 16, 2026)",{"title":660,"url":661},"Android Developers, Android Gradle plugin Upgrade Assistant","https:\u002F\u002Fdeveloper.android.com\u002Fbuild\u002Fagp-upgrade-assistant",{"title":663,"url":253},"Flutter docs, Migrating Flutter Android projects to built-in Kotlin (last updated August 20, 2026)",{"title":665,"url":297},"Flutter docs, Built-in Kotlin migration for app developers (last updated August 20, 2026)",{"title":667,"url":234},"Flutter on GitHub, issue #181557 \"Flutter Fully Supports AGP 9\"",{"title":669,"url":670},"Flutter on GitHub, issue #181383 \"[many] Flutter maintained plugins should support AGP 9.0\"","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F181383",{"title":672,"url":673},"Flutter on GitHub, issue #191703 \"[add-to-app] FGP throws NPE in getLegacyAndroidExtension when the host app builds with AGP 9 defaults (newDsl)\"","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F191703",{"title":675,"url":258},"Flutter release archive (macOS)","blog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026","flutter agp 9 build failed, android gradle plugin 9 flutter, kotlin-android plugin no longer required agp 9, android.builtInKotlin, android.newDsl false, flutter built-in kotlin migration, flutter 3.44 agp 9, flutter 3.47 builtinkotlin, agp upgrade assistant flutter, flutter plugin failed to apply plugin kotlin-android",[679,680,681,682,683],"AGP 9.0 changes two defaults: android.builtInKotlin goes from false to true, and android.newDsl goes from false to true. Google says the org.jetbrains.kotlin.android plugin is not compatible with the new DSL and must be removed.","AGP 9.0 needs at least Gradle 9.1.0, JDK 17 and SDK Build Tools 36.0.0, and it has a runtime dependency on Kotlin Gradle plugin 2.2.10.","Flutter 3.44.0 (May 18, 2026) added AGP 9 support with built-in Kotlin turned off. Setting android.builtInKotlin=true needs Flutter 3.47 or later, and 3.47.0 came out on August 12, 2026.","Flutter's own tracking issue for full AGP 9 support was still open on October 18, 2026. Plugins that still apply kotlin-android can block your build, even when your app is migrated.","The safe path is to add android.builtInKotlin=false and android.newDsl=false to android\u002Fgradle.properties, get the build green, then migrate the app and its plugins and turn the flags on.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-android-gradle-plugin-9-build-failed-fix-2026\u002F","bDFV6JaPNN_3zq5ObHqUbRNBx7EOfr7rc7ikyLH7yXc",[687,1351,1986],{"id":688,"title":689,"author":690,"body":692,"category":620,"createdAt":1296,"description":1297,"disclosure":623,"extension":624,"faq":1298,"howTo":623,"lastVerified":623,"location":641,"meta":1314,"navigation":439,"ogImage":623,"path":1320,"primaryKeyword":1321,"readingTime":650,"related":1322,"seo":1325,"sources":1326,"stem":1341,"tags":1342,"takeaways":1343,"updatedAt":1296,"url":1349,"__hash__":1350},"blog\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026.md","Flutter \"Applying Gradle Plugin Imperatively\" Error: The Fix",{"name":7,"social":691},{"twitter":9},{"type":11,"value":693,"toc":1281},[694,708,711,715,719,809,812,816,819,844,847,851,861,865,884,888,898,1033,1045,1049,1066,1070,1088,1108,1111,1139,1161,1165,1171,1175,1178,1251,1254,1256,1270,1272,1279],[14,695,696,699,700,703,704,707],{},[17,697,698],{},"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 ",[21,701,702],{},"flutter.gradle"," file now does nothing but throw this error. The fix is to move three Gradle files to the declarative ",[21,705,706],{},"plugins {}"," block. It changes how the build is wired, not your app's code.",[14,709,710],{},"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,712,713,38],{},[17,714,37],{},[40,716,718],{"id":717},"what-changed-and-when","What changed, and when",[48,720,721,731],{},[51,722,723],{},[54,724,725,727,729],{},[57,726,213],{},[57,728,216],{},[57,730,219],{},[64,732,733,757,773,788],{},[54,734,735,738,748],{},[69,736,737],{},"November 15, 2023",[69,739,740,741,743,744,747],{},"Flutter 3.16 adds support for the declarative ",[21,742,706],{}," block. New ",[21,745,746],{},"flutter create"," projects use it",[69,749,750,165,754],{},[133,751,255],{"href":752,"rel":753},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fflutter-gradle-plugin-apply",[137],[133,755,260],{"href":258,"rel":756},[137],[54,758,759,762,765],{},[69,760,761],{},"February 15, 2024",[69,763,764],{},"Flutter 3.19: the declarative block is the recommended way",[69,766,767,165,770],{},[133,768,255],{"href":752,"rel":769},[137],[133,771,260],{"href":258,"rel":772},[137],[54,774,775,778,781],{},[69,776,777],{},"January 7, 2025",[69,779,780],{},"Pull request #160947 removes support for the imperative apply",[69,782,783],{},[133,784,787],{"href":785,"rel":786},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fpull\u002F160947",[137],"Flutter PR #160947",[54,789,790,795,800],{},[69,791,792],{},[17,793,794],{},"February 12, 2025",[69,796,797],{},[17,798,799],{},"Flutter 3.29.0, the first stable release that includes that change",[69,801,802,165,806],{},[133,803,805],{"href":258,"rel":804},[137],"Release archive",[133,807,787],{"href":785,"rel":808},[137],[14,810,811],{},"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.",[302,813,815],{"id":814},"the-two-versions-of-the-error","The two versions of the error",[14,817,818],{},"Both come from files in Flutter's own Gradle folder that now exist only to throw an error:",[820,821,822,834],"ul",{},[823,824,825,827,828,830,831,139],"li",{},[21,826,702],{},": \"You are applying Flutter's main Gradle plugin imperatively using the apply script method, which is not possible anymore.\" This means ",[21,829,390],{}," still has ",[21,832,833],{},"apply from: \"...\u002Fflutter.gradle\"",[823,835,836,839,840,843],{},[21,837,838],{},"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 ",[21,841,842],{},"android\u002Fsettings.gradle"," still loads the plugin loader the old way.",[14,845,846],{},"Both point to the same migration page, and the fix below covers both.",[40,848,850],{"id":849},"the-fix-file-by-file","The fix, file by file",[14,852,294,853,857,858,860],{},[133,854,856],{"href":752,"rel":855},[137],"migration page",". My advice: commit or back up the ",[21,859,548],{}," folder before you start, so you can compare.",[302,862,864],{"id":863},"_1-note-your-agp-and-kotlin-versions","1. Note your AGP and Kotlin versions",[14,866,867,868,871,872,875,876,879,880,883],{},"Open ",[21,869,870],{},"android\u002Fbuild.gradle",". In the ",[21,873,874],{},"buildscript"," block, the Android Gradle Plugin version is the number at the end of ",[21,877,878],{},"classpath 'com.android.tools.build:gradle:...'",", and the Kotlin version is in ",[21,881,882],{},"ext.kotlin_version = '...'",". You need both in the next step.",[302,885,887],{"id":886},"_2-replace-androidsettingsgradle","2. Replace android\u002Fsettings.gradle",[14,889,890,891,169,894,897],{},"Flutter's page gives this as the new contents. Replace ",[21,892,893],{},"{agpVersion}",[21,895,896],{},"{kotlinVersion}"," with the versions from step 1:",[320,899,903],{"className":900,"code":901,"language":902,"meta":325,"style":325},"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",[21,904,905,910,915,920,925,930,935,940,945,949,954,958,963,968,973,979,984,989,994,999,1005,1011,1017,1022,1027],{"__ignoreMap":325},[329,906,907],{"class":331,"line":332},[329,908,909],{},"pluginManagement {\n",[329,911,912],{"class":331,"line":338},[329,913,914],{},"    def flutterSdkPath = {\n",[329,916,917],{"class":331,"line":424},[329,918,919],{},"        def properties = new Properties()\n",[329,921,922],{"class":331,"line":430},[329,923,924],{},"        file(\"local.properties\").withInputStream { properties.load(it) }\n",[329,926,927],{"class":331,"line":436},[329,928,929],{},"        def flutterSdkPath = properties.getProperty(\"flutter.sdk\")\n",[329,931,932],{"class":331,"line":443},[329,933,934],{},"        assert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\n",[329,936,937],{"class":331,"line":449},[329,938,939],{},"        return flutterSdkPath\n",[329,941,942],{"class":331,"line":454},[329,943,944],{},"    }()\n",[329,946,947],{"class":331,"line":459},[329,948,440],{"emptyLinePlaceholder":439},[329,950,951],{"class":331,"line":464},[329,952,953],{},"    includeBuild(\"$flutterSdkPath\u002Fpackages\u002Fflutter_tools\u002Fgradle\")\n",[329,955,956],{"class":331,"line":470},[329,957,440],{"emptyLinePlaceholder":439},[329,959,960],{"class":331,"line":476},[329,961,962],{},"    repositories {\n",[329,964,965],{"class":331,"line":482},[329,966,967],{},"        google()\n",[329,969,970],{"class":331,"line":488},[329,971,972],{},"        mavenCentral()\n",[329,974,976],{"class":331,"line":975},15,[329,977,978],{},"        gradlePluginPortal()\n",[329,980,982],{"class":331,"line":981},16,[329,983,485],{},[329,985,987],{"class":331,"line":986},17,[329,988,433],{},[329,990,992],{"class":331,"line":991},18,[329,993,440],{"emptyLinePlaceholder":439},[329,995,997],{"class":331,"line":996},19,[329,998,416],{},[329,1000,1002],{"class":331,"line":1001},20,[329,1003,1004],{},"    id \"dev.flutter.flutter-plugin-loader\" version \"1.0.0\"\n",[329,1006,1008],{"class":331,"line":1007},21,[329,1009,1010],{},"    id \"com.android.application\" version \"{agpVersion}\" apply false\n",[329,1012,1014],{"class":331,"line":1013},22,[329,1015,1016],{},"    id \"org.jetbrains.kotlin.android\" version \"{kotlinVersion}\" apply false\n",[329,1018,1020],{"class":331,"line":1019},23,[329,1021,433],{},[329,1023,1025],{"class":331,"line":1024},24,[329,1026,440],{"emptyLinePlaceholder":439},[329,1028,1030],{"class":331,"line":1029},25,[329,1031,1032],{},"include \":app\"\n",[14,1034,1035,1036,169,1039,1041,1042,139],{},"If you had your own code in this file, keep it after the ",[21,1037,1038],{},"pluginManagement {}",[21,1040,706],{}," blocks. Gradle doesn't allow other code before them. The plugin loader must not be set to ",[21,1043,1044],{},"apply false",[302,1046,1048],{"id":1047},"_3-remove-buildscript-from-androidbuildgradle","3. Remove buildscript from android\u002Fbuild.gradle",[14,1050,1051,1052,1055,1056,165,1059,169,1062,1065],{},"Delete the whole ",[21,1053,1054],{},"buildscript { ... }"," block. The ",[21,1057,1058],{},"allprojects",[21,1060,1061],{},"subprojects",[21,1063,1064],{},"clean"," parts stay.",[302,1067,1069],{"id":1068},"_4-update-androidappbuildgradle","4. Update android\u002Fapp\u002Fbuild.gradle",[14,1071,1072,1073,1076,1077,1080,1081,1084,1085,1087],{},"Remove the ",[21,1074,1075],{},"def flutterRoot = localProperties.getProperty('flutter.sdk')"," line and the ",[21,1078,1079],{},"if (flutterRoot == null) { throw ... }"," block that follows it. Keep the code that loads ",[21,1082,1083],{},"local.properties",", which the version settings still use. Then remove the old apply lines. In Flutter 3.10's ",[21,1086,746],{}," template they look like this:",[320,1089,1091],{"className":900,"code":1090,"language":902,"meta":325,"style":325},"apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply from: \"$flutterRoot\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle\"\n",[21,1092,1093,1098,1103],{"__ignoreMap":325},[329,1094,1095],{"class":331,"line":332},[329,1096,1097],{},"apply plugin: 'com.android.application'\n",[329,1099,1100],{"class":331,"line":338},[329,1101,1102],{},"apply plugin: 'kotlin-android'\n",[329,1104,1105],{"class":331,"line":424},[329,1106,1107],{},"apply from: \"$flutterRoot\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle\"\n",[14,1109,1110],{},"Then add this at the very top of the file:",[320,1112,1114],{"className":900,"code":1113,"language":902,"meta":325,"style":325},"plugins {\n    id \"com.android.application\"\n    id \"kotlin-android\"\n    id \"dev.flutter.flutter-gradle-plugin\"\n}\n",[21,1115,1116,1120,1125,1130,1135],{"__ignoreMap":325},[329,1117,1118],{"class":331,"line":332},[329,1119,416],{},[329,1121,1122],{"class":331,"line":338},[329,1123,1124],{},"    id \"com.android.application\"\n",[329,1126,1127],{"class":331,"line":424},[329,1128,1129],{},"    id \"kotlin-android\"\n",[329,1131,1132],{"class":331,"line":430},[329,1133,1134],{},"    id \"dev.flutter.flutter-gradle-plugin\"\n",[329,1136,1137],{"class":331,"line":436},[329,1138,433],{},[14,1140,1141,1142,1145,1146,362,1149,1152,1153,1156,1157,1160],{},"Flutter's page points out that ",[21,1143,1144],{},"dev.flutter.flutter-gradle-plugin"," here is a different ID from ",[21,1147,1148],{},"dev.flutter.flutter-plugin-loader",[21,1150,1151],{},"settings.gradle",". If the ",[21,1154,1155],{},"dependencies"," block has ",[21,1158,1159],{},"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version",", remove that line.",[302,1162,1164],{"id":1163},"_5-build-and-run","5. Build and run",[14,1166,1167,1168,1170],{},"Flutter's page says to run ",[21,1169,347],{}," and check that the app builds and launches on an Android device or emulator.",[40,1172,1174],{"id":1173},"if-the-app-uses-firebase","If the app uses Firebase",[14,1176,1177],{},"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:",[1179,1180,1181,1198,1209,1236],"ol",{},[823,1182,1183,1184,1186,1187,1190,1191,169,1194,1197],{},"In ",[21,1185,870],{},", remove the ",[21,1188,1189],{},"classpath"," lines for ",[21,1192,1193],{},"com.google.gms:google-services",[21,1195,1196],{},"com.google.firebase:firebase-crashlytics-gradle",". Note their versions first.",[823,1199,1183,1200,1202,1203,169,1206,139],{},[21,1201,390],{},", remove ",[21,1204,1205],{},"apply plugin: 'com.google.gms.google-services'",[21,1207,1208],{},"apply plugin: 'com.google.firebase.crashlytics'",[823,1210,1211,1212,1215,1216,1218,1219,318,1221],{},"Add both to the ",[21,1213,1214],{},"plugins"," block in ",[21,1217,842],{},", with the versions you noted and ",[21,1220,1044],{},[320,1222,1224],{"className":900,"code":1223,"language":902,"meta":325,"style":325},"id \"com.google.gms.google-services\" version \"4.4.0\" apply false\nid \"com.google.firebase.crashlytics\" version \"2.9.9\" apply false\n",[21,1225,1226,1231],{"__ignoreMap":325},[329,1227,1228],{"class":331,"line":332},[329,1229,1230],{},"id \"com.google.gms.google-services\" version \"4.4.0\" apply false\n",[329,1232,1233],{"class":331,"line":338},[329,1234,1235],{},"id \"com.google.firebase.crashlytics\" version \"2.9.9\" apply false\n",[823,1237,1238,1239,169,1242,1245,1246,1215,1248,1250],{},"Add ",[21,1240,1241],{},"id \"com.google.gms.google-services\"",[21,1243,1244],{},"id \"com.google.firebase.crashlytics\""," to the ",[21,1247,1214],{},[21,1249,390],{},", without versions.",[14,1252,1253],{},"The versions above are the ones in Flutter's example. Use the versions your project had, or newer ones.",[40,1255,557],{"id":556},[14,1257,1258,1259,1262,1263,570,1266,139],{},"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 ",[133,1260,1261],{"href":578},"the v1 embedding fix",", also removed in Flutter 3.29. If Gradle can't find ",[21,1264,1265],{},"jcenter()",[133,1267,1269],{"href":1268},"\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026\u002F","the JCenter guide",[40,1271,588],{"id":587},[14,1273,1274,1275,596,1277,139],{},"If an older Flutter app won't build after an upgrade, the ",[133,1276,595],{"href":594},[133,1278,600],{"href":599},[602,1280,604],{},{"title":325,"searchDepth":338,"depth":338,"links":1282},[1283,1286,1293,1294,1295],{"id":717,"depth":338,"text":718,"children":1284},[1285],{"id":814,"depth":424,"text":815},{"id":849,"depth":338,"text":850,"children":1287},[1288,1289,1290,1291,1292],{"id":863,"depth":424,"text":864},{"id":886,"depth":424,"text":887},{"id":1047,"depth":424,"text":1048},{"id":1068,"depth":424,"text":1069},{"id":1163,"depth":424,"text":1164},{"id":1173,"depth":338,"text":1174},{"id":556,"depth":338,"text":557},{"id":587,"depth":338,"text":588},"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.",[1299,1302,1305,1308,1311],{"question":1300,"answer":1301},"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":1303,"answer":1304},"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":1306,"answer":1307},"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":1309,"answer":1310},"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":1312,"answer":1313},"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.",{"readingTimeStats":1315},{"text":1316,"minutes":1317,"time":1318,"words":1319},"5 min read",4.295,257700,859,"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026","applying flutter's main gradle plugin imperatively",[653,1323,1324],"jcenter-bintray-shut-down-fix-android-flutter-builds-2026","flutter-ios-build-failed-after-upgrade-2026",{"title":689,"description":1297},[1327,1329,1331,1334,1337,1340],{"title":1328,"url":752},"Flutter docs, Deprecated imperative apply of Flutter's Gradle plugins (last updated July 31, 2026)",{"title":1330,"url":785},"Flutter on GitHub, pull request #160947 \"Remove support for imperative apply of Flutter Gradle Plugin\"",{"title":1332,"url":1333},"Flutter on GitHub, flutter_tools gradle\u002Fflutter.gradle","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fflutter.gradle",{"title":1335,"url":1336},"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":1338,"url":1339},"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":675,"url":258},"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",[1344,1345,1346,1347,1348],"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",{"id":1352,"title":1353,"author":1354,"body":1356,"category":620,"createdAt":621,"description":1932,"disclosure":623,"extension":624,"faq":1933,"howTo":623,"lastVerified":623,"location":641,"meta":1949,"navigation":439,"ogImage":623,"path":1954,"primaryKeyword":1955,"readingTime":650,"related":1956,"seo":1958,"sources":1959,"stem":1976,"tags":1977,"takeaways":1978,"updatedAt":621,"url":1984,"__hash__":1985},"blog\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026.md","Flutter \"Deleted Android v1 Embedding\" Build Error: The Fix",{"name":7,"social":1355},{"twitter":9},{"type":11,"value":1357,"toc":1923},[1358,1384,1391,1395,1399,1472,1475,1479,1482,1511,1515,1526,1559,1562,1566,1577,1751,1759,1850,1864,1868,1878,1907,1909,1921],[14,1359,1360,1366,1367,1369,1370,169,1373,1376,1377,169,1380,1383],{},[17,1361,1362,1363,1365],{},"If ",[21,1364,552],{}," 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,1368,746],{},", Flutter's guide changes two files: ",[21,1371,1372],{},"MainActivity",[21,1374,1375],{},"AndroidManifest.xml",". Custom channel code or a splash screen adds a little more. If the build instead fails inside a plugin with ",[21,1378,1379],{},"cannot find symbol",[21,1381,1382],{},"PluginRegistry.Registrar",", the plugin is the problem, and a newer version of it usually fixes it.",[14,1385,1386,1387,1390],{},"If you landed here from an old link to Flutter's \"Upgrading pre 1.12 Android projects\" wiki page or an old ",[21,1388,1389],{},"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,1392,1393,38],{},[17,1394,37],{},[40,1396,1398],{"id":1397},"what-happened-to-the-v1-embedding-and-when","What happened to the v1 embedding, and when",[48,1400,1401,1411],{},[51,1402,1403],{},[54,1404,1405,1407,1409],{},[57,1406,213],{},[57,1408,216],{},[57,1410,219],{},[64,1412,1413,1435,1451],{},[54,1414,1415,1418,1425],{},[69,1416,1417],{},"December 11, 2019",[69,1419,1420,1421,1424],{},"Flutter 1.12 reaches stable with the v2 Android embedding (",[21,1422,1423],{},"io.flutter.embedding",")",[69,1426,1427,165,1432],{},[133,1428,1431],{"href":1429,"rel":1430},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fandroid-v1-embedding-create-deprecation",[137],"Flutter deprecation page",[133,1433,260],{"href":258,"rel":1434},[137],[54,1436,1437,1440,1446],{},[69,1438,1439],{},"October 1, 2020",[69,1441,1442,1443,1445],{},"Flutter 1.22: ",[21,1444,746],{}," only makes v2 apps and plugins. Existing v1 apps keep working, but get a migration warning when they use plugins",[69,1447,1448],{},[133,1449,1431],{"href":1429,"rel":1450},[137],[54,1452,1453,1457,1462],{},[69,1454,1455],{},[17,1456,794],{},[69,1458,1459],{},[17,1460,1461],{},"Flutter 3.29 removes the v1 embedding Java classes",[69,1463,1464,165,1469],{},[133,1465,1468],{"href":1466,"rel":1467},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fv1-android-embedding",[137],"Flutter removal page",[133,1470,260],{"href":258,"rel":1471},[137],[14,1473,1474],{},"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.",[302,1476,1478],{"id":1477},"what-the-old-addresses-do-today","What the old addresses do today",[14,1480,1481],{},"Checked on October 18, 2026:",[820,1483,1484,1495,1505],{},[823,1485,1486,1487,1490,1491,1494],{},"The ",[17,1488,1489],{},"\"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,1492,1493],{},"docs"," folder.",[823,1496,1497,1500,1501,1504],{},[17,1498,1499],{},"flutter.dev\u002Fgo\u002Fandroid-project-migration"," now redirects to Flutter's ",[17,1502,1503],{},"AndroidX migration"," page, which doesn't cover the v1 embedding. The embedding steps are in the repository doc above.",[823,1506,1507,1510],{},[17,1508,1509],{},"flutter.dev\u002Fgo\u002Fandroid-plugin-migration"," redirects to \"Supporting the new Android plugins APIs\", which is still the right page for plugin authors.",[40,1512,1514],{"id":1513},"why-flutter-says-your-app-is-v1","Why Flutter says your app is v1",[14,1516,1517,1518,1521,1522,1525],{},"The check is in the Flutter tool's ",[21,1519,1520],{},"project.dart",". It reads ",[21,1523,1524],{},"android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml"," and treats the app as v1 when:",[820,1527,1528,1539,1549,1556],{},[823,1529,1530,1531,1534,1535,1538],{},"the ",[21,1532,1533],{},"\u003Capplication>"," tag has ",[21,1536,1537],{},"android:name=\"io.flutter.app.FlutterApplication\"",", or",[823,1540,1541,1542,1545,1546,1538],{},"there is a ",[21,1543,1544],{},"flutterEmbedding"," meta-data tag with value ",[21,1547,1548],{},"1",[823,1550,1551,1552,1555],{},"there is no ",[21,1553,1554],{},"\u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>"," at all, or",[823,1557,1558],{},"the manifest file is missing.",[14,1560,1561],{},"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,1563,1565],{"id":1564},"fixing-the-app","Fixing the app",[14,1567,1568,1569,1574,1575,139],{},"These are the steps from Flutter's ",[133,1570,1573],{"href":1571,"rel":1572},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fdocs\u002Fplatforms\u002Fandroid\u002FUpgrading-pre-1.12-Android-projects.md",[137],"Upgrading pre 1.12 Android projects"," guide, for a project made with ",[21,1576,746],{},[1179,1578,1579,1639,1668,1683,1713,1734],{},[823,1580,1581,1586,1587,112,1590,1593,1594,1597,1598,1601,1602,1605,1606,1625,1628,1629,1632,1633,169,1636,139],{},[17,1582,1583,1584,139],{},"Update ",[21,1585,1372],{}," Change ",[21,1588,1589],{},"import io.flutter.app.FlutterActivity",[21,1591,1592],{},"import io.flutter.embedding.android.FlutterActivity"," and delete the ",[21,1595,1596],{},"onCreate"," override that calls ",[21,1599,1600],{},"GeneratedPluginRegistrant.registerWith(this)",". The new ",[21,1603,1604],{},"FlutterActivity"," registers plugins itself.",[320,1607,1609],{"className":408,"code":1608,"language":404,"meta":325,"style":325},"import io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n",[21,1610,1611,1616,1620],{"__ignoreMap":325},[329,1612,1613],{"class":331,"line":332},[329,1614,1615],{},"import io.flutter.embedding.android.FlutterActivity\n",[329,1617,1618],{"class":331,"line":338},[329,1619,440],{"emptyLinePlaceholder":439},[329,1621,1622],{"class":331,"line":424},[329,1623,1624],{},"class MainActivity: FlutterActivity()\n",[1626,1627],"br",{},"If your file is ",[21,1630,1631],{},"MainActivity.java",", the guide's result is the same: ",[21,1634,1635],{},"import io.flutter.embedding.android.FlutterActivity;",[21,1637,1638],{},"public class MainActivity extends FlutterActivity {}",[823,1640,1641,1644,1645,1647,1648,1651,1652,1655,1656,1659,1660,1663,1664,1667],{},[17,1642,1643],{},"Move any platform channel code."," If ",[21,1646,1596],{}," also set up a ",[21,1649,1650],{},"MethodChannel",", move it into a ",[21,1653,1654],{},"configureFlutterEngine(flutterEngine)"," override, and use ",[21,1657,1658],{},"flutterEngine.getDartExecutor().getBinaryMessenger()"," instead of ",[21,1661,1662],{},"getFlutterView()",". The guide's example also calls ",[21,1665,1666],{},"GeneratedPluginRegistrant.registerWith(flutterEngine)"," at the start of that override.",[823,1669,1670,1673,1674,1676,1677,1679,1680,139],{},[17,1671,1672],{},"Fix the application tag."," In ",[21,1675,1375],{},", replace ",[21,1678,1537],{}," with ",[21,1681,1682],{},"android:name=\"${applicationName}\"",[823,1684,1685,1688,1689,318,1691],{},[17,1686,1687],{},"Declare the v2 embedding."," Add this inside ",[21,1690,1533],{},[320,1692,1696],{"className":1693,"code":1694,"language":1695,"meta":325,"style":325},"language-xml shiki shiki-themes github-light github-dark","\u003Cmeta-data\n    android:name=\"flutterEmbedding\"\n    android:value=\"2\" \u002F>\n","xml",[21,1697,1698,1703,1708],{"__ignoreMap":325},[329,1699,1700],{"class":331,"line":332},[329,1701,1702],{},"\u003Cmeta-data\n",[329,1704,1705],{"class":331,"line":338},[329,1706,1707],{},"    android:name=\"flutterEmbedding\"\n",[329,1709,1710],{"class":331,"line":424},[329,1711,1712],{},"    android:value=\"2\" \u002F>\n",[823,1714,1715,1718,1719,1722,1723,1726,1727,362,1730,1733],{},[17,1716,1717],{},"Update the splash screen if you had one."," Remove meta-data named ",[21,1720,1721],{},"io.flutter.app.android.SplashScreenUntilFirstFrame",". The guide shows the replacement: a ",[21,1724,1725],{},"LaunchTheme"," and a ",[21,1728,1729],{},"NormalTheme",[21,1731,1732],{},"styles.xml",", set on the activity.",[823,1735,1736,1739,1740,1742,1743,1746,1747,1750],{},[17,1737,1738],{},"Rebuild."," The guide says the app should then build as normal, for example with ",[21,1741,350],{},". My advice: run ",[21,1744,1745],{},"flutter clean"," first, and ",[21,1748,1749],{},"flutter pub upgrade"," too, because a project this old usually has plugins that are out of date as well.",[14,1752,1753,1754,1758],{},"If your own code uses other removed classes, Flutter's ",[133,1755,1757],{"href":1466,"rel":1756},[137],"removal page"," lists the replacements:",[48,1760,1761,1771],{},[51,1762,1763],{},[54,1764,1765,1768],{},[57,1766,1767],{},"Removed class",[57,1769,1770],{},"Use instead",[64,1772,1773,1785,1797,1811,1823,1835],{},[54,1774,1775,1780],{},[69,1776,1777],{},[21,1778,1779],{},"io.flutter.app.FlutterActivity",[69,1781,1782],{},[21,1783,1784],{},"io.flutter.embedding.android.FlutterActivity",[54,1786,1787,1792],{},[69,1788,1789],{},[21,1790,1791],{},"io.flutter.app.FlutterFragmentActivity",[69,1793,1794],{},[21,1795,1796],{},"io.flutter.embedding.android.FlutterFragmentActivity",[54,1798,1799,1804],{},[69,1800,1801],{},[21,1802,1803],{},"io.flutter.app.FlutterApplication",[69,1805,1806,1807,1810],{},"Removed. Extend ",[21,1808,1809],{},"android.app.Application"," if you need a custom one",[54,1812,1813,1818],{},[69,1814,1815],{},[21,1816,1817],{},"io.flutter.app.FlutterPlayStoreSplitApplication",[69,1819,1820],{},[21,1821,1822],{},"io.flutter.embedding.android.FlutterPlayStoreSplitApplication",[54,1824,1825,1830],{},[69,1826,1827],{},[21,1828,1829],{},"io.flutter.view.FlutterMain",[69,1831,1832],{},[21,1833,1834],{},"io.flutter.embedding.engine.loader.FlutterLoader",[54,1836,1837,1845],{},[69,1838,1839,169,1842],{},[21,1840,1841],{},"io.flutter.view.FlutterView",[21,1843,1844],{},"FlutterNativeView",[69,1846,1847],{},[21,1848,1849],{},"io.flutter.embedding.android.FlutterView",[14,1851,1852,1853,169,1856,1859,1860,1863],{},"For add-to-app projects, the same guide has a separate section: remove calls to ",[21,1854,1855],{},"FlutterMain.startInitialization",[21,1857,1858],{},"ensureInitializationComplete",", and replace the ",[21,1861,1862],{},"io.flutter.facade"," classes.",[40,1865,1867],{"id":1866},"fixing-a-plugin-that-still-uses-pluginregistryregistrar","Fixing a plugin that still uses PluginRegistry.Registrar",[14,1869,1870,1871,1874,1875,1877],{},"If the error points at a plugin, its Android code usually still has a ",[21,1872,1873],{},"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,1876,1749],{}," to get newer plugin versions, and file an issue if that doesn't help.",[820,1879,1880,1893],{},[823,1881,1882,1885,1886,1888,1889,1892],{},[17,1883,1884],{},"If you use the plugin:"," upgrade it, as the tool suggests. My advice: if ",[21,1887,1749],{}," doesn't move it, check pub.dev for a newer major version and run ",[21,1890,1891],{},"flutter pub upgrade --major-versions",". If the plugin has had no release in years, replace it.",[823,1894,1895,1898,1899,1902,1903,1906],{},[17,1896,1897],{},"If you maintain the plugin:"," Flutter's removal page says to delete the ",[21,1900,1901],{},"registerWith"," method from your ",[21,1904,1905],{},"FlutterPlugin"," implementation. The Flutter team did the same for its own plugins in flutter\u002Fpackages#6494.",[40,1908,588],{"id":587},[14,1910,1274,1911,1913,1914,1918,1919,139],{},[133,1912,595],{"href":594}," 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 ",[133,1915,1917],{"href":1916},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","Flutter iOS build failed after an upgrade",", or ",[133,1920,600],{"href":599},[602,1922,604],{},{"title":325,"searchDepth":338,"depth":338,"links":1924},[1925,1928,1929,1930,1931],{"id":1397,"depth":338,"text":1398,"children":1926},[1927],{"id":1477,"depth":424,"text":1478},{"id":1513,"depth":338,"text":1514},{"id":1564,"depth":338,"text":1565},{"id":1866,"depth":338,"text":1867},{"id":587,"depth":338,"text":588},"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.",[1934,1937,1940,1943,1946],{"question":1935,"answer":1936},"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":1938,"answer":1939},"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":1941,"answer":1942},"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":1944,"answer":1945},"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":1947,"answer":1948},"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":1950},{"text":1316,"minutes":1951,"time":1952,"words":1953},4.1,246000,820,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding",[1324,1323,1957],"how-to-debug-a-flutter-firebase-bug-2026",{"title":1353,"description":1932},[1960,1962,1964,1966,1969,1972,1975],{"title":1961,"url":1466},"Flutter docs, Removal of v1 Android embedding Java APIs (last updated July 31, 2026)",{"title":1963,"url":1429},"Flutter docs, Android v1 embedding app and plugin creation deprecation",{"title":1965,"url":1571},"Flutter on GitHub, Upgrading pre 1.12 Android projects",{"title":1967,"url":1968},"Flutter docs, Supporting the new Android plugins APIs","https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fplugin-api-migration",{"title":1970,"url":1971},"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":1973,"url":1974},"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":675,"url":258},"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",[1979,1980,1981,1982,1983],"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":1987,"title":1988,"author":1989,"body":1991,"category":620,"createdAt":2335,"description":2336,"disclosure":623,"extension":624,"faq":2337,"howTo":623,"lastVerified":623,"location":641,"meta":2353,"navigation":439,"ogImage":623,"path":2358,"primaryKeyword":2359,"readingTime":650,"related":2360,"seo":2364,"sources":2365,"stem":2380,"tags":2381,"takeaways":2382,"updatedAt":2335,"url":2388,"__hash__":2389},"blog\u002Fblog\u002Fgoogle-play-16kb-page-size-flutter-android-2026.md","Google Play 16 KB Page Size: Fixing Flutter and Android Apps",{"name":7,"social":1990},{"twitter":9},{"type":11,"value":1992,"toc":2326},[1993,1999,2002,2007,2011,2060,2063,2066,2070,2089,2093,2096,2134,2138,2148,2206,2210,2248,2251,2254,2293,2308,2315,2317,2324],[14,1994,1995,1998],{},[17,1996,1997],{},"If Play Console warns that your app doesn't support 16 KB memory page sizes, the fix is usually a newer Android Gradle Plugin and NDK, plus updated native dependencies."," Google requires apps targeting Android 15 and higher to support 16 KB pages on 64-bit devices, and says that starting February 1, 2027, updates without it can't be released. In my experience every Flutter Android app ships native code, so Flutter apps are in scope, and Flutter 3.38 is the first version that defaults to the NDK Google's fix needs.",[14,2000,2001],{},"The facts below come from Google's page-size guide, Google's May 2025 announcement, Flutter's 3.38 release post and Flutter's source code, as listed in the sources. I checked each one on October 18, 2026.",[14,2003,2004,2006],{},[17,2005,37],{}," App369 is my studio. I build and fix Android and iOS apps, mostly in Flutter, and the last section mentions what I sell. Google doesn't pay me for anything on this page.",[40,2008,2010],{"id":2009},"the-requirement-and-the-dates","The requirement and the dates",[48,2012,2013,2024],{},[51,2014,2015],{},[54,2016,2017,2019,2022],{},[57,2018,213],{},[57,2020,2021],{},"What Google said",[57,2023,219],{},[64,2025,2026,2041],{},[54,2027,2028,2031,2034],{},[69,2029,2030],{},"May 2025",[69,2032,2033],{},"From November 1, 2025, new apps and updates targeting Android 15+ must support 16 KB page sizes",[69,2035,2036],{},[133,2037,2040],{"href":2038,"rel":2039},"https:\u002F\u002Fandroid-developers.googleblog.com\u002F2025\u002F05\u002Fprepare-play-apps-for-devices-with-16kb-page-size.html",[137],"Android Developers Blog",[54,2042,2043,2048,2053],{},[69,2044,2045],{},[17,2046,2047],{},"As of October 16, 2026",[69,2049,2050],{},[17,2051,2052],{},"Apps targeting Android 15+ must support 16 KB pages on 64-bit devices. From February 1, 2027, updates that don't can't be released",[69,2054,2055],{},[133,2056,2059],{"href":2057,"rel":2058},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Fpractices\u002Fpage-sizes",[137],"Google page-size guide",[14,2061,2062],{},"The guide, last updated October 16, 2026, is the newer source, so I'd plan around February 1, 2027 and check Play Console for any warning on your own app.",[14,2064,2065],{},"Google's guide also explains why: devices with more memory are moving to 16 KB pages, and without recompiling, apps won't work on 16 KB devices in future Android releases. On a 16 KB device today, an app with 4 KB-aligned .so files that are stored uncompressed in the APK can run in a backcompat mode that shows a warning when it first launches.",[302,2067,2069],{"id":2068},"who-is-affected","Who is affected",[14,2071,2072,2073,2076,2077,2080,2081,2084,2085,2088],{},"Only apps with native code: ",[21,2074,2075],{},".so"," files in the APK's ",[21,2078,2079],{},"lib"," folder. That includes apps that use native code through an SDK or library, not just apps you wrote C or C++ for. In my experience, every Flutter Android release build has native libraries in that folder: ",[21,2082,2083],{},"libflutter.so"," for the engine and ",[21,2086,2087],{},"libapp.so"," for your compiled Dart code. Analyze APK, below, shows them.",[40,2090,2092],{"id":2091},"check-your-app","Check your app",[14,2094,2095],{},"Google's guide lists three checks:",[1179,2097,2098,2107,2115],{},[823,2099,2100,2103,2104,2106],{},[17,2101,2102],{},"Analyze APK in Android Studio."," Open Build > Analyze APK, pick the APK and look in the ",[21,2105,2079],{}," folder. The Alignment column shows warnings for files with alignment problems.",[823,2108,2109,2114],{},[17,2110,2111],{},[21,2112,2113],{},"check_elf_alignment.sh"," on Linux or macOS. Run it on the APK. It reports whether each library is aligned.",[823,2116,2117,2122,2123],{},[17,2118,2119],{},[21,2120,2121],{},"zipalign"," for zip alignment. Google's example uses the copy in build-tools 35.0.0:",[320,2124,2128],{"className":2125,"code":2126,"language":2127,"meta":325,"style":325},"language-console shiki shiki-themes github-light github-dark","zipalign -v -c -P 16 4 APK_NAME.apk\n","console",[21,2129,2130],{"__ignoreMap":325},[329,2131,2132],{"class":331,"line":332},[329,2133,2126],{},[40,2135,2137],{"id":2136},"fix-it","Fix it",[14,2139,2140,2141,169,2144,2147],{},"Google's shortcut: if you update to ",[17,2142,2143],{},"AGP 8.5.1 or higher",[17,2145,2146],{},"NDK r28 or higher",", and your prebuilt dependencies are 16 KB compatible, the app is 16 KB compatible by default.",[48,2149,2150,2160],{},[51,2151,2152],{},[54,2153,2154,2157],{},[57,2155,2156],{},"If you're on",[57,2158,2159],{},"Google's guidance",[64,2161,2162,2174,2181,2195],{},[54,2163,2164,2167],{},[69,2165,2166],{},"AGP below 8.5.1",[69,2168,2169,2170,2173],{},"Upgrade to 8.5.1 or higher. Google notes that with AGP 8.3 to 8.5, an app can seem to work but fail to install when Play builds it from a bundle. If you can't upgrade, Google gives a ",[21,2171,2172],{},"useLegacyPackaging"," setting",[54,2175,2176,2178],{},[69,2177,2146],{},[69,2179,2180],{},"Compiles 16 KB-aligned by default",[54,2182,2183,2186],{},[69,2184,2185],{},"NDK r27 or lower",[69,2187,2188,2189,169,2192],{},"Add the linker flags ",[21,2190,2191],{},"-Wl,-z,max-page-size=16384",[21,2193,2194],{},"-Wl,-z,common-page-size=16384",[54,2196,2197,2203],{},[69,2198,2199,2200,2202],{},"Prebuilt ",[21,2201,2075],{}," files from an SDK",[69,2204,2205],{},"Get a 16 KB-compatible version from the vendor, or recompile them the same way",[40,2207,2209],{"id":2208},"flutter-apps","Flutter apps",[48,2211,2212,2226],{},[51,2213,2214],{},[54,2215,2216,2219],{},[57,2217,2218],{},"Flutter version",[57,2220,2221,2222,2225],{},"Default ",[21,2223,2224],{},"ndkVersion"," in Flutter's source",[64,2227,2228,2236],{},[54,2229,2230,2233],{},[69,2231,2232],{},"3.35 (August 14, 2025)",[69,2234,2235],{},"27.0.12077973 (NDK r27)",[54,2237,2238,2243],{},[69,2239,2240],{},[17,2241,2242],{},"3.38 (November 12, 2025)",[69,2244,2245],{},[17,2246,2247],{},"28.2.13676358 (NDK r28)",[14,2249,2250],{},"Flutter's 3.38 post calls upgrading \"essential preparation\" for the 16 KB requirement and says NDK r28 is the minimum for the alignment.",[14,2252,2253],{},"What to do in a Flutter app:",[1179,2255,2256,2267,2278,2287],{},[823,2257,2258,2261,2262,362,2264,2266],{},[17,2259,2260],{},"Upgrade Flutter to 3.38 or later",", or set ",[21,2263,2224],{},[21,2265,390],{}," to an r28 version if you can't upgrade yet. My advice: upgrading is safer, because Flutter's 3.38 post lists a set of Gradle, AGP and Kotlin versions that Flutter tested together.",[823,2268,2269,362,2272,2274,2275,2277],{},[17,2270,2271],{},"Check the AGP version",[21,2273,842],{}," (or the ",[21,2276,874],{}," block on older projects). It needs to be 8.5.1 or higher.",[823,2279,2280,2283,2284,2286],{},[17,2281,2282],{},"Update plugins that ship native libraries."," My advice: after building, run Analyze APK and look at every ",[21,2285,2075],{}," file. A plugin with an old prebuilt library is the usual reason an app still fails after the Flutter upgrade.",[823,2288,2289,2292],{},[17,2290,2291],{},"Test on a 16 KB emulator."," Google's guide covers Android 15 emulator images with 16 KB page sizes. My advice: install a build there and make sure it starts without the compatibility warning.",[14,2294,2295,2296,2299,2300,2303,2304,139],{},"If the Flutter upgrade breaks the Android build first, see the ",[133,2297,2298],{"href":578},"v1 embedding fix"," and the ",[133,2301,2302],{"href":573},"Gradle plugin fix",". Google Play also requires new apps and updates to target API 36 since August 31, 2026: see ",[133,2305,2307],{"href":2306},"\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026\u002F","the target API 36 guide",[14,2309,2310,2311,139],{},"For every other dated Apple, Google Play and Firebase requirement in 2026 and 2027, see ",[133,2312,2314],{"href":2313},"\u002Fblog\u002Fapp-store-google-play-deadlines-2026-2027\u002F","App Store and Google Play deadlines for 2026 and 2027",[40,2316,588],{"id":587},[14,2318,2319,2320,596,2322,139],{},"If Play Console flags your app for 16 KB page sizes, or an update fails after the fix, the ",[133,2321,595],{"href":594},[133,2323,600],{"href":599},[602,2325,604],{},{"title":325,"searchDepth":338,"depth":338,"links":2327},[2328,2331,2332,2333,2334],{"id":2009,"depth":338,"text":2010,"children":2329},[2330],{"id":2068,"depth":424,"text":2069},{"id":2091,"depth":338,"text":2092},{"id":2136,"depth":338,"text":2137},{"id":2208,"depth":338,"text":2209},{"id":587,"depth":338,"text":588},"2026-10-18T23:58:00.000Z","Google Play requires apps targeting Android 15 and higher to support 16 KB memory page sizes on 64-bit devices, and Google says that from February 1, 2027 updates without it can't be released. How to check an APK, the AGP and NDK versions that fix it, and why Flutter 3.38 matters, from Google's and Flutter's docs checked October 18, 2026.",[2338,2341,2344,2347,2350],{"question":2339,"answer":2340},"What is the Google Play 16 KB page size requirement?","Google says all apps targeting Android 15 (API level 35) and higher must support 16 KB memory page sizes on 64-bit devices on Google Play, and that starting February 1, 2027, app updates that don't support 16 KB page sizes can't be released.",{"question":2342,"answer":2343},"Does my Flutter app need to change for 16 KB pages?","In my experience Flutter apps ship native libraries, so they are in scope. Flutter's 3.38 release notes say 3.38 moved the default NDK to r28, the minimum Flutter names for 16 KB alignment. On an older Flutter, upgrade, or set a newer ndkVersion, and check every plugin that ships its own native libraries.",{"question":2345,"answer":2346},"How do I check whether my APK supports 16 KB pages?","Google lists three ways: Android Studio's Analyze APK shows alignment warnings for .so files in the lib folder, the check_elf_alignment.sh script checks ELF alignment on Linux or macOS, and zipalign -v -c -P 16 4 checks zip alignment.",{"question":2348,"answer":2349},"Which AGP and NDK versions do I need?","Google says AGP 8.5.1 or higher and NDK r28 or higher make an app 16 KB compatible by default, as long as prebuilt dependencies are 16 KB compatible too. With NDK r27 or lower, Google gives linker flags to set a 16 KB max page size.",{"question":2351,"answer":2352},"What happened to the November 1, 2025 date?","Google's May 2025 Android Developers Blog post said that from November 1, 2025, new apps and updates targeting Android 15+ must support 16 KB pages. Google's page-size guide, last updated October 16, 2026, says that starting February 1, 2027, updates without 16 KB support can't be released. Check Play Console for the dates that apply to your app.",{"readingTimeStats":2354},{"text":1316,"minutes":2355,"time":2356,"words":2357},4.155,249300,831,"\u002Fblog\u002Fgoogle-play-16kb-page-size-flutter-android-2026","16 kb page size",[2361,2362,2363],"google-play-target-api-36-android-16-requirement-2026","play-billing-library-7-deprecated-update-to-8-2026","flutter-uiscene-migration-xcode-27-app-wont-launch-2026",{"title":1988,"description":2336},[2366,2368,2370,2373,2376,2379],{"title":2367,"url":2057},"Android Developers, Support 16 KB page sizes (last updated October 16, 2026)",{"title":2369,"url":2038},"Android Developers Blog, \"Prepare your apps for Google Play's 16 KB page size compatibility requirement\" (May 2025)",{"title":2371,"url":2372},"Flutter blog, What's new in Flutter 3.38","https:\u002F\u002Fflutter.dev\u002Fblog\u002Fwhats-new-in-flutter-3-38",{"title":2374,"url":2375},"Flutter on GitHub, FlutterExtension.kt at 3.35.0 (default ndkVersion)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.35.0\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fsrc\u002Fmain\u002Fkotlin\u002FFlutterExtension.kt",{"title":2377,"url":2378},"Flutter on GitHub, FlutterExtension.kt at 3.38.0 (default ndkVersion)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.38.0\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fsrc\u002Fmain\u002Fkotlin\u002FFlutterExtension.kt",{"title":675,"url":258},"blog\u002Fgoogle-play-16kb-page-size-flutter-android-2026","16 kb page size, google play 16 kb page size requirement, flutter 16kb page size, android 15 16 kb, ndk r28 16 kb alignment, agp 8.5.1 16 kb, check_elf_alignment, zipalign -P 16, play console 16 kb warning, 16 kb backcompat mode",[2383,2384,2385,2386,2387],"Google Play requires apps targeting Android 15 (API level 35) and higher to support 16 KB memory page sizes on 64-bit devices. Google says that starting February 1, 2027, updates that don't support 16 KB page sizes can't be released.","Only apps with native code are affected: .so files inside the APK. In my experience every Flutter Android release build ships native libraries, so Flutter apps are in scope.","Google says apps built with AGP 8.5.1 or higher and NDK r28 or higher, with 16 KB-compatible prebuilt dependencies, are 16 KB compatible by default.","Flutter 3.38 (November 12, 2025) moved the default NDK to r28, which Flutter calls the minimum for 16 KB alignment. Flutter 3.35 still defaulted to NDK r27.","On a 16 KB device, an app with 4 KB-aligned .so files that are stored uncompressed in the APK can run in a backcompat mode that shows a warning on first launch. Google says that without recompiling, apps won't work on 16 KB devices in future Android releases.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fgoogle-play-16kb-page-size-flutter-android-2026\u002F","Q4yP_WaO0s4z2zw5eaIjBxdZxv8DjpsUFupe3q9g5rg",[2391,2393,2394,2397,2398,2401],{"keyword":5,"url":684,"title":5,"relevance":2392},75,{"keyword":689,"url":1349,"title":689,"relevance":488},{"keyword":2395,"url":2396,"title":2395,"relevance":488},"Flutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F",{"keyword":1353,"url":1984,"title":1353,"relevance":482},{"keyword":2399,"url":2400,"title":2399,"relevance":459},"JCenter Shutdown: Fixing Old Android and Flutter Builds","https:\u002F\u002Fapp369.com\u002Fblog\u002Fjcenter-bintray-shut-down-fix-android-flutter-builds-2026\u002F",{"keyword":1988,"url":2388,"title":1988,"relevance":454},1792368231869]