How to change Android minSdkVersion in flutter project

AndroidFlutterAndroid Sdk-Tools

Android Problem Overview


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?

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

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
}

Solution 3 - Android

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

Solution 4 - Android

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"
}

Solution 5 - Android

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.

Solution 6 - Android

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
  }
}

Solution 7 - Android

If your app requires a specific minimum version of the Android platform, you can specify that version requirement as API level settings in the app's build.gradle file. During the build process, these settings are merged into your app's manifest file. Specifying API level requirements ensures that your app can only be installed on devices that are running a compatible version of the Android platform.

You have to do set minSdkVersion in build.gradle file, located in <app dir>/android/app and set a value in the defaultConfig block:

There are two API level settings available:

  • minSdkVersion — The minimum version of the Android platform on which the app will run, specified by the platform's API level identifier.
  • targetSdkVersion — Specifies the API level on which the app is designed to run. In some cases, this allows the app to use manifest elements or behaviors defined in the target API level, rather than being restricted to using only those defined for the minimum API level.

To specify default API level requirements in a build.gradle file, add one or more of the settings above to the defaultConfig {} block, nested inside the android {} block. You can also override these default values for different versions of your app by adding the settings to build types or product flavors. The following build.gradle file specifies default minSdkVersion and targetSdkVersion settings in the defaultConfig {} block and overrides minSdkVersion for one product flavor.

android {
   compileSdkVersion 29

  ...
  defaultConfig {
    applicationId "com.app.yourapp"
    minSdkVersion 16
    targetSdkVersion 29
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
  }
  productFlavors {
    main {
      ...
    }
    afterLollipop {
      ...
      minSdkVersion 21
    }
  }
}

For more information, see the uses-sdk-element manifest element documentation and the API Levels document.

Solution 8 - Android

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
    }

Solution 9 - Android

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

Solution 10 - Android

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

Solution 11 - Android

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.

Solution 12 - Android

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

Solution 13 - Android

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 }

Solution 14 - Android

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 (flutterMinSdkVersion == null) {
    flutterMinSdkVersion = '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.

Solution 15 - Android

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

Solution 16 - Android

Solution 17 - Android

first run flutter clean

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMaldusView Question on Stackoverflow
Solution 1 - AndroidMaldusView Answer on Stackoverflow
Solution 2 - AndroidJahidul IslamView Answer on Stackoverflow
Solution 3 - AndroidFrancis Nduba NumbiView Answer on Stackoverflow
Solution 4 - AndroidRoger CuestaView Answer on Stackoverflow
Solution 5 - AndroidMr RandomView Answer on Stackoverflow
Solution 6 - AndroiddphansView Answer on Stackoverflow
Solution 7 - AndroidParesh MangukiyaView Answer on Stackoverflow
Solution 8 - AndroidUmair AfzalView Answer on Stackoverflow
Solution 9 - AndroidAizan SagheerView Answer on Stackoverflow
Solution 10 - AndroidKenpachi ZarakiView Answer on Stackoverflow
Solution 11 - AndroidSayed Mahmood SayediView Answer on Stackoverflow
Solution 12 - AndroidApoorv PandeyView Answer on Stackoverflow
Solution 13 - Androiduser18722626View Answer on Stackoverflow
Solution 14 - AndroidGelidGeorgeView Answer on Stackoverflow
Solution 15 - AndroidMalith HashendreView Answer on Stackoverflow
Solution 16 - AndroidMusfiq ShantaView Answer on Stackoverflow
Solution 17 - AndroidDanial HussainView Answer on Stackoverflow