В версии 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 такой подход может привести к невозможности нормальной работы. Разработчики должны будут выполнить миграцию вручную.
androidx
начали использовать JDK 21, но официальные версии AGP не корректно обрабатывали эту ситуацию, что приводило к ошибкам типа [D8 Cannot invoke "String.length()" because "<parameter1>
](https://juejin.cn/post/7418456558978039817).Начнём с JDK, чтобы проиллюстрировать роль JDK в сборке Android:
Затем давайте рассмотрим, какие версии JDK по умолчанию включены в различных версиях Android Studio:
Далее рассмотрим соответствие между версиями Android Studio и AGP:
Затем мы рассмотрим соответствие между версиями Java и Gradle:
И наконец, соответствие между версиями AGP и Gradle:
На этом этапе можно визуально понять, что версия Gradle связана с версией Java. Различные версии Android Studio по умолчанию используют различные версии JDK, поэтому при миграции вам потребуется определить:
Конечно, если вы используете только VSCode, а не Android Studio, то вам не придётся беспокоиться о версии Android Studio и встроенной JDK.
Далее следует вопрос о соответствии версий KGP, Kotlin и AGP, так как различные плагины и основной проект могут использовать разные версии Kotlin:
О соответствиях между KGP, Gradle и AGP:
Как видно, при выборе подходящей версии KGP лучше выбирать её в рамках подходящих версий AGP, чтобы избежать неожиданных ошибок компиляции.
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"
, вам также потребуется удалить эту зависимость:
Это миграция при условии использования минимальной конфигурации по умолчанию. Если вы все еще используете другие 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 {
applicationId "com.example.app"
minSdkVersion 21
targetSdkVersion 30
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
jvmTarget = "1.8"
release {
signingConfig signingConfigs.debug
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
```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 )