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