ویرگول
ورودثبت نام
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالیمن عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
خواندن ۵ دقیقه·۱۰ ماه پیش

سازگاری و اجرای فلاتر با آخرین نسخه گریدل

سازگاری گریدل با فلاتر
سازگاری گریدل با فلاتر

اصلا گریدل (Gradle) چیکار میکنه؟

بطور خلاصه و مفید کارش بیلد گرفتنه و تبدیل کد های ما به یک برنامه قابل اجرا مثل APK که حالا این گریدل میاد فایل های build.gradle که توی ورژن کاتلینی و جدیدا فلاتر هم ورژن کاتلینی استفاده میکنه به نام build.gradle.kts هست، حالا گفته میشه (گوگل میگه) که برای خوانایی و برسی زمانی کامپایل بهتر و همچنین محیط های برنامه نویسی بهتر ساپورت میکنن

  • یه نکته رو هم بگم اگر حوصله خوندن نداری یه لینک یوتیوب پایین گذاشتم میتونی از روی فیلم بری جلو
  • برای دانلود به گریدل حتما نیاز به فیلترشکن خواهید داشت

از 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 &quotorg.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&quot } } allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = &quot${rootProject.buildDir}/${project.name}&quot } subprojects { project.evaluationDependsOn(':app') } tasks.register(&quotclean&quot, Delete) { delete rootProject.buildDir }

یه فایل build.gradle.kts در پوشه اندروید بسازید و توش اینو بنویسید

allprojects { repositories { google() mavenCentral() } } val newBuildDir: Directory = rootProject.layout.buildDirectory.dir(&quot../../build&quot).get() rootProject.layout.buildDirectory.value(newBuildDir) subprojects { val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) project.layout.buildDirectory.value(newSubprojectBuildDir) } subprojects { project.evaluationDependsOn(&quot:app&quot) } tasks.register<Delete>(&quotclean&quot) { delete(rootProject.layout.buildDirectory) }

خب تا اینجا build.gradle.kts مون ساخته شده بریم برای settings.gradle.kts

حالا نوبت به settings.gradle رسیده که معمولا توش مقادیر زیر هست

pluginManagement { def flutterSdkPath = { def properties = new Properties() file(&quotlocal.properties&quot).withInputStream { properties.load(it) } def flutterSdkPath = properties.getProperty(&quotflutter.sdk&quot) assert flutterSdkPath != null, &quotflutter.sdk not set in local.properties&quot return flutterSdkPath } settings.ext.flutterSdkPath = flutterSdkPath() includeBuild(&quot${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle&quot) plugins { id &quotdev.flutter.flutter-gradle-plugin&quot version &quot1.0.0&quot apply false } } include &quot:app&quot apply from: &quot${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle/app_plugin_loader.gradle&quot

حالا یک فایل settings.gradle.kts رو در پوشه اندروید ایجاد کرده و مقادیر زیر رو اضافه میکنیم

pluginManagement { val flutterSdkPath = run { val properties = java.util.Properties() file(&quotlocal.properties&quot).inputStream().use { properties.load(it) } val flutterSdkPath = properties.getProperty(&quotflutter.sdk&quot) require(flutterSdkPath != null) { &quotflutter.sdk not set in local.properties&quot } flutterSdkPath } includeBuild(&quot$flutterSdkPath/packages/flutter_tools/gradle&quot) repositories { google() mavenCentral() gradlePluginPortal() } } plugins { id(&quotdev.flutter.flutter-plugin-loader&quot) version &quot1.0.0&quot id(&quotcom.android.application&quot) version &quot8.9.1&quot apply false id(&quotorg.jetbrains.kotlin.android&quot) version &quot2.1.20&quot apply false } include(&quot:app&quot)

نکات قابل توجه

  • توی قسمت plugins ما سه تا پلاگین دارم که با اولی کاری نداریم
    اما دوتای دیگه که مربوط به پلاگین گریدل هست (توجه کنید که اندروید پلاگین گریدل یا AGP) که آخرین نسخه ریلیز شده در تاریخی که من دارم اینو مینویسم "8.9.1" هست و میتونید ورژن هاش رو توی وبسایت اندروید دولوپر ببنید و آخرین نسخه رو قرار بدید و درمورد پلاگین کاتلین هم آخرین ورژنی که درحال حاضر هست "2.1.20" و برای مشاهده آخرین ورژن به وبسایت کاتلین بخش ریلیز آخرین ورژن رو قرار بدید


حالا می رسیم به آپدیت کردن android/app/build.gradle به android/app/build.gradle.kts

توی android/app/build.gradle یه همچین چیزی هست

plugins { id &quotcom.android.application&quot id &quotkotlin-android&quot id &quotdev.flutter.flutter-gradle-plugin&quot } def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } .... // یه سری چیزا android { namespace &quotcom.example.[project]&quot 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 &quotcom.example.[project]&quot minSdkVersion 21 targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } signingConfigs { release { ... } } buildTypes { release { ... } } } flutter { source '../..' }
dependencies {}


وقشته فایل build.gradle.kts خودمون رو توی پوشه اندروید/اپ بسازیم و مقادیر زیر رو وارد کنیم


plugins { id(&quotcom.android.application&quot) id(&quotkotlin-android&quot) id(&quotdev.flutter.flutter-gradle-plugin&quot) } android { namespace = &quotcom.example.[project]&quot compileSdk = flutter.compileSdkVersion ndkVersion = &quot29.0.13113456&quot compileOptions { sourceCompatibility = JavaVersion.VERSION_23 targetCompatibility = JavaVersion.VERSION_23 isCoreLibraryDesugaringEnabled = true } kotlinOptions { jvmTarget = JavaVersion.VERSION_23.toString() } defaultConfig { applicationId = &quotcom.example.[project]&quot minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName multiDexEnabled = true } buildTypes { release { ... } } } dependencies { ... } flutter { source = &quot../..&quot }

نکاتش رو هم بگم
اولین نکته اینه که اندروید استودیو بصورت پیش فرض از جاوا ورژن 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 &quotC:\Program Files\Java\jdk-23&quot

و برای اینکه اثر کنه میگه که یکبار ترمینال یا سی ام دی رو ببند و دوباره باز کن
و تا اینجا کار تقریبا 90 درصد کار رفته و فقط میمونه استفاده از آخرین ورژن گریدل

بروزرسانی گریدل به آخرین نسخه

برای اینکه از نسخه آخر گریدل استفاده کنیم نیازه یه سر به وبسایت گریدل بزنیم که برای من درحال حاضر آخرین نسخه گریدل 8.13 هست و ورژن رو کافیه در فایل gradle-wrapper.properties عوض کنیم یعنی این خط کد رو عوض کنیم

distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip

فقط ورژن رو تغییر بدید یعنی میتونید توی کد بالا بجای 8.13 بنویسید مثلا 8.14

و آخرین نکته اینکه میتونید سازگاری ورژن کاتلین و جاوا رو از وبسایت گریدل ببینید و متناسب با آن ورژن های دیگه رو هم تطابق بدید

امیدوارم تونسته باشم مشکل گریدل رو برای فلاتری ها حل کرده باشم


منابع من برای این نوشته

فیلم حل مشکل گریدل در فلاتر توسط کامیونیتی فلاتر فارسی

developer.android

docs.flutter.dev

doc.gradle.org

عدنان کمالی | Adnan Kamali

فلاترگریدل
۱
۰
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
من عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
شاید از این پست‌ها خوشتان بیاید