
بطور خلاصه و مفید کارش بیلد گرفتنه و تبدیل کد های ما به یک برنامه قابل اجرا مثل APK که حالا این گریدل میاد فایل های build.gradle که توی ورژن کاتلینی و جدیدا فلاتر هم ورژن کاتلینی استفاده میکنه به نام build.gradle.kts هست، حالا گفته میشه (گوگل میگه) که برای خوانایی و برسی زمانی کامپایل بهتر و همچنین محیط های برنامه نویسی بهتر ساپورت میکنن
بعضی از پروژه های فلاتری قدیمی هستن که از build.gradle و settings.gradle استفاده میکنن و حالا میخوان که با ورژن جدید فلاتر برنامه شون رو اجرا و بیلد بگیرن که این تجربه خودمم بوده.
هنگام اجرا به یکسری خطا ها میخورن که یه همچین خطایی هست
"Deprecated imperative apply of Flutter Gradle plugins | Flutter"
که رفرنس میده به سایت داکیومنت فلاتر که میگه آقاجان build.gradle دیپریکیت شده بیا و آپدیت بشو به kts
آپدیت کردن build.gradle به build.gradle.kts
خب در android/build.gradle یه همچین چیزی داریم
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 }
یه فایل build.gradle.kts در پوشه اندروید بسازید و توش اینو بنویسید
allprojects { repositories { google() mavenCentral() } } val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() rootProject.layout.buildDirectory.value(newBuildDir) subprojects { val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) project.layout.buildDirectory.value(newSubprojectBuildDir) } subprojects { project.evaluationDependsOn(":app") } tasks.register<Delete>("clean") { delete(rootProject.layout.buildDirectory) }
خب تا اینجا build.gradle.kts مون ساخته شده بریم برای settings.gradle.kts
حالا نوبت به settings.gradle رسیده که معمولا توش مقادیر زیر هست
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 } settings.ext.flutterSdkPath = flutterSdkPath() includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") plugins { id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false } } include ":app" apply from: "${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle"
حالا یک فایل settings.gradle.kts رو در پوشه اندروید ایجاد کرده و مقادیر زیر رو اضافه میکنیم
pluginManagement { val flutterSdkPath = run { val properties = java.util.Properties() file("local.properties").inputStream().use { properties.load(it) } val flutterSdkPath = properties.getProperty("flutter.sdk") require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } 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 "8.9.1" apply false id("org.jetbrains.kotlin.android") version "2.1.20" apply false } include(":app")
نکات قابل توجه
حالا می رسیم به آپدیت کردن android/app/build.gradle به android/app/build.gradle.kts
توی android/app/build.gradle یه همچین چیزی هست
plugins { id "com.android.application" id "kotlin-android" id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } .... // یه سری چیزا android { namespace "com.example.[project]" compileSdkVersion 34 ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = JavaVersion.VERSION_1_8 } sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { applicationId "com.example.[project]" minSdkVersion 21 targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } signingConfigs { release { ... } } buildTypes { release { ... } } } flutter { source '../..' }
dependencies {}
وقشته فایل build.gradle.kts خودمون رو توی پوشه اندروید/اپ بسازیم و مقادیر زیر رو وارد کنیم
plugins { id("com.android.application") id("kotlin-android") id("dev.flutter.flutter-gradle-plugin") } android { namespace = "com.example.[project]" compileSdk = flutter.compileSdkVersion ndkVersion = "29.0.13113456" compileOptions { sourceCompatibility = JavaVersion.VERSION_23 targetCompatibility = JavaVersion.VERSION_23 isCoreLibraryDesugaringEnabled = true } kotlinOptions { jvmTarget = JavaVersion.VERSION_23.toString() } defaultConfig { applicationId = "com.example.[project]" minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName multiDexEnabled = true } buildTypes { release { ... } } } dependencies { ... } flutter { source = "../.." }
نکاتش رو هم بگم
اولین نکته اینه که اندروید استودیو بصورت پیش فرض از جاوا ورژن 21 استفاده میکنه در زمان نوشتن من. و آخرین ورژنی که وجود داره 24 هست، خب من اومدم با ورژن 24 امتحان کنم دیدم که با کاتلین ورژن آخر کانفیلیکت میخوره (یا به عبارتی به ارور برخوردم) اومدم و از ورژن قبل تر یعنی 23 استفاده کردم که در ادامه روش نصب و ست کردن JDK رو در ادامه میگم
خب برای ست کردن ورژن 23 مقادیر که در بالا مشاهده میکنید رو ست میکنیم در کامپایل آپشن
sourceCompatibility = JavaVersion.VERSION_23 targetCompatibility = JavaVersion.VERSION_23
و jvmTarget
jvmTarget = JavaVersion.VERSION_23.toString()
خب بریم که ورژن 23 جاوا رو نصب کنیم
از سایت اوراکل میایم جاوای 23 رو که نسخه exe یا msi رو دانلود میکنم و نصب لوکیشن پیشفرض C:\Program Files\Java\jdk-23 هست و همین رو با کد زیر به فلاتر میفهمونیم که آقا جاوا اینجا هست و از این جاوا استفاده کن
flutter config --jdk-dir "C:\Program Files\Java\jdk-23"
و برای اینکه اثر کنه میگه که یکبار ترمینال یا سی ام دی رو ببند و دوباره باز کن
و تا اینجا کار تقریبا 90 درصد کار رفته و فقط میمونه استفاده از آخرین ورژن گریدل
برای اینکه از نسخه آخر گریدل استفاده کنیم نیازه یه سر به وبسایت گریدل بزنیم که برای من درحال حاضر آخرین نسخه گریدل 8.13 هست و ورژن رو کافیه در فایل gradle-wrapper.properties عوض کنیم یعنی این خط کد رو عوض کنیم
distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip
فقط ورژن رو تغییر بدید یعنی میتونید توی کد بالا بجای 8.13 بنویسید مثلا 8.14
و آخرین نکته اینکه میتونید سازگاری ورژن کاتلین و جاوا رو از وبسایت گریدل ببینید و متناسب با آن ورژن های دیگه رو هم تطابق بدید
امیدوارم تونسته باشم مشکل گریدل رو برای فلاتری ها حل کرده باشم
منابع من برای این نوشته
فیلم حل مشکل گریدل در فلاتر توسط کامیونیتی فلاتر فارسی
عدنان کمالی | Adnan Kamali