1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Flutter-KF.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Удаление командного плагина Flutter Gradle, вы перешли на старую конфигурацию Gradle?

В версии Flutter 3.29 официальное сообщество объявило о полной отмене плагина Flutter Gradle Apply, который был помечен как устаревший с версии 3.19. В будущем команда Flutter планирует преобразовать Flutter Gradle из Groovy в Kotlin и переместить его использование в общие API Android Gradle Plugin (AGP), что должно снизить частоту повреждений при выпуске новых версий AGP и уменьшить количество регрессий, связанных с процессом сборки.

Из этого можно сделать вывод, что команда Flutter также сталкивается с проблемами адаптации к обновлению AGP.

Поэтому если ваш проект был создан до версии 3.16 и ещё не перенесён, то в версии 3.29 он будет непосредственно затронут, например, если ранее у вас были предупреждения от Flutter Tools во время сборки проекта типа "Вы применяете основной плагин Gradle Flutter командным образом", то это указывает на необходимость миграции, так как в версии 3.29 такой подход может привести к невозможности нормальной работы. Разработчики должны будут выполнить миграцию вручную.

Соответствие различных версийСначала стоит отметить несколько дополнительных предварительных условий, которые не имеют прямого отношения к данной статье, но могут быть полезны при необходимости одновременной миграции и обновления. Если вам это не интересно, вы можете сразу перейти ко второму разделу. В контексте Android Gradle, обновление AGP является одной из самых сложных задач для разработчиков Android, поскольку она затрагивает множество аспектов, таких как JDK, Gradle, AGP, Kotlin, KGP (Kotlin Gradle Plugin) и даже версию Android Studio. А официальная версия Android Studio отметила свой десятилетний юбилей совсем недавно.> Например, ранее возникали проблемы, когда некоторые компоненты библиотеки androidx начали использовать JDK 21, но официальные версии AGP не корректно обрабатывали эту ситуацию, что приводило к ошибкам типа [D8 Cannot invoke "String.length()" because "<parameter1>](https://juejin.cn/post/7418456558978039817).

Начнём с JDK, чтобы проиллюстрировать роль JDK в сборке Android:

Затем давайте рассмотрим, какие версии JDK по умолчанию включены в различных версиях Android Studio:

  • Android Studio Ladybug (JDK 21)
  • Android Studio Koala
  • Android Studio Jellyfish
  • Android Studio Iguana
  • Android Studio Hedgehog
  • Android Studio Giraffe
  • Android Studio Flamingo (JDK 17)
  • Android Studio Electric Eel
  • Android Studio Dolphin
  • Android Studio Chipmunk
  • Android Studio Bumblebee
  • Android Studio Arctic Fox (JDK 11)

Далее рассмотрим соответствие между версиями Android Studio и AGP:

image2

Затем мы рассмотрим соответствие между версиями Java и Gradle:

image3

И наконец, соответствие между версиями AGP и Gradle:

image4

На этом этапе можно визуально понять, что версия Gradle связана с версией Java. Различные версии Android Studio по умолчанию используют различные версии JDK, поэтому при миграции вам потребуется определить:

  • Версию Android Studio;
  • Версию AGP;
  • Версию Gradle;
  • Версию JDK.Только если диапазоны этих четырёх версий совпадут, вы сможете минимизировать конфликты при переходе на новую версию. Кроме того, версия JDK, встроенная в Android Studio, может быть изменена вручную, вы можете скачать нужную версию JDK через настройки:image5

Конечно, если вы используете только VSCode, а не Android Studio, то вам не придётся беспокоиться о версии Android Studio и встроенной JDK.

Далее следует вопрос о соответствии версий KGP, Kotlin и AGP, так как различные плагины и основной проект могут использовать разные версии Kotlin:

image6

О соответствиях между KGP, Gradle и AGP:

image7

Как видно, при выборе подходящей версии KGP лучше выбирать её в рамках подходящих версий AGP, чтобы избежать неожиданных ошибок компиляции.

image8

МиграцияС версии Flutter 3.16 официально поддерживается использование объявленного блока плагинов {} (также известного как DSL плагинов) для применения плагинов с использованием Gradle. Этот DSL требует статического определения плагинов, что является одним из отличий механизма plugins {} от традиционного apply(). Например:

  • Блок plugins{} может использоваться только в файлах конфигурационных скриптов проекта build.gradle(.kts) и settings.gradle(.kts), причём он должен располагаться до всех других блоков и не может использоваться в скриптах плагинов или init-скриптах.
  • Блок plugins {} не поддерживает произвольный код; он должен быть без побочных эффектов и всегда генерировать одинаковый результат.
  • Блок plugins{} должен быть вершинным утверждением в скрипте сборки, то есть он не может быть вложен в другой контекст (например, в условие if или цикл for).

Поэтому при миграции нам сначала нужно найти значения используемых в проекте Android Gradle Plugin (AGP) и Kotlin, обычно они находятся в файле /android/build.gradle, в секции buildscript, например здесь указываются kotlin_version и com.android.tools.build:gradle.```groovy buildscript { ext.kotlin_version = '1.7.10' repositories { google() mavenCentral() }

dependencies {
    classpath 'com.android.tools.build:gradle:7.3.0'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}

}

allprojects { repositories { google() mavenCentral() } }

rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(':app') }

tasks.register("clean", Delete) { delete rootProject.buildDir }


Далее вам потребуется заменить содержимое файла `/android/settings.gradle` следующим образом, где `{agpVersion}` и `{kotlinVersion}` будут соответствовать тем значениям, что были указаны ранее:

```groovy
pluginManagement {
    def flutterSdkPath = {
        def properties = new Properties()
        file("local.properties").withInputStream { properties.load(it) }
        def flutterSdkPath = properties.getProperty("flutter.sdk")
        assert flutterSdkPath != null, "flutter.sdk not установлено в local.properties"
        return flutterSdkPath
    }()

    includeBuild("${flutterSdkPath}/packages/flutter_tools/gradle")

    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version "{agpVersion}" apply false
    id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
}

include ":app"

Если у вас есть еще какие-то параметры конфигурации, убедитесь, что вы поместите их после блока pluginManagement {} и plugins {}. Как было отмечено выше, Gradle требует, чтобы эти блоки располагались перед любыми другими.

Затем удалите весь блок buildscript из файла /android/build.gradle:

изображение

По умолчанию файл android/build.gradle должен выглядеть так:

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}
``````markdown
rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

tasks.register("clean", Delete) {
    delete rootProject.buildDir
}

Далее вам потребуется внести изменения в файл android/app/build.gradle, такие как удаление следующих двух блоков кода, использующих старый командный метод apply:

Затем снова добавьте соответствующие плагины, но теперь с использованием синтаксиса DSL плагинов, также в самом верху файла:

plugins {
    id "com.android.application"
    id "kotlin-android"
    id "dev.flutter.flutter-gradle-plugin"
}

Наконец, если ваш блок dependencies содержит зависимость от "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", вам также потребуется удалить эту зависимость:

image-20250212224117799

Это миграция при условии использования минимальной конфигурации по умолчанию. Если вы все еще используете другие classpath и модули apply, вам также потребуется их удалить:

Затем добавьте их в блок plugins файла android/settings.gradle:

plugins {
    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
    id "com.android.application" version "{agpVersion}" apply false
    id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
    // этот
    id "com.google.gms.google-services" version "4.4.0" apply false
    // этот
    id "com.google.firebase.crashlytics" version "2.9.9" apply false
}
```И добавьте их в файл `android/app/build.gradle`:

```groovy
plugins {
    id "com.android.application"
    id "dev.flutter.flutter-gradle-plugin"
    id "org.jetbrains.kotlin.android"
    // эти плагины
    id "com.google.gms.google-services"
    // и этот
    id "com.google.firebase.crashlytics"
}

Наконец, вот пример простой миграции в виде патча git diff:```diff diff --git a/android/app/build.gradle b/android/app/build.gradle --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,4 +1,4 @@ plugins {

  • id 'com.android.application'
  • id "com.android.application" id 'kotlin-android' } @@ -6,10 +6,6 @@ android { compileSdkVersion 30
  • defaultConfig {
  •    applicationId "com.example.app"
  •    minSdkVersion 21
  •    targetSdkVersion 30
  •    versionCode flutterVersionCode.toInteger()
  •    versionName flutterVersionName
  • }
  • compileOptions {
  •    sourceCompatibility JavaVersion.VERSION_1_8
  •    targetCompatibility JavaVersion.VERSION_1_8
  • }
  • kotlinOptions {
  •    jvmTarget = "1.8"
  • }
  • buildTypes {
  •    release {
  •        signingConfig signingConfigs.debug
  •        minifyEnabled true
  •        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  •    }
  • } } dependencies {
  • implementation platform('com.google.firebase:firebase-bom:28.0.0')
  • implementation 'com.google.firebase:firebase-analytics'
  • implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  • implementation "io.flutter:flutter-sdk:$flutter_version"
  • implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } \ No newline at end of file


```diff
Индекс: android/app/build.gradle
Дополнительная информация от IDEА:
Подсистема: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/android/app/build.gradle b/android/app/build.gradle
--- a/android/app/build.gradle	(ревизия 69dfe7ed0d762bfd35e470fc31d2aebf1e1690bf)
+++ b/android/app/build.gradle	(ревизия 1adf2a436b02e7af99121553eb67d7880ad91571)
@@ -1,3 +1,9 @@
+plugins {
+    id "com.android.application"
+    id "kotlin-android"
+    id "dev.flutter.flutter-gradle-plugin"
+}
+
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
если (localPropertiesFile.exists()) {
@@ -6,14 +12,6 @@
      }
  }
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-если (flutterRoot == null) {

``````markdown
- выбросить новую ошибку сборки("Flutter SDK не найден. Определите местоположение с помощью flutter.sdk в файле local.properties.")
 -
 - приложение плагин: 'com.android.application'
 - приложение плагин: 'kotlin-android'
 - приложение из: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
  приложение из: "exported.gradle"
   android {
 @@ -31,9 +29,9 @@
          // TODO: Укажите свой уникальный идентификатор приложения (https://developer.android.com/studio/build/application-id.html).
          applicationId "com.shuyu.gsygithub.gsygithubappflutter"
          minSdkVersion 21
 -        targetSdkVersion  Yöntem bulunamadı 31
 +        targetSdkVersion 33
          versionCode 54
 -        versionName "4. 0. 1"
 +        versionName "5. 0. 0"
          testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
      }
  @@ -70,9 +68,4 @@
      источник '.  . /.. '
  }
  - зависимости {
 -    реализация "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
 -    тестовая реализация 'junit:junit:4. 12'
 -    androidTestImplementation 'androidx.test:runner:1. 1. 1'
 -    androidTestImplementation 'androidx.test.espresso:espresso-core:3. 1. 1'
 -}
 + зависимости {}
 Индекс: android/build.gradle
 Дополнительная информация от IDEА:
 Подсистема: com.intellij.openapi.diff.impl.patch.CharsetEP
 <+>UTF-8
 ===================================================================
 diff --git a/android/build.gradle b/android/build.gradle
 --- a/android/build.gradle	(ревизия 69dfe7ed0d762bfd35e470fc31d2aebf1e1690bf)
 +++ b/android/build.gradle	(ревизия 1adf2a436b02e7af99121553eb67d7880ad91571)
 @@ -1,16 +1,3 @@
 - buildscript {
 -    ext.kotlin_version = '1. 8. 10'
 -    repositories {
 -        google()
 -        jcenter()
 -    }
 -
 -    dependencies {
 -        classpath "com.android.tools.build:gradle:7. 0. 3"
 -        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 -    }
 -}
 -
  allprojects {
      repositories {
          google()
 Index: android/settings.gradle
 IDEA additional info:
 Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
```CharsetEP
 <+>UTF-8
 ===================================================================
 diff --git a/android/settings.gradle b/android/settings.gradle
 --- a/android/settings.gradle	(revision 69dfe7ed0d762bfd35e470fc31d2aebf1e1690bf)
 +++ b/android/settings.gradle	(revision 1adf2a436b02e7af99121553eb67d7880ad91571)
 @@ -1,15 +1,25 @@
 -include ':app'
 +pluginManagement {
 +    def flutterSdkPath = {
 +        def properties = new Properties()
 +        file("local.properties").withInputStream { properties.load(it) }
 +        def flutterSdkPath = properties.getProperty("flutter.sdk")
 +        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
 +        return flutterSdkPath
 +    }()
 +    includeBuild("${flutterSdkPath}/packages/flutter_tools/gradle")
 +}
 +repositories {
 +    google()
 +    mavenCentral()
 +    gradlePluginPortal()
 +}
 +plugins {
 +    id 'dev.flutter.flutter-plugin-loader' version '1.0.0'
 +    id 'com.android.application' version '7.0.3' apply false
 +    id 'org.jetbrains.kotlin.android' version '1.8.10' apply false
 +}
 +include ':app'
 \ No newline at end of file# Ссылки для справки

- https://docs.flutter.dev/release/breaking-changes/flutter-gradle-plugin-apply

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master