408

I was trying to start a flutter project for an App using Bluetooth to communicate. For that, I was using flutter blue.

Unfortunately, when trying to run (on an Android device) the first example I created I was met with the following error:

FAILURE: Build failed with an exception.

  * What went wrong:
  Execution failed for task ':app:processDebugManifest'.
  > Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:flutter_blue] /home/maldus/Projects/flutter/polmac/build/flutter_blue/intermediates/manifests/full/debug/AndroidManifest.xml as the library might be using APIs not available in 16
    Suggestion: use a compatible library with a minSdk of at most 16,
            or increase this project's minSdk version to at least 19,
            or use tools:overrideLibrary="com.pauldemarco.flutterblue" to force usage (may lead to runtime failures)

If I were on Android Studio, I'd know how to bump up the Android minSdkVersion, but on a Flutter project (using VSCode) I was a little lost.

Is it possible to increase the minSdkVersion with Flutter, and how?

2

30 Answers 30

526

It is indeed possible to increase minSdkVersion, but it took me way too much time to find it out because google searches mostly yields as result discussions about the absolute minimum Sdk version flutter should be able to support, not how to increase it in your own project.

Like in an Android Studio project, you have to edit the build.gradle file. In a flutter project, it is found at the path ./android/app/build.gradle.

The parameter that needs to be changed is, of course, minSdkVersion 16, bumping it up to what you need (in this case 19).

defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
    applicationId "com.example.projectname"
    minSdkVersion 19 //*** This is the part that needs to be changed, previously was 16
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

Seems obvious now, but took me long enough to figure it out on my own.

6
  • 29
    The file-path was very helpful! I was looking at the build.gradle file under android/ and couldn't figure out for the life of me how to get this minSdkVersion to be updated.
    – Adam
    Commented May 12, 2019 at 5:17
  • 2
    What if I do not want to change the minSdkVersion as I want to target the lower SDK versions? @Maldus
    – pblead26
    Commented Jun 18, 2019 at 19:57
  • 1
    Then don't change it? I'm not sure I understand the question, I hit this issue because flutterblue did not work without changing the minSDKVersion. If you want to use flutterblue with a lower SDK version I'm afraid that's a problem of the flutter library.
    – Maldus
    Commented Jun 20, 2019 at 13:06
  • 3
    Using this approach is not a good idea! The answers from Francis Nduba & (Mr Random & Jahidul Islam) provide two good approaches. Approach from (Mr Random & Jahidul Islam) should be used when you want to override the minSdkVersion for a particular project only and want to keep the default minSdkVersion unchanged. The approach from Francis Nduba should be used when you want to use a particular minSdkVersion for all of your flutter projects. Generally, you should not change the default flutter minSdkVersion for all projects unless required by any of your packages/features.
    – irshukhan
    Commented Jan 28, 2022 at 7:08
  • 1
    Check out this article to update mindSdkVersion in flutter Commented Jun 6, 2022 at 8:56
300

Flutter 2.8 or Later

build.gradle update

Before Updating to Flutter 2.8

android {
    compileSdkVersion 30

defaultConfig {
    applicationId "com.example.app"
    minSdkVersion 21
    targetSdkVersion 30
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    multiDexEnabled true
}

After updating to Flutter 2.8:

android {
    compileSdkVersion flutter.compileSdkVersion

defaultConfig {
        applicationId "com.example.app"
        minSdkVersion flutter.minSdkVersion
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

You should change from local.properties following instruction:

  1. First go to the android->local.properties

enter image description here

  1. And changes from here

enter image description here

  1. Change like this from build.gradle
android {
    compileSdkVersion localProperties.getProperty('flutter.compileSdkVersion').toInteger()

defaultConfig {
    minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
    targetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger()
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}
10
  • 2
    do you know why it doesn't appear while i created new project?
    – Karin
    Commented Dec 17, 2021 at 2:33
  • Actually, it is generated by default, but if you don't get in the android folder then create it manually. Commented Dec 17, 2021 at 5:49
  • 2
    It's not working for me
    – A.A
    Commented Dec 20, 2021 at 8:51
  • 6
    you cant directly read flutter.minSdkVersion use localProperties.getProperty('flutter.minSdkVersion') check out my answer stackoverflow.com/questions/52060516/…
    – Mr Random
    Commented Dec 22, 2021 at 16:17
  • 88
    local.properties file is normally not under source control. So I don't think is a good place where to have important non-local config like this. Commented Feb 10, 2022 at 8:38
186

If you didn't know, Google Playstore only allows minSdkVersion to be 20 or above. But flutter has still set default minSdkVersion to 16. Can you see that you'll be always obliged to manually change for each new project?

All your suggestions above are good, but they are not the best, because you will be forced to temper with the build.gradle for each new project you create.

The best way is to modify the value of the global minSdkVersion variable from its source, so all projects, new or old, will adopt it. Remember flutter.minSdkVersion means that the variable is in flutter directory (with the sdk).

The file in question is flutter.gradle.

the address is flutter-directory/packages/flutter_tools/gradle/flutter.gradle

class FlutterExtension {
    /** Sets the compileSdkVersion used by default in Flutter app projects. */
    static int compileSdkVersion = 31

    /** Sets the minSdkVersion used by default in Flutter app projects. */
    static int minSdkVersion = 16

    /** Sets the targetSdkVersion used by default in Flutter app projects. */
    static int targetSdkVersion = 31

change the value of the minSdkVersion from 16 to 20 or above, and do not disturb the code in build.gradle.

If you want, you can watch a video I made on Youtube, explaining it under: flutter configure minSdkVersion from 16 to 20 or above

=======================

UPDATED RESPONSE DUE TO CHANGES WITH FLUTTER 3.13 AND ABOVE

With this version forward, the content of this file flutter-directory/packages/flutter_tools/gradle/flutter.gradle has been moved to this new location flutter-directory/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy. And the default minSdkVersion = 19. But for the sake of being safe with the latest packages and android devices, it is better to set it at minSdkVersion = 20.

19
  • 10
    Thanks @Francis Nduba Numbi, this is by far the best answer. That way I don't have to make changes on every individual project. My approach is to always target higher versions by default and only do backward compatibility for certain projects.
    – paulobunga
    Commented Jan 8, 2022 at 15:05
  • 2
    Thank you. You can vote as the best answer and close it. it will very much help. Commented Jan 8, 2022 at 23:30
  • 11
    I would argue that you should change the build.gradle file. Changing the global variable only affects your own system, so if someone else on your team (or a CI/CD pipeline) clones the project, they will have trouble building it.
    – Jani
    Commented Jan 20, 2022 at 7:05
  • 58
    I'm sorry, this is an extremely bad answer. You shouldn't be changing the source of the tool if you want to change the project. This means a project in source control doesn't have its own build info defined (it won't compile the same on different computers), that EVERY project on one's computer will be using that version, and that upgrading Flutter will break it. The tool should be independent of the project. To be clear: this should NOT BE DONE under ANY CIRCUMSTANCE no matter how "easy" it looks. Anyone wanting to pin their build to a specific version should edit build.gradle directly.
    – zeh
    Commented Mar 10, 2022 at 3:52
  • 12
    I do not recommend using this answer. This should be set at the project level Commented Apr 20, 2022 at 1:47
69

For flutter v2.8

Inside local.properties add

sdk.dir='<path>'
flutter.sdk='<path>'
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1

flutter.minSdkVersion=21
flutter.targetSdkVersion=30
flutter.compileSdkVersion=30

app-level build.gradle

defaultConfig {
    minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
    targetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger()
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}

Now you can use localProperties.getProperty() to read the value from the properties file.

48

You can change the minSdkVersion in the file Project_Name/android/app/build.gradle , defaultconfig :

defaultConfig {
    // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
    applicationId "com.example.projectname"
    minSdkVersion 16 // <--- There
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
1
  • error: defaultConfig() not such method.
    – eastwater
    Commented May 3 at 19:24
43

Here the detailed solution for changing MinSdk /Minsdk version error, follow the steps.

Add following lines on android\local.properties

sdk.dir=
flutter.sdk=C:\\flutter
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1

flutter.minSdkVersion=21
flutter.targetSdkVersion=31
flutter.compileSdkVersion=31

android\local.properties

Delete existing lines and paste it on app level build.gradle: android\app\build.gradle

       defaultConfig {
        applicationId "app-id"

        minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()
        targetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger()
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
}

enter image description here

1
  • not working. defaultConfig {} not recognized.
    – eastwater
    Commented May 3 at 19:27
37

With the new Flutter projects (2.8.0), with the 'Flutter style', you able to change minimum sdk version in local.properties (instead of editing app/build.gradle file).

# android/local.properties

flutter.minSdkVersion=19

Look in android/app/build.gradle file, you'll see the variable constraint like this:

# android/app/build.gradle

android {

  defaultConfig {
    minSdkVersion flutter.minSdkVersion
    targetSdkVersion flutter.targetSdkVersion
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
  }
}
2
  • 3
    do we need to create it manually?
    – Karin
    Commented Dec 17, 2021 at 2:50
  • Yes, local.properties ignored by .gitignore by default, you should create one if not exists.
    – dphans
    Commented Jul 3, 2023 at 10:36
26

Add the following lines to android/local.properties file:

flutter.versionCode=1
flutter.versionName=0.0.1
flutter.flutterMinSdkVersion=24
flutter.flutterTargetSdkVersion=31

Add the following lines at the top-level in the file may be after "def versionName =" in the file android/app/build.gradle:

def flutterMinSdkVersion = localProperties.getProperty('flutter.flutterMinSdkVersion')
if (flutterMinSdkVersion == null) {
    flutterMinSdkVersion = '16'
}

def flutterTargetSdkVersion = localProperties.getProperty('flutter.flutterTargetSdkVersion')
if (flutterTargetSdkVersion == null) {
    flutterTargetSdkVersion = '31'
}

finally edit the section of the build.gradle that match as follows:

    defaultConfig {
        applicationId "do.main.subdomain" // Use your App ID
        minSdkVersion flutterMinSdkVersion.toInteger()
        targetSdkVersion flutterTargetSdkVersion.toInteger()
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

Once all this is done you are good to go. Next time you want to update something you only have to change one file.

2
  • 3
    This is absolutely the correct answer. Applying defaults for when local.properites are null. local.properites is not the correct place to put build versions and is just asking for trouble unless your testing for a specific release.
    – Emile
    Commented Nov 4, 2022 at 10:40
  • 1
    Agree - best answer.
    – Sneg
    Commented Nov 20, 2022 at 14:32
17

For flutter version 3.x.x on MacBook M series chips,

File for minSdkVersion to change is

/flutter/packages/flutter_tools/gradle/src/main/groovy.flutter.groovy
  • Change minSdkVersion to at least 21.
  • Currently, compileSdkVersion should be at least 35
/** Sets the compileSdkVersion used by default in Flutter app projects. */
    static int compileSdkVersion = 35

/** Sets the minSdkVersion used by default in Flutter app projects. */
    static int minSdkVersion = 21

/** Sets the targetSdkVersion used by default in Flutter app projects. */
    static int targetSdkVersion = 35

16

All answers are best. But the following way is best in changing SdkVersion after Flutter 2.8 :

Go to your root directory where flutter is installed. It should be like

C:\src\flutter\flutter

Then go to

packages>Flutter tools>gradle>

In Gradle, you will see many files, locate flutter.gradle . Right-click on it and edit it with text editor/notepad.

here you will find all SDK versions. Change them, save, and then you are ready to go

the complete path should be like this: (in my case)

C:\src\flutter\flutter\packages\flutter_tools\gradle

In the image you can see SDKs

2
  • 2
    I was looking for this one, thanks! Commented Sep 22, 2022 at 21:14
  • Hello @Aizan Sagheer Commented Feb 2 at 10:51
11

This is how I approached when I got this issue recently:

Inside <your-project>/android/app/build.gradle

Find android -> defaultConfig -> minSdkVersion and replace it with

minSdkVersion Math.max(flutter.minSdkVersion, 21)

21 here can be replaced by whatever minimum version you would want.

In case flutter start supporting 23 or some other higher version as the minimum version and you decide to upgrade flutter for your project, it would still work.

6

Follow these steps to change the minSdkVersion problem.

First=> YouProject_name/android/app/build.gradle

Second=> defaultconfig { //you can find it inside build.gradle }

defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.umair.product_details_using_crud"
        minSdkVersion 16 // here you can change minSdkVersison
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }
6
    **android/local.properties**
flutter.versionCode=1
flutter.minSdkVersion=21
flutter.targetSdkVersion=30
flutter.compileSdkVersion=31

  **android/app/build.gradle**
minSdkVersion localProperties.getProperty('flutter.minSdkVersion').toInteger()

targetSdkVersion localProperties.getProperty('flutter.targetSdkVersion').toInteger()
versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
4

I found the best way to fix this so it performs globally across all of your future apps as well is by changing the setting in the flutter.gradle file located in your default build section. If you're using VSCode

  1. go to this location (or the location you've installed flutter) C:\src\flutter\packages\flutter_tools\gradle\
  2. drag the flutter.gradle file into VSCode
  3. update the min, compile, and/or target versions
  4. save
3

In build.gradle you'll find the below

android {
   ...
    compileSdkVersion flutter.compileSdkVersion
    ...

You could replace flutter.compileSdkVersion with a hard coded number, or read it from a property file, as many others have suggested.

However, you could change the variable flutter.compileSdkVersion itself. This is located in the file flutter.groovy, located in your flutter SDK directory, subdirectory packages\flutter_tools\gradle\src\main\groovy. For example: C:\dev\flutter\packages\flutter_tools\gradle\src\main\groovy

In this file, you'll find:

class FlutterExtension {
    /** Sets the compileSdkVersion used by default in Flutter app projects. */
    static int compileSdkVersion = 33

    /** Sets the minSdkVersion used by default in Flutter app projects. */
    static int minSdkVersion = 21

    /** Sets the targetSdkVersion used by default in Flutter app projects. */
    static int targetSdkVersion = 33

Change these variables in the value you need.

3

Flutter version 3.16 (and may be greater)

If you can't find minSdk, compileSdk or targerSDK and all you see is

targetSdkVersion flutter.targetSdkVersion
minSdkVersion flutter.minSdkVersion
compileSdkVersion flutter.compileSdkVersion

Then you can go to where your flutter main folder is and from there

the address is flutter-directory/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy

0
1

I encountered this problem setting up Auth0, flutter_appauth and flutter_secure_storage within my flutter app. After changing the minSdkVersion version, I got this error

C:\Users\myusername\AndroidStudioProjects\wole\android\app\src\debug\AndroidManifest.xml Error:
    Attribute data@scheme at AndroidManifest.xml requires a placeholder substitution but no value for <appAuthRedirectScheme> is provided.
FAILURE: Build failed with an exception.
  • What went wrong: Execution failed for task ':app:processDebugManifest'.

Manifest merger failed : Attribute data@scheme at AndroidManifest.xml requires a placeholder substitution but no value for is provided.

The solution is adding manifestPlaceholders thus

view image

1

Setting minSdkVersion, targetSdkVersion, and compileSdkVersion are a little bit different starting from Flutter 2.8. Now the gradle file in your_flutter_app/android/app/build.gradle path looks like this:

enter image description here

Just replace the current values with the version numbers you want, like this:

enter image description here

Now run your flutter project, and that's it.

0
1

change local.properties file mentioned below.. because currently playstore update minimum target api version atleast 30

sdk.dir=/Users/sweetnandha/Library/Android/sdk
flutter.sdk=/Users/sweetnandha/FlutterDev/flutter
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1
flutter.compileSdkVersion=32
flutter.minSdkVersion=21
flutter.targetSdkVersion=32

enter image description here

or

enter image description here

1

The solution below was adopted to solve the problem without hard-coding the number of the SDK, but instead, creating a dedicated sdk.properties file for that, making it clear for the developers.

✅ The main difference from using local.properties is that the sdk.properties does not contain any user path, and can be tracked by the source code repository (git, svn).

  1. create a file sdk.properties with the content below, this file can be tracked in your source code repository (git, etc), see the screenshot for the file location:
flutter.minSdkVersion=30
flutter.targetSdkVersion=34
flutter.compileSdkVersion=34
  1. edit the app/build.grade and include this lines
def sdkProperties = new Properties()
def sdkPropertiesFile = rootProject.file('sdk.properties')
if (sdkPropertiesFile.exists()) {
    sdkPropertiesFile.withReader('UTF-8') { reader ->
        sdkProperties.load(reader)
    }
}
  1. now is possible to reference the values in other parts of the app/build.gradle, as other guys here suggested:
android {
    (...)
    compileSdkVersion sdkProperties.getProperty('flutter.compileSdkVersion').toInteger()
    defaultConfig {
        (...)
        minSdkVersion sdkProperties.getProperty('flutter.minSdkVersion').toInteger()
        targetSdkVersion sdkProperties.getProperty('flutter.targetSdkVersion').toInteger() 
    }
    (...)
}
  1. This way the SDK versions are now clear to the developer team, and will be always available with the project repository

enter image description here

0

It's found inside the defaultconfig on [project_name]/android/app/build.gradle. defaultconfig

0

app/build.gradle add this version code

0

you can find out that folder with which flutter ( on mac or linux ) or in windows you can look here https://stackoverflow.com/a/304447/8122500 . then you can follow guide from @francis-nduba-numbi .

there is 2 type to change from

  1. from flutter.gradle ( recommendation change here for not spesifc/for future )
  2. or direct from build.gradle ( not recommended )
0

Try this at android/app/build.gradle minSdkVersion 30 that should fix it but make sure you are at kotlin_version = '1.6.10' with your kotlin version.

0

Just update the version in flutter.groovy file

flutter\packages\flutter_tools\gradle\src\main\groovy\flutter.groovy

class FlutterExtension {

      /** Sets the compileSdkVersion used by default in Flutter app projects. */
      public final int compileSdkVersion = 34

      /** Sets the minSdkVersion used by default in Flutter app projects. */
      public  final int minSdkVersion = 23

}
-1

In the current version of flutter (2.10.4) you should change it by going into Flutter sdk folder/packages/open flutter_tools open /gradle then open flutter.gradle and find static int minSdkVersion and change as per requirement

e.g: C:\Workspace\flutter\packages\flutter_tools\gradle\flutter.gradle

This is what you'll see in the flutter.gradle file

-1

defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.map" minSdkVersion 19 targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName }

-2

if you would like to set as global.

here is, just simple run flutter doctor -v and you will get your sdk location

, i think override sdk version in every projects is not good in the future.

➜  ~ flutter doctor -v
[✓] Flutter (Channel stable, 3.0.5, on macOS 13.5 22G74 darwin-arm, locale en-ID)
    • Flutter version 3.0.5 at /Users/yogiarifwidodo/dev/flutter

first

➜  ~ cd /Users/yogiarifwidodo/dev/flutter/

then

➜  flutter git:(stable) ✗ cd packages/flutter_tools/gradle

last

nano flutter.gradle

editing

ctrl + w , then type `compileSdk`
modif your sdk number
then `ctrl + x`
then `y`
then enter to save
-4

first run flutter clean

then change the minSdkVersion in the file Project_Name/android/app/build.gradle , defaultconfig :

-4

Upgrade your compiled sdk version to 29 - higher

hope this will help you.

Not the answer you're looking for? Browse other questions tagged or ask your own question.