[Flutter] flutter.minSdkVersion のバージョン定義場所を確認する

Flutterで、Android版のアプリをビルドすると、利用するパッケージにより flutter.minSdkVersionで定義されているバージョンより高いバージョンを要求されることがあります。

下記のビルドエラーではflutter.minSdkVersionに設定されているバージョンが16(Android 4.1、4.1.1)で、package_info_plusが、minSdkVersion 19(Android 4.4) 以上を要求したため、必要なバージョンを満たさずエラーとなりました。

ビルドエラー
/Users/***/Documents/****/android/app/src/debug/AndroidManifest.xml Error:
	uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in library [:package_info_plus] /Users/***/Documents/***/build/package_info_plus/intermediates/merged_manifest/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="dev.fluttercommunity.plus.packageinfo" to force usage (may lead to runtime failures)

build.gradleファイル

flutter.minSdkVersionは、/android/app/src/build.gradleに記載されていますが、minSdkVersionのバージョン表記がflutter.minSdkVersionを参照しているため、いくつが設定されているのかが変わりません。

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

flutter.minSdkVersion はどこに?

実は、flutter.minSdkVersionのバージョンの記載は、flutter sdkのディレクトリ内flutter.gradleにハードコピーされています。

flutter/packages/flutter_tools/gradle/flutter.gradle

flutter.gradle
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import static groovy.io.FileType.FILES

import com.android.builder.model.AndroidProject
import com.android.build.OutputFile
import groovy.json.JsonSlurper
import java.nio.file.Path
import java.nio.file.Paths
import java.util.regex.Matcher
import java.util.regex.Pattern
import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.Plugin
import org.gradle.api.Task
import org.gradle.api.file.CopySpec
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.bundling.Jar
import org.gradle.internal.os.OperatingSystem
import org.gradle.util.VersionNumber

/** For apps only. Provides the flutter extension used in app/build.gradle.
 * The versions specified here should match the values used in
 * ../lib/src/android/gradle_utils.dart, so when bumping, make sure to update
 * the versions specified there.
*/
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 = 16

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

    /**
     * Sets the ndkVersion used by default in Flutter app projects.
     * Chosen as default version of the AGP version below as found in
     * https://developer.android.com/studio/projects/install-ndk#default-ndk-per-agp
     */
    static String ndkVersion = "23.1.7779620"

確認すると16(Android 4.1、4.1.1)が設定されていることが分かります。ここでflutter.gradleのコードを直接変更すると、SDKのアップデートのたびに変更が必要となり、好ましくありません。そのためdefaultConfigの定義を書き換えることが一番簡単な修正方法となります。下記の例では、minSdkVersion 23として、Android6.0以上を対象にしています。

build.gradle
defaultConfig {
    applicationId "com.example.untitled"
    minSdkVersion 23
    targetSdkVersion flutter.targetSdkVersion
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
}