توسعه دهنده نِیتیوْ(Native) موبایل ( اندروید/آی او اس(کنارگذاشته شده)) Moeindeveloper.ir
گریدل پروژتو تمیز کن
چند وقتیه که کثیف بودن گریدلم خیلی رو اعصاب بوده و گریدل اکثر پروژه هام در بهترین حالت ممکن این شکلی بود:
و حالا با استفاده از Kotlin DSL میشه یکم مرتب ترش کرد:
نکته: دو اسکریپت بالا واسه دو پروژه مختلف هستن و ربطی به هم ندارن! اما پروسه تغییر به کاتلین DSL رو این پایین مینویسم.
برای اطلاعات بیشتر ارائه سنا عبادی رو در لاگ کت ببینید:
مرحله اول، ساخت پوشه buildSrc:
در root پروژه خودتون، پوشه buildSource رو به صورت زیر و با این ترتیب بنویسید:
بعد ساخت پوشه ابتدا پوشه سورس رو به ترتیب:
src -> main -> java
ایجاد کنید و فایل Dependencies.kt رو داخلش بسازید. بعد از این مرحله، گریدل اسکریپت خودتون رو داخل پوشه buildSrc ایجاد کنید:
build.gradle.kts:
import org.gradle.kotlin.dsl.`kotlin-dsl`
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}
حالا پروژه رو sync کنید و منتظر بمانید!
بعد از sync شدن پروژه، دو پوشه gradle و build به پوشه buildSrc اضافه میشه که اگه از ورژن کنترل(git) استفاده میکنید، بهتره که اونارو به gitignore اضافه کنید. به صورت دستی فایل گیت ایگنور رو اضافه کنید و به صورت زیر عمل کنید:
.gradle
/build
حالا نوبت اینه که پروژه اصلیمون رو به کاتلین DSL منتقل کنیم!
مرحله دوم، تغییر Settings به kts:
settings.gradle:
include ':app'
rootProject.name = "Stationery"
settings.gradle.kts:
include(":app")
rootProject.name = "Stationery"
پروژه رو Sync کنید.
مرحله سوم، تغییر فایل های build:
ابتدا فایل Dependencies رو به اینصورت بنویسید:
object Dependencies {
object Versions {
}
object DefaultConfig {
}
object Plugins {
}
object Libraries {
object Test {
}
}
object ClassPaths {
}
}
آبجکت Versions برای نگه داری نسخه ها، آبجکت DefaultConfig برای نگه داری کانفیگ گریدل app، آبجکت Plugins برای نگه داری پلاگین ها، آبجکت Libraries برای نگه داری کتابخونه ها و آبجکت Test برای نگه داری کتابخونه های تست، آبجکت ClassPaths برای نگه داری ClassPath های ما ?
اول ClassPath ها و ورژنای اونارو اضافه می کنیم:
object Versions {
const val gradle = "4.1.0"
const val kotlin = "1.4.10"
}
object ClassPaths {
const val gradle = "com.android.tools.build:gradle:${Versions.gradle}"
const val kotlin = "gradle-plugin"
}
بیلد گردیل ماژول پروژه رو ویرایش میکنیم:
build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = "1.3.72"
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle.kts:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
dependencies {
classpath(Dependencies.ClassPaths.gradle)
classpath(kotlin(Dependencies.ClassPaths.kotlin, version = Dependencies.Versions.kotlin))
classpath(Dependencies.ClassPaths.hilt)
classpath(Dependencies.ClassPaths.safeArgs)
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
tasks.register("clean",Delete::class){
delete(rootProject.buildDir)
}
حالا میرسیم به تغییر گریدل ماژول اپ، اول اطلاعاتی که لازم داریم رو داخل Dependencies که ساختیم اضافه میکنیم:
object Dependencies {
object Versions {
const val gradle = "4.1.0"
const val kotlin = "1.4.10"
const val coreKTX = "1.3.1"
const val appCompat = "1.2.0"
const val constraintLayout = "2.0.1"
const val legacySupport = "1.0.0"
const val espresso = "3.3.0"
const val jUnit = "4.13"
const val arch = "2.1.0"
const val concurrent = "1.1.0"
const val lifeCycle = "2.2.0"
const val hilt = "2.28-alpha"
const val hiltAndroid = "1.0.0-alpha02"
const val leakCanary = "2.4"
}
const val compileSdkVersion = 30
const val buildToolsVersion = "30.0.2"
object DefaultConfig {
const val applicationID = "ir.moeindeveloper.stationery"
const val minSdKVersion = 19
const val targetSdkVersion = 30
const val versionCode = 1
const val versionName = "1.0"
const val testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
object Plugins {
const val application = "com.android.application"
const val android = "android"
const val kotlinExtensions = "android.extensions"
const val kapt = "kapt"
const val hilt = "dagger.hilt.android.plugin"
const val safeArgs = "androidx.navigation.safeargs.kotlin"
}
object Libraries {
const val kotlin = "org.jetbrains.kotlin:kotlin-stdlib:${Versions.kotlin}"
const val coreKTX = "androidx.core:core-ktx:${Versions.coreKTX}"
const val appCompat = "androidx.appcompat:appcompat:${Versions.appCompat}"
const val constraintLayout = "androidx.constraintlayout:constraintlayout:${Versions.constraintLayout}"
const val legacySupport = "androidx.legacy:legacy-support-v4:${Versions.legacySupport}"
const val concurrent = "androidx.concurrent:concurrent-futures-ktx:${Versions.concurrent}"
const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-ktx:${Versions.lifeCycle}"
const val liveData = "androidx.lifecycle:lifecycle-livedata-ktx:${Versions.lifeCycle}"
const val lifeCycleCommon = "androidx.lifecycle:lifecycle-common-java8:${Versions.lifeCycle}"
const val activity = "androidx.activity:activity-ktx:${Versions.activity}"
const val hilt = "com.google.dagger:hilt-android:${Versions.hilt}"
const val hiltCompiler = "com.google.dagger:hilt-android-compiler:${Versions.hilt}"
const val hiltAndroid = "androidx.hilt:hilt-lifecycle-viewmodel:${Versions.hiltAndroid}"
const val leakCanary = "com.squareup.leakcanary:leakcanary-android:${Versions.leakCanary}"
object Test {
const val espressoContrib = "androidx.test.espresso:espresso-contrib:${Versions.espresso}"
const val espressoIntents = "androidx.test.espresso:espresso-intents:${Versions.espresso}"
const val espressoAccessibility = "androidx.test.espresso:espresso-accessibility:${Versions.espresso}"
const val espressoWeb = "androidx.test.espresso:espresso-web:${Versions.espresso}"
const val espressoIdlingConcurrent = "androidx.test.espresso.idling:idling-concurrent:${Versions.espresso}"
const val jUnit = "junit:junit:${Versions.jUnit}"
}
}
object ClassPaths {
const val gradle = "com.android.tools.build:gradle:${Versions.gradle}"
const val kotlin = "gradle-plugin"
const val hilt = "com.google.dagger:hilt-android-gradle-plugin:${Versions.hilt}"
const val safeArgs = "androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.navigation}"
}
}
خب حالا فایل گریدل ماژول اپ رو به کاتلین DSL تغییر میدیم:
build.gradle:
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "ir.moeindeveloper.stationery"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
قسمت پلاگین:
plugins {
id(Dependencies.Plugins.application)
kotlin(Dependencies.Plugins.android)
kotlin(Dependencies.Plugins.kotlinExtensions)
kotlin(Dependencies.Plugins.kapt)
id(Dependencies.Plugins.hilt)
id(Dependencies.Plugins.safeArgs)
}
برای پلاگین هایی که برا کاتلین هستن از kotlin استفاده می کنیم مثل kotlin-android و دیگه نیازی نیست که کاتلین رو اول عبارت بنویسیم و اینطوری کافیه:
const val android = "android"
قسمت اندروید:
android {
compileSdkVersion(Dependencies.compileSdkVersion)
buildToolsVersion(Dependencies.buildToolsVersion)
defaultConfig {
applicationId = Dependencies.DefaultConfig.applicationID
minSdkVersion(Dependencies.DefaultConfig.minSdKVersion)
targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion)
versionCode = Dependencies.DefaultConfig.versionCode
versionName = Dependencies.DefaultConfig.versionName
multiDexEnabled = true
testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
buildFeatures {
viewBinding = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
قسمت وابستگی ها:
dependencies {
implementation(Dependencies.Libraries.kotlin)
implementation(Dependencies.Libraries.coreKTX)
implementation(Dependencies.Libraries.appCompat)
implementation(Dependencies.Libraries.constraintLayout)
implementation(Dependencies.Libraries.legacySupport)
/*
arch components
*/
implementation(Dependencies.Libraries.concurrent)
implementation(Dependencies.Libraries.viewModel)
implementation(Dependencies.Libraries.liveData)
implementation(Dependencies.Libraries.lifeCycleCommon)
implementation(Dependencies.Libraries.activity)
/*
arch components
*/
/*
Hilt
*/
implementation(Dependencies.Libraries.hilt)
kapt(Dependencies.Libraries.hiltCompiler)
implementation(Dependencies.Libraries.hiltAndroid)
/*
Hilt
*/
debugImplementation(Dependencies.Libraries.leakCanary)
/*
Test libs
*/
androidTestImplementation(Dependencies.Libraries.Test.espressoCore)
androidTestImplementation(Dependencies.Libraries.Test.espressoContrib)
androidTestImplementation(Dependencies.Libraries.Test.espressoIntents)
androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility)
androidTestImplementation(Dependencies.Libraries.Test.espressoWeb)
androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent)
testImplementation(Dependencies.Libraries.Test.jUnit)
/*
Test libs
*/
}
build.gradle.kts:
plugins {
id(Dependencies.Plugins.application)
kotlin(Dependencies.Plugins.android)
kotlin(Dependencies.Plugins.kotlinExtensions)
kotlin(Dependencies.Plugins.kapt)
id(Dependencies.Plugins.hilt)
id(Dependencies.Plugins.safeArgs)
}
android {
compileSdkVersion(Dependencies.compileSdkVersion)
buildToolsVersion(Dependencies.buildToolsVersion)
defaultConfig {
applicationId = Dependencies.DefaultConfig.applicationID
minSdkVersion(Dependencies.DefaultConfig.minSdKVersion)
targetSdkVersion(Dependencies.DefaultConfig.targetSdkVersion)
versionCode = Dependencies.DefaultConfig.versionCode
versionName = Dependencies.DefaultConfig.versionName
multiDexEnabled = true
testInstrumentationRunner = Dependencies.DefaultConfig.testInstrumentationRunner
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
buildFeatures {
viewBinding = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
}
dependencies {
implementation(Dependencies.Libraries.kotlin)
implementation(Dependencies.Libraries.coreKTX)
implementation(Dependencies.Libraries.appCompat)
implementation(Dependencies.Libraries.constraintLayout)
implementation(Dependencies.Libraries.legacySupport)
/*
arch components
*/
implementation(Dependencies.Libraries.concurrent)
implementation(Dependencies.Libraries.viewModel)
implementation(Dependencies.Libraries.liveData)
implementation(Dependencies.Libraries.lifeCycleCommon)
implementation(Dependencies.Libraries.activity)
/*
arch components
*/
/*
Hilt
*/
implementation(Dependencies.Libraries.hilt)
kapt(Dependencies.Libraries.hiltCompiler)
implementation(Dependencies.Libraries.hiltAndroid)
/*
Hilt
*/
debugImplementation(Dependencies.Libraries.leakCanary)
/*
Test libs
*/
androidTestImplementation(Dependencies.Libraries.Test.espressoCore)
androidTestImplementation(Dependencies.Libraries.Test.espressoContrib)
androidTestImplementation(Dependencies.Libraries.Test.espressoIntents)
androidTestImplementation(Dependencies.Libraries.Test.espressoAccessibility)
androidTestImplementation(Dependencies.Libraries.Test.espressoWeb)
androidTestImplementation(Dependencies.Libraries.Test.espressoIdlingConcurrent)
testImplementation(Dependencies.Libraries.Test.jUnit)
/*
Test libs
*/
}
گریدل رو سینک کنید! کار شما تموم شد و گردیل شما مرتبه و هندل کردن اطلاعات آسون تر شده و به راحتی میتونید نسخه هارو تغییر بدید!
نکته مهم: چینش کانفیگ شما به این صورت کاری زمان بر و وقت گیره! برای راحتی کار از این پلاگین استفاده کنید:
اگه پیشنهادی، انتقادی یا سوالی داشتید در کامنت ها واسم بنویسید!
مطلبی دیگر از این انتشارات
چالش ساخت اپ اندروید برای گرفتن قیمت بلیت!
مطلبی دیگر از این انتشارات
پشتیبانی اپ های موبایلی
مطلبی دیگر از این انتشارات
لاگ گیری از ریکوئست های Retrofit